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相关推荐

  1. Mybatis Plus启动注入 SQL 原理分析

    1) 问题: xxxMapper 继承了 BaseMapper<T>, BaseMapper 中提供了通用的 CRUD 方法, 方法来源于 BaseMapper, 有方法就必须有 SQL, ...

  2. MyBatis 入门到精通(二) SQL语句映射XML文件

    MyBatis 真正强大之处就在这些映射语句,也就是它的魔力所在.对于它的强大功能,SQL 映射文件的配置却非常简单. 如果您比较SQL 映射文件配置与JDBC 代码,您很快可以发现,使用SQL 映射 ...

  3. MP 启动注入 SQL 原理分析

    MP 启动注入 SQL 原理分析 文章目录 一.MybatisPlus需要sql语句吗? 解答:需要 1.1. 问题:为什么MybatisPlus看不到sql语句? 1.2. 分析:继承关系 1.3. ...

  4. mybatis使用拦截器显示sql,使用druid配置连接信息

    mybatis使用拦截器显示sql,使用druid配置连接信息 mybatis sql Druid 1.显示出sql内容: 新建2个类: MybatisInterceptor :拦截sql,并获得输出 ...

  5. 第 3 章 MybatisPlus 注入 SQL 原理分析

    第 3 章 MybatisPlus 注入 SQL 原理分析 思考问题 我们编写的 UserMapper 继承了 BaseMapper<T>,就拥有了基本的增删改查功能,这是因为 BaseM ...

  6. 使用mybatis的interceptor修改执行sql以及传入参数

    项目中途遇到业务需求更改,在查询某张表时需要增加条件,由于涉及的sql语句多而且依赖其他服务的jar,逐个修改sql语句和接口太繁杂.项目使用mybatis框架,因此借鉴PageHelper插件尝试使 ...

  7. Mybatis 批量插入报ORA-00933: SQL 命令未正确结束

    Mybatis 批量插入报ORA-00933: SQL 命令未正确结束 错误出现的场景是这样的,将多个月份的1000条数据分别插入到各月份表中. MySQL中,批量插入数据到表,会在一定程度提高效率. ...

  8. SQL注入(SQL注入(SQLi)攻击)攻击-注入点

    SQL注入被称为漏洞之王 , 是最常用的漏洞之一 , 其中PHP在这方面的贡献最大 SQL注入原理 用户在参数中插入恶意的SQL语句 , 破坏原有的SQL语法结构 , 从而执行攻击者的操作 SQL注入 ...

  9. SQL注入——SQL注入漏洞利用(零)(值得收藏)

    一.什么是SQL注入漏洞 攻击者利用Web应用程序对用户输入验证上的疏忽,在输入的数据中包含对某些数据库系 统有特殊意义的符号或命令,让攻击者有机会直接对后台数据库系统下达指令,进而实现对后 台数据库 ...

最新文章

  1. javascript 代码_如何使您JavaScript代码保持简单并提高其可读性
  2. intellij idea 和 myeclipse 转换
  3. Windows Phone 7 自定义控件库
  4. python 操作微信定时发信息
  5. 产品经理第一课上海站圆满结束,下一站你定!
  6. 深度案例 | 纷享销客:用户需求精准洞察下的敏捷开发
  7. win10改计算机用户名,win10系统修改本地账号用户名的操作方法
  8. SQLite快速入门
  9. Hadoop:hadoop fs、hadoop dfs与hdfs dfs命令的区别
  10. nginx php mysql zend_性能测试基本功 - 手动配置nginx+php-cgi+zend+mysql
  11. VB连接Mysql数据库
  12. 我的时时在线电脑(千脑)
  13. C#上位机与施耐德PLC通讯
  14. pyltp的使用教程
  15. 产品初探(一):面试经验记录
  16. 杭州电商java招聘_2021年IUU旅行 JAVA开发工程师J11179招聘-IUU旅行 JAVA开发工程师J11179招聘求职信息-拉勾招聘...
  17. 水杨酸-FITC | salicylic acid-FITC|荧光素标记水杨酸
  18. C/C++抽红包系统
  19. 关于无迹卡尔曼滤波(UKF)的权重
  20. 基于51单片机的智能门禁控制系统(仿真+源码+全套资料)

热门文章

  1. 信息论的产生与发展概况
  2. (转)用Excel编写小游戏
  3. 刚获得物理诺奖的数学家:现实是对完美数学真理的扭曲反应,人脑是最终量子计算机!...
  4. 如果你不想工作,建议你做这3件事
  5. 第五人格一直显示连接服务器失败什么意思,第五人格网络连接失败怎么办_第五人格网络连接失败解决办法_玩游戏网...
  6. 高性能MySQL学习——提高查询性能
  7. 长沙市实验中学G1907班在湖南省智慧教育装备展示体验中心开展暑假社会实践活动。
  8. 戴尔台式机7080MT(I7处理器英特尔10700)安装centos
  9. 谈谈面试题之什么是面向对象?谈谈你对面向对象的理解?
  10. 室内定位关键技术(indoor location)