文档开发者中心
我的

【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


二、逻辑删除

逻辑删除并不是真正从数据表开删除数据记录,只是通过一个字段去标识出这条记录被删除了,比如deleted,0表示未删除,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

--不要用肉体的勤奋,去掩盖思考的懒惰--



作者:把苹果v咬哭

原链接:https://www.cnblogs.com/pingguo-softwaretesting/p/14202063.html

点赞
收藏
回复
分享
举报
浏览717 发布于2021-01-05 02:43未知归属地
全部评论
最多点赞
最新发布
最早发布
暂无评论
暂无评论
写回答
新增插入模板功能
一键使用模板,快速填写内容,轻松发帖~
知道了
  • 为了保障您的信息安全,请勿上传您的敏感个人信息(如您的密码等信息)和您的敏感资产信息(如关键源代码、签名私钥、调试安装包、业务日志等信息),且您需自行承担由此产生的信息泄露等安全风险。
  • 如您发布的内容为转载内容,请注明内容来源。

我要发帖子

目录 收起
一、分页
二、逻辑删除
了解社区公约,与您携手共创和谐专业的开发者社区。