zoukankan      html  css  js  c++  java
  • 浅谈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);
        }
    }

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

  • 相关阅读:
    关于MFC消息的总结
    关于VS中包含库、附加包含库、
    关于MFC中重载函数是否调用基类相对应函数的问题
    关于子窗口处理自身消息而不扩散给父窗口的问题
    进程与线程理解-1
    程序设计思想-2
    线程与进程
    网路编程之socket与 socketserver、黏包
    网络编程之TCP协议与UDP协议
    网络编程基础
  • 原文地址:https://www.cnblogs.com/jayhou/p/9825443.html
Copyright © 2011-2022 走看看