自定义全局操作
- 根据 MybatisPlus 的 AutoSqlInjector 可以自定义各种你想要的 sql ,注入到全局中,相当于自定义 Mybatisplus 自动注入的方法。
- 之前需要在 xml 中进行配置的 SQL 语句,现在通过扩展 AutoSqlInjector 在加载 mybatis 环境时就注入。
1.1 AutoSqlInjector
- 在 Mapper 接口中定义相关的 CRUD 方法
- 扩展 AutoSqlInjector inject 方法,实现 Mapper 接口中方法要注入的 SQL
- 在 MP 全局策略中,配置 自定义注入器
2.1 自定义注入全表删除方法 deteleAll
2.1.1 自定义 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);
}
}
2.1.2 mapper.java 接口类需要申明使用方法 deleteAll
public interface EmployeeMapper extends BaseMapper<Employee> {
/**
* 自定义注入方法
*/
Integer deleteAll();
}
2.1.3 配置注入启动
<!-- 定义 MP 全局策略,安装集成文档部分结合 -->
<bean id="globalConfig" class="com.baomidou.mybatisplus.entity.GlobalConfiguration">
.....
<!-- 自定义注入 deleteAll 方法 -->
<property name="sqlInjector" ref="mySqlInjector" />
</bean>
<!-- 自定义注入器 -->
<bean id="mySqlInjector" class="com.don.mp.injector.MySqlInjector"/>
2.1.4 测试
/**
* 测试自定义全局操作
*/
@Test
public void testMySqlInjector() {
Integer result = employeeMapper.deleteAll();
System.out.println("result: " + result);
}
3.1 自定义注入器的应用之逻辑删除
com.baomidou.mybatisplus.mapper.LogicSqlInjector
- logicDeleteValue 逻辑删除全局值
- logicNotDeleteValue 逻辑未删除全局值
- 在 POJO 的逻辑删除字段 添加 @TableLogic 注解
- 会在 mp 自带查询和更新方法的 sql 后面,追加『逻辑删除字段』=『LogicNotDeleteValue默认值』 删除方法: deleteById()和其他 delete 方法, 底层 SQL 调用的是 update tbl_xxx set 『逻辑删除字段』=『logicDeleteValue 默认值』
3.1.1 全局配置注入LogicSqlInjector
Java Config方式:
@Bean
public GlobalConfiguration globalConfiguration() {
GlobalConfiguration conf = new GlobalConfiguration(new LogicSqlInjector());
conf.setLogicDeleteValue("-1");
conf.setLogicNotDeleteValue("1");
conf.setIdType(2);
return conf;
}
XML配置方式:
<bean id="globalConfig" class="com.baomidou.mybatisplus.entity.GlobalConfiguration">
<!-- 注入逻辑删除 -->
<property name="sqlInjector" ref="logicSqlInjector"/>
<!-- 注入逻辑删除全局值 -->
<property name="logicDeleteValue" value="-1"/>
<property name="logicNotDeleteValue" value="1"/>
<property name="idType" value="2" />
</bean>
<!-- 逻辑删除 -->
<bean id="logicSqlInjector" class="com.baomidou.mybatisplus.mapper.LogicSqlInjector"/>
修改逻辑删除实体
...
@TableLogic // 逻辑删除属性
private Integer logicFlag;
...
测试
/**
* 测试逻辑删除
*/
@Test
public void testLogicDelete() {
Integer result = userMapper.deleteById(1);
System.out.println("result:" + result);
User user = userMapper.selectById(1);
System.out.println(user);
}
结果
UPDATE tbl_user SET logic_flag=-1 WHERE id=?
3.1.2 Spring Boot配置
mybatis-plus:
mapper-locations: classpath:/mapper/*Mapper.xml
#实体扫描,多个package用逗号或者分号分隔
typeAliasesPackage: com.don.springboot.entity
typeEnumsPackage: com.don.springboot.entity.enums
global-config:
#主键类型 0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID";
id-type: 2
#字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断"
field-strategy: 2
db-column-underline: true
#逻辑删除配置
logic-delete-value: 0
logic-not-delete-value: 1
sql-injector: com.baomidou.mybatisplus.mapper.LogicSqlInjector