Mybatis-plus使用SqlInjector注入SQl
Mybatis-plus使用SqlInjector注入SQl
1.通过ISqlInjector接口找到AbstractSqlInjector抽象实现类,再找到DefaultSqlInjector类,它是mybatis-plus的SQL 默认注入器,如果项目使用的是逻辑删除,那么可能配置的是另外一个LogicSqlInjector,我们项目使用的是LogicSqlInjector。
2.发现里面有一个List getMethodList()方法,返回一个集合,集合里面的每一个AbstractMethod就是对Mybatis-plus对Mybatis进行扩展的Sql方法。
public class LogicSqlInjector extends AbstractSqlInjector {@Overridepublic List<AbstractMethod> getMethodList() {return Stream.of(new Insert(),new LogicDelete(),new LogicDeleteByMap(),new LogicDeleteById(),new LogicDeleteBatchByIds(),new LogicUpdate(),new LogicUpdateById(),new LogicSelectById(),new LogicSelectBatchByIds(),new LogicSelectByMap(),new LogicSelectOne(),new LogicSelectCount(),new LogicSelectMaps(),new LogicSelectMapsPage(),new LogicSelectObjs(),new LogicSelectList(),new LogicSelectPage()).collect(toList());}
}
3.本次我们想扩展的是一个能够根据id查询对象,不论对象是否已经被删除的方法findById(Integer id)
因此,我们模仿LogicSelectById编写一个类继承AbstractMethod
public class FindById extends AbstractMethod {@Overridepublic MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {SqlSource sqlSource = new RawSqlSource(configuration, String.format("SELECT %s FROM %s WHERE %s=#{%s}",sqlSelectColumns(tableInfo, false),tableInfo.getTableName(), tableInfo.getKeyColumn(), tableInfo.getKeyProperty()), Object.class);return this.addSelectMappedStatement(mapperClass, "findById", sqlSource, modelClass, tableInfo);}
}
4.为了将我们创建的FindById注入到Mybatis-plus中,我们编写一个类继承LogicSqlInjector,重写它的getMethodList()方法,将我们的FindById添加进去
public class MySqlInjector extends LogicSqlInjector {@Overridepublic List<AbstractMethod> getMethodList() {List<AbstractMethod> methodList = super.getMethodList();methodList.add(new FindById());return methodList;}
}
5.再Spring IOC中配置我们创建的Sql注入器,使之生效
@Beanpublic MySqlInjector mySqlInjector() {return new MySqlInjector();}
6.我们继承的Mybatis-plus默认接口BaseMapper中没有我们要使用的findById方法,所以我们编写一个接口MyBaseMapper,去继承BaseMapper接口,再将我们业务的Mapper去继承MyBaseMapper,这样我们的业务Mapper就有了findById方法了
public interface MyBaseMapper<T> extends BaseMapper<T> {T findById(Integer id);
}
public interface BaseClassMapper extends MyBaseMapper<BaseClass> {}
扩展:如果想在Service中也能使用findById方法,可以编写一个BaseService接口和BaseServiceImpl实现类,再将我们的业务Service去继承他们,这样再service中也可以使用了
public interface BaseService<T> extends IService<T> {T findById(Integer id);
}
public class BaseServiceImpl<M extends MyBaseMapper<T>, T> extends ServiceImpl<M, T> implements BaseService<T> {@Overridepublic T findById(Integer id) {return baseMapper.findById(id);}
}
Mybatis-plus使用SqlInjector注入SQl相关推荐
- Mybatis Plus启动注入 SQL 原理分析
1) 问题: xxxMapper 继承了 BaseMapper<T>, BaseMapper 中提供了通用的 CRUD 方法, 方法来源于 BaseMapper, 有方法就必须有 SQL, ...
- MyBatis 入门到精通(二) SQL语句映射XML文件
MyBatis 真正强大之处就在这些映射语句,也就是它的魔力所在.对于它的强大功能,SQL 映射文件的配置却非常简单. 如果您比较SQL 映射文件配置与JDBC 代码,您很快可以发现,使用SQL 映射 ...
- MP 启动注入 SQL 原理分析
MP 启动注入 SQL 原理分析 文章目录 一.MybatisPlus需要sql语句吗? 解答:需要 1.1. 问题:为什么MybatisPlus看不到sql语句? 1.2. 分析:继承关系 1.3. ...
- mybatis使用拦截器显示sql,使用druid配置连接信息
mybatis使用拦截器显示sql,使用druid配置连接信息 mybatis sql Druid 1.显示出sql内容: 新建2个类: MybatisInterceptor :拦截sql,并获得输出 ...
- 第 3 章 MybatisPlus 注入 SQL 原理分析
第 3 章 MybatisPlus 注入 SQL 原理分析 思考问题 我们编写的 UserMapper 继承了 BaseMapper<T>,就拥有了基本的增删改查功能,这是因为 BaseM ...
- 使用mybatis的interceptor修改执行sql以及传入参数
项目中途遇到业务需求更改,在查询某张表时需要增加条件,由于涉及的sql语句多而且依赖其他服务的jar,逐个修改sql语句和接口太繁杂.项目使用mybatis框架,因此借鉴PageHelper插件尝试使 ...
- Mybatis 批量插入报ORA-00933: SQL 命令未正确结束
Mybatis 批量插入报ORA-00933: SQL 命令未正确结束 错误出现的场景是这样的,将多个月份的1000条数据分别插入到各月份表中. MySQL中,批量插入数据到表,会在一定程度提高效率. ...
- SQL注入(SQL注入(SQLi)攻击)攻击-注入点
SQL注入被称为漏洞之王 , 是最常用的漏洞之一 , 其中PHP在这方面的贡献最大 SQL注入原理 用户在参数中插入恶意的SQL语句 , 破坏原有的SQL语法结构 , 从而执行攻击者的操作 SQL注入 ...
- SQL注入——SQL注入漏洞利用(零)(值得收藏)
一.什么是SQL注入漏洞 攻击者利用Web应用程序对用户输入验证上的疏忽,在输入的数据中包含对某些数据库系 统有特殊意义的符号或命令,让攻击者有机会直接对后台数据库系统下达指令,进而实现对后 台数据库 ...
最新文章
- javascript 代码_如何使您JavaScript代码保持简单并提高其可读性
- intellij idea 和 myeclipse 转换
- Windows Phone 7 自定义控件库
- python 操作微信定时发信息
- 产品经理第一课上海站圆满结束,下一站你定!
- 深度案例 | 纷享销客:用户需求精准洞察下的敏捷开发
- win10改计算机用户名,win10系统修改本地账号用户名的操作方法
- SQLite快速入门
- Hadoop:hadoop fs、hadoop dfs与hdfs dfs命令的区别
- nginx php mysql zend_性能测试基本功 - 手动配置nginx+php-cgi+zend+mysql
- VB连接Mysql数据库
- 我的时时在线电脑(千脑)
- C#上位机与施耐德PLC通讯
- pyltp的使用教程
- 产品初探(一):面试经验记录
- 杭州电商java招聘_2021年IUU旅行 JAVA开发工程师J11179招聘-IUU旅行 JAVA开发工程师J11179招聘求职信息-拉勾招聘...
- 水杨酸-FITC | salicylic acid-FITC|荧光素标记水杨酸
- C/C++抽红包系统
- 关于无迹卡尔曼滤波(UKF)的权重
- 基于51单片机的智能门禁控制系统(仿真+源码+全套资料)
热门文章
- 信息论的产生与发展概况
- (转)用Excel编写小游戏
- 刚获得物理诺奖的数学家:现实是对完美数学真理的扭曲反应,人脑是最终量子计算机!...
- 如果你不想工作,建议你做这3件事
- 第五人格一直显示连接服务器失败什么意思,第五人格网络连接失败怎么办_第五人格网络连接失败解决办法_玩游戏网...
- 高性能MySQL学习——提高查询性能
- 长沙市实验中学G1907班在湖南省智慧教育装备展示体验中心开展暑假社会实践活动。
- 戴尔台式机7080MT(I7处理器英特尔10700)安装centos
- 谈谈面试题之什么是面向对象?谈谈你对面向对象的理解?
- 室内定位关键技术(indoor location)