MyBatis-Plus篇-(六)自定义全局操作&(七)公共字段自动填充

六、自定义全局操作

AutoSqlInjector

  • 根据 MybatisPlus 的 AutoSqlInjector 可以自定义各种你想要的 sql ,注入到全局中,相当于自 定义 Mybatisplus 自动注入的方法
  • 之前需要在 xml 中进行配置的 SQL 语句,现在通过扩展 AutoSqlInjector 在加载 mybatis 环境 时就注入

使用步骤

  • 在 Mapper 接口中定义相关的 CRUD 方法
public interface EmployeeMapper extends BaseMapper<Employee> {
     
    int deleteAll();
}
  • 扩展 AutoSqlInjector inject 方法,实现 Mapper 接口中方法要注入的 SQL
/**
 * 自定义全局操作
 */
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);

    }
}
  • 在 MP 全局策略中,配置 自定义注入器

    
       ...
        
		<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 );
    }

MyBatis-Plus篇-(六)自定义全局操作&(七)公共字段自动填充_第1张图片

逻辑删除

假删除、逻辑删除: 并不会真正的从数据库中将数据删除掉,而是将当前被删除的这条数据 中的一个逻辑删除字段置为删除状态.

tbl_user logic_flag = 1 → -1

  • com.baomidou.mybatisplus.mapper.LogicSqlInjector
  • 在配置文件中注入LogicSqlInjector

    
       ...
        
		<property name="sqlInjector" ref="logicSqlInjector">property>
        
    bean>

	<bean id="logicSqlInjector" class="com.baomidou.mybatisplus.mapper.LogicSqlInjector">bean>
  • logicDeleteValue 逻辑删除全局值 和 logicNotDeleteValue 逻辑未删除全局值
 
    
      ...
        
        property>
        <property name="logicNotDeleteValue" value="1">property>

        <property name="sqlInjector" ref="logicSqlInjector">property>
    bean>

  • 在 POJO 的逻辑删除字段 添加 @TableLogic 注解
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);

    }

MyBatis-Plus篇-(六)自定义全局操作&(七)公共字段自动填充_第2张图片

七、 公共字段自动填充

使用场景:当我们插入或者修改数据是,我们希望有些字段没有值可以给他自动填充一个值

  • 注解填充字段 @TableFile(fill = FieldFill.INSERT)
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);
        }
    }

}
  • MP 全局注入 自定义公共字段填充处理器

    
       ...
        <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);
    }

MyBatis-Plus篇-(六)自定义全局操作&(七)公共字段自动填充_第3张图片

你可能感兴趣的:(SSM,#,MyBatis-Plus)