根据MybatisPlus 的 AutoSqlInjector可以自定义各种你想要的 sql ,注入到全局中,相当于自定义 Mybatisplus 自动注入的方法。之前需要在xml中进行配置 的 SQL语句,现在通过扩展 AutoSqlInjector 在加载 mybatis环境时就注入。
这种方式适合简单、全局式、批量式的业务。实际应用中如果MybatisPlus已经注入好的方法不能满足业务需要,更多还是使用xml方式实现自己的业务。
【1】自定义注入实现步骤
实现步骤如下:
- 在 Mapper接口中定义相关的 CRUD方法
- 扩展 AutoSqlInjector inject 方法,实现 Mapper接口中方法要注入的 SQL
- 在 MP全局策略中,配置 自定义注入器
① mapper中定义业务方法
如下所示:
public interface EmployeeMapper extends BaseMapper<Employee> { int deleteAll(); }
② 实现自己的MySqlInjector
如下所示:
/** * 自定义全局操作 */ public class MySqlInjector extends AutoSqlInjector{ /** * 扩展inject 方法,完成自定义全局操作 */ @Override public void inject(Configuration configuration, MapperBuilderAssistant builderAssistant, Class<?> mapperClass, Class<?> modelClass, TableInfo table) { //将EmployeeMapper中定义的deleteAll, 处理成对应的MappedStatement对象,加入到configuration对象中。 //注入的SQL语句 String sql = "delete from " +table.getTableName(); //注入的方法名 一定要与EmployeeMapper接口中的方法名一致 String method = "deleteAll" ; //构造SqlSource对象 SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass); //构造一个删除的MappedStatement this.addDeleteMappedStatement(mapperClass, method, sqlSource); } }
③ 把自定义的MySqlInjector 配置到全局策略中
如果是xml配置方式,实例如下:
<!-- 定义MybatisPlus的全局策略配置--> <bean id ="globalConfiguration" class="com.baomidou.mybatisplus.entity.GlobalConfiguration"> <!-- 在2.3版本以后,dbColumnUnderline 默认值就是true --> <property name="dbColumnUnderline" value="true"></property> <!-- Mysql 全局的主键策略 --> <property name="idType" value="0"></property> <!-- 全局的表前缀策略配置 --> <property name="tablePrefix" value="tbl_"></property> <!--注入自定义全局操作 --> <property name="sqlInjector" ref="mySqlInjector"></property> </bean> <!-- 定义自定义注入器 --> <bean id="mySqlInjector" class="com.jane.mp.injector.MySqlInjector"></bean>
【2】自定义注入器的应用之逻辑删除
什么是假删除、逻辑删除?
并不会真正的从数据库中将数据删除掉,而是将当前被删除的这条数据中的一个逻辑删除字段置为删除状态。MybatisPlus(mp)为我们内置了一个LogicSqlInjector来帮助我们实现逻辑删除功能。
TableFieldInfo中有如下两个字段:
在 POJO的逻辑删除字段 添加 @TableLogic
注解
则会在 mp自带查询和更新方法的 sql后面,追加『逻辑删除字段』 =『 LogicNotDeleteValue默认值』
而对删除方法,如 deleteById()和其他 delete方法 , 底层 SQL调用的是 update tbl_xxx set 『逻辑删除字段』 =『 logicDeleteValue默认值』
LogicNotDeleteValue默认值、logicDeleteValue默认值默认为空,但是可以在全局配置中进行设置如下所示:
<!-- 定义MybatisPlus的全局策略配置--> <bean id ="globalConfiguration" class="com.baomidou.mybatisplus.entity.GlobalConfiguration"> <!-- 在2.3版本以后,dbColumnUnderline 默认值就是true --> <property name="dbColumnUnderline" value="true"></property> <!-- Mysql 全局的主键策略 --> <!-- <property name="idType" value="0"></property> --> <!-- Oracle全局主键策略 --> <property name="idType" value="1"></property> <!-- 全局的表前缀策略配置 --> <property name="tablePrefix" value="tbl_"></property> <!-- 注入逻辑删除 --> <property name="sqlInjector" ref="logicSqlInjector"></property> <!-- 注入逻辑删除全局值 --> <property name="logicDeleteValue" value = "-1"></property> <property name="logicNotDeleteValue" value="1"></property> </bean> <!-- 逻辑删除 --> <bean id="logicSqlInjector" class="com.baomidou.mybatisplus.mapper.LogicSqlInjector"></bean>
查询操作实例如下:
Execute SQL: SELECT id, `name`, logic_flag AS logicFlag FROM tbl_user WHERE id=1 AND logic_flag=1]
删除操作实例如下:
Execute SQL: UPDATE tbl_user SET logic_flag=-1 WHERE id=1]