浅谈MyBatis-Plus学习之自定义全局操作及逻辑删除

Posted 虚心 热爱 提升

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅谈MyBatis-Plus学习之自定义全局操作及逻辑删除相关的知识,希望对你有一定的参考价值。

一、自定义全局操作介绍

MP中提供扩展AutoSqlInjector可以自定义各种想要的 sql ,注入到全局中,相当于自定义MP 自动注入的方法。
也就是说继承BaseMapper<T>接口时就带有的方法,在加载相应的配置环境时就会注入。

二、实现自定义全局操作如下

2.1、在实现的Mapper接口中定义方法

public interface EmployeeMapper extends BaseMapper<Employee> {
    
    /**
     * 自定义注入方法
     * @return
     */
    int deleteAll();
}

2.2、继承AutoSqlInjector,并重写内部的inject方法

public class DeleteAllInject extends AutoSqlInjector{
    @Override
    public void inject(Configuration configuration, MapperBuilderAssistant builderAssistant, Class<?> mapperClass,
            Class<?> modelClass, TableInfo table) {
        /**
         * 核心就是将sql语句和mapper接口中的方法进行映射
         * 封装成一个MapperStatement对象
         * 然后初始化时Configuration对象自动加载
         */
        String sql = "delete from " + table.getTableName();
        String method = "deleteAll";
        SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass);
        this.addDeleteMappedStatement(mapperClass, method, sqlSource);
    }
}

2.3、最后在将该Bean注入到全局配置策略中

    <!-- mybatis-plus全局配置策略 ,这样避免重复在每一个实体中使用注解进行配置-->
    <bean id="globalConfiguration" class="com.baomidou.mybatisplus.entity.GlobalConfiguration">
        <property name="dbColumnUnderline" value="true"></property>  <!-- 2.3版本后默认配置数据库下划线-->
        <!-- 指定数据库ID生成策略   0:数据库自增-->
        <property name="idType" value="0"></property>
        <!-- 指定数据库表前缀 -->
        <property name="tablePrefix" value="tbl_"></property>
        <!-- 注入全局配置方法 -->
        <property name="sqlInjector" ref="deleteAllInject"></property>
    </bean>
    
     <bean id="deleteAllInject" class="cn.hjj.mp.inject.DeleteAllInject"></bean>

2.4、测试代码如下

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:applicationContext.xml"})
public class TestAutoSqlInject {
    @Autowired
    private EmployeeMapper employeeMapper;
    
    @Test
    public void testDeleteAll() {
        employeeMapper.deleteAll();
    }
}

 

三、逻辑删除简介

逻辑删除:就是并不是真正的将数据从数据库中删除,因为数据是宝贵的。只是将数据库中的该删除的记录的逻辑删除字段设置为删除状态

四、实现逻辑删除操作如下

4.1、创建一个新的实体,并在对应的数据库中创建相应的表数据

注意标志字段要使用@TableLogic标识告诉MP知道哪个是标识字段

public class User {
     @TableId(type=IdType.AUTO)
     private Integer id;
     private String name;
     @TableLogic  //标志是一个逻辑标识符号
     private Integer deleteFlag;
         
         // get Methods
         // set Methods

4.2、在配置文件中进行配置相应的Bean以及参数

applicationContext.xml

    <!-- mybatis-plus全局配置策略 ,这样避免重复在每一个实体中使用注解进行配置-->
    <bean id="globalConfiguration" class="com.baomidou.mybatisplus.entity.GlobalConfiguration">
        <property name="dbColumnUnderline" value="true"></property>  <!-- 2.3版本后默认配置数据库下划线-->
        <!-- 指定数据库ID生成策略   0:数据库自增-->
        <property name="idType" value="0"></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 -->
    <bean id="logicSqlInjector" class="com.baomidou.mybatisplus.mapper.LogicSqlInjector"></bean>

4.3、测试代码如下

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:applicationContext.xml"})
public class TestLogicDelete {
    @Autowired
    private UserMapper userMapper;
    @Test
    public void testDelete() {
        Integer res = userMapper.deleteById(1);
        System.out.println("res: " + res);
    }
    
    @Test
    public void testSelect() {
        User user = userMapper.selectById(1);
        System.out.println("res: " + user);
    }
}

本质:会在进行删除和查询的时候的时候附带逻辑删除字段,删除操作其实是一个更新语句,将当前要删除的记录的逻辑状态更新为配置的“逻辑删除全局值”

以上是关于浅谈MyBatis-Plus学习之自定义全局操作及逻辑删除的主要内容,如果未能解决你的问题,请参考以下文章

浅谈MyBatis-Plus学习之ActiveRecord

浅谈MyBatis-Plus学习之插件扩展

浅谈MyBatis-Plus学习之公共字段自动填充

浅谈MyBatis-Plus学习之代码生成器

浅谈MyBatis-Plus学习之Oracle的主键Sequence设置

python学习之第十七天