- 根据 MybatisPlus 的 AutoSqlInjector 可以自定义各种你想要的 sql ,注入到全局中,相当于自 定义 Mybatisplus 自动注入的方法
- 之前需要在 xml 中进行配置的 SQL 语句,现在通过扩展 AutoSqlInjector 在加载 mybatis 环境 时就注入
使用步骤
public interface EmployeeMapper extends BaseMapper<Employee> {
int deleteAll();
}
/**
* 自定义全局操作
*/
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);
}
}
...
<property name="sqlInjector" ref="mySqlInjector">property>
bean>
<bean id="mySqlInjector" class="com.cvzhanshi.mp.injector.MySqlInjector">bean>
@Test
public void testMySqlInjector() {
Integer result = employeeMapper.deleteAll();
System.out.println("result: " +result );
}
假删除、逻辑删除: 并不会真正的从数据库中将数据删除掉,而是将当前被删除的这条数据 中的一个逻辑删除字段置为删除状态.
tbl_user logic_flag = 1 → -1
- com.baomidou.mybatisplus.mapper.LogicSqlInjector
...
<property name="sqlInjector" ref="logicSqlInjector">property>
bean>
<bean id="logicSqlInjector" class="com.baomidou.mybatisplus.mapper.LogicSqlInjector">bean>
...
property>
<property name="logicNotDeleteValue" value="1">property>
<property name="sqlInjector" ref="logicSqlInjector">property>
bean>
public class User{
private Integer id ;
private String name ;
@TableLogic // 逻辑删除属性
private Integer logicFlag ;
}
会在 mp 自带查询和更新方法的 sql 后面,追加『逻辑删除字段』=『LogicNotDeleteValue 默认值』 删除方法: deleteById()和其他 delete 方法, 底层 SQL 调用的是 update tbl_xxx set 『逻辑删除字段』=『logicDeleteValue 默认值』
/**
* 测试逻辑删除
*/
@Test
public void testLogicDelete() {
Integer result = userMapper.deleteById(1);
System.out.println("result:" +result );
User user = userMapper.selectById(1);
System.out.println(user);
}
使用场景:当我们插入或者修改数据是,我们希望有些字段没有值可以给他自动填充一个值
public class User {
private Integer id;
@TableField(fill= FieldFill.INSERT_UPDATE)
private String name;
...
}
需要实现 com.baomidou.mybatisplus.mapper.MetaObjectHandler接口
/**
* 自定义公共字段填充处理器
*/
public class MyMetaObjectHandler extends MetaObjectHandler {
/**
* 插入操作 自动填充
*/
@Override
public void insertFill(MetaObject metaObject) {
//获取到需要被填充的字段的值
Object fieldValue = getFieldValByName("name", metaObject);
if(fieldValue == null) {
System.out.println("*******插入操作 满足填充条件*********");
setFieldValByName("name", "insertCvzhanshi", metaObject);
}
}
/**
* 修改操作 自动填充
*/
@Override
public void updateFill(MetaObject metaObject) {
Object fieldValue = getFieldValByName("name", metaObject);
if(fieldValue == null) {
System.out.println("*******修改操作 满足填充条件*********");
setFieldValByName("updateCvzhanshi", "weiyh", metaObject);
}
}
}
...
<property name="metaObjectHandler" ref="myMetaObjectHandler">property>
bean>
<bean id="myMetaObjectHandler" class="com.cvzhanshi.mp.metaObjectHandler.MyMetaObjectHandler">bean>
@Test
public void testMetaObjectHandler() {
User user = new User();
//user.setName("Tom");
user.setId(5);
user.setLogicFlag(1);
userMapper.updateById(user);
}