• 【mybatis-plus】分页、逻辑删除


    【mybatis-plus】分页、逻辑删除

     

    通过mybatis-plus实现分页,也是很简单,插件大法。

    一、分页

    1、配置分页插件

    把分页的插件也配置到统一的配置类里:

    @Configuration
    // 配置扫描mapper的路径
    @MapperScan("com.pingguo.mpdemo.mapper")
    public class MpConfig {
    
        // 乐观锁插件
        @Bean
        public OptimisticLockerInterceptor optimisticLockerInterceptor() {
            return new OptimisticLockerInterceptor();
        }
    
       // 分页插件
        @Bean
        public PaginationInterceptor paginationInterceptor() {
            return new PaginationInterceptor();
        }
    }
    

    2、使用分页

    还是在测试类中增加测试方法,这里列了常用到的方法,后面配合前端页面做分页功能时候,都要用上。

        //  测试分页
        @Test
        void testPaging() {
            // 创建分页对象,current为当前页数,size为每页最大记录数
            Page<User> pageUser = new Page<>(1, 5);
    
            // 调用分页查询方法,传入分页对象-pageUser,wrapper是构造条件对象,这里暂时写null
            userMapper.selectPage(pageUser, null);
    
            System.out.println("当前页:"+ pageUser.getCurrent());
            System.out.println("当前页数据list集合:" + pageUser.getRecords());
            System.out.println("每页显示记录数:" + pageUser.getSize());
            System.out.println("总记录数:" + pageUser.getTotal());
            System.out.println("总页数:" + pageUser.getPages());
            System.out.println("是否有下一页:" + pageUser.hasNext());
            System.out.println("是否有上一页:" + pageUser.hasPrevious());
    
        }
    

    目前数据表共12条数据,运行一下,对比下结果:

    当前页:1
    当前页数据list集合:[User(id=2, name=修改名称222, age=19, email=pingguotest1@pingguo.com, createTime=Thu Dec 24 23:27:20 CST 2020, updateTime=Thu Dec 24 23:27:23 CST 2020, version=null), User(id=3, name=wesson3, age=20, email=pingguotest1@pingguo.com, createTime=Wed Dec 23 23:27:32 CST 2020, updateTime=Thu Dec 24 23:27:36 CST 2020, version=null), User(id=4, name=daxiong, age=22, email=pingguotest1@pingguo.com, createTime=null, updateTime=Fri Dec 25 00:55:02 CST 2020, version=null), User(id=5, name=wesson5, age=20, email=pingguotest1@pingguo.com, createTime=null, updateTime=null, version=null), User(id=1342322873243996161, name=李白6, age=66, email=laowang@123.com, createTime=Fri Dec 25 12:14:47 CST 2020, updateTime=Fri Dec 25 15:43:11 CST 2020, version=2)]
    每页显示记录数:5
    总记录数:12
    总页数:3
    是否有下一页:true
    是否有上一页:false
    

    二、逻辑删除

    逻辑删除并不是真正从数据表开删除数据记录,只是通过一个字段去标识出这条记录被删除了,比如deleted0表示未删除,1表示已删除。

    1、在数据表增加deleted字段。

    2、实体类添加注解@TableLogic

    在对应实体类里增加属性,并且加上@TableLogic注解。为了方便,我还加了自动填充。

    @Data
    public class User {
        @TableId(type = IdType.ID_WORKER)
        private Long id;
        private String name;
        ... ...
        @TableLogic   // 加上逻辑删除注解
        @TableField(fill = FieldFill.INSERT) //为了方便,加了自动填充
        private Integer deleted;
    }
    

    3、自动填充(非必须)

    自动填充的话,这里也需要增加:

    @Component //此注解表示 将其交给spring去管理
    public class MyMetaObjectHandler implements MetaObjectHandler {
        @Override
        public void insertFill(MetaObject metaObject) {
            this.setFieldValByName("createTime", new Date(), metaObject);
            this.setFieldValByName("updateTime", new Date(), metaObject);
            this.setFieldValByName("version", 0, metaObject); //为了第一次新增就设置版本值
            this.setFieldValByName("deleted", 0, metaObject); //新增数据就默认设置0
    
        }
    }
    

    4、application.properties 加入配置(非必须)

    这里默认情况下,删除是1,没删除是0。
    如果你想改成别的值,那么就要在application.properties 加入配置,换成你需要设置的值。

    mybatis-plus.global-config.db-config.logic-delete-value=100
    mybatis-plus.global-config.db-config.logic-not-delete-value=300
    

    5、配置插件

    @Configuration
    // 配置扫描mapper的路径
    @MapperScan("com.pingguo.mpdemo.mapper")
    public class MpConfig {
    
        // 乐观锁插件
        @Bean
        public OptimisticLockerInterceptor optimisticLockerInterceptor() {
            return new OptimisticLockerInterceptor();
        }
        ... ...
        // 逻辑删除
        @Bean
        public ISqlInjector sqlInjector() {
            return new LogicSqlInjector();
        }
    }
    

    6、试一试

    因为之前的数据,都没有值,我手动把id=2的设置了0,然后去删除id=2的数据。

    
         // 测试 逻辑删除
        @Test
         void testLogicDelete() {
    
            int result = userMapper.deleteById(2L);
            System.out.println(result);
        }
    

    可以看到执行的sql其实是个update

    JDBC Connection [HikariProxyConnection@2144912729 wrapping com.mysql.cj.jdbc.ConnectionImpl@44c13103] will not be managed by Spring
    ==>  Preparing: UPDATE user SET deleted=1 WHERE id=? AND deleted=0 
    ==> Parameters: 2(Long)
    <==    Updates: 1
    Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@10f19647]
    1
    

    成功更新。

    7、另外

    MP查询数据的时候会自动过滤掉被逻辑删除的数据的,不需要我们额外处理。
    执行查询试试:

        //    查询
        @Test
         void findAll() {
            List<User> users =  userMapper.selectList(null);
            System.out.println(users);
        }
    

    SELECT id,name,age,email,create_time,update_time,version,deleted FROM user WHERE deleted=0

     
  • 相关阅读:
    Java基础教程:多线程杂谈——双重检查锁与Volatile
    LeetCode:打印零与奇偶数【1116】
    Java基础教程:多线程基础(6)——信号量(Semaphore)
    LeetCode:交替打印【1115】
    做一件事情的3个关键指标:兴趣、能力和回报
    做一件事情的3个关键指标:兴趣、能力和回报
    Retry模式
    Java技术——String类为什么是不可变的
    2017战略No.2:开始电子化记账
    2017战略No.2:开始电子化记账
  • 原文地址:https://www.cnblogs.com/ma13461749958/p/14235446.html
Copyright © 2020-2023  润新知