【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条数据,运行一下,对比下结果:


1268169-20201228152821181-1294943456.png


当前页: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字段。


1268169-20201228153912370-437939274.png


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


成功更新。


1268169-20201228155617625-782819675.png


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


1268169-20201228155940666-2131865039.png

相关文章
|
4月前
|
SQL Java 数据库连接
MyBatis分页
MyBatis作为Java持久层框架,需结合数据库特性或插件实现分页。分页分为物理分页(如MySQL的LIMIT)和逻辑分页(内存截取),推荐使用PageHelper插件自动注入分页语句,提升开发效率与性能。需注意索引优化、深分页问题及多表关联时的兼容性,结合业务场景选择合适方案。
198 4
|
10月前
|
SQL Java 数据库连接
微服务——MyBatis分页
本文介绍了分页的多种实现方式,包括自带RowBounds分页、第三方插件PageHelper分页、SQL分页、数组分页及拦截器分页。其中,RowBounds是先查询全部结果再内存分页;PageHelper通过修改SQL动态添加分页关键字;SQL分页依赖数据库自身的分页功能如`LIMIT`;数组分页则是查询全量数据后用`subList`方法截取;拦截器分页则统一在SQL后添加分页语句。最后总结逻辑分页适合小数据量,但大数据量易内存溢出;物理分页虽小数据量效率较低,但更适合大数据场景,优先推荐使用。
147 0
|
10月前
|
SQL Oracle 关系型数据库
【YashanDB知识库】Mybatis-Plus调用YashanDB怎么设置分页
【YashanDB知识库】Mybatis-Plus调用YashanDB怎么设置分页
|
8月前
|
SQL Java 数据安全/隐私保护
发现问题:Mybatis-plus的分页总数为0,分页功能失效,以及多租户插件的使用。
总的来说,使用 Mybatis-plus 确实可以极大地方便我们的开发,但也需要我们理解其工作原理,掌握如何合适地使用各种插件。分页插件和多租户插件是其中典型,它们的运用可以让我们的代码更为简洁、高效,理解和掌握好它们的用法对我们的开发过程有着极其重要的意义。
824 15
|
11月前
|
XML SQL Java
十二、MyBatis分页插件
十二、MyBatis分页插件
360 17
|
11月前
|
监控 安全 数据库
【YashanDB 知识库】Mybatis-Plus 调用 YashanDB 怎么设置分页
数据库状态分为正常与异常两种情况。当出现异常时,首先查看告警列表确认问题(如实例无法连接),并尝试用数据库用户名和密码登录。若能登录,说明主实例故障已切换至备库;若无法登录或为单节点,则需进一步排查。接着检查监控项,若有数据表明主实例故障,无数据则可能是通信中断。随后检查主机上的服务是否存在,若存在但通信受限,需排查安全设置或网络;若服务不存在,可能因重启或断电导致,需手动启动相关服务。最终在YashanDB列表中确认状态恢复。
|
10月前
|
SQL Java 关系型数据库
MyBatis篇-分页
本文介绍了多种分页方式,包括自带rowbound内存分页、第三方插件pagehelper(通过修改SQL实现分页)、SQL分页(依赖limit或rownum等关键字)、数组分页(先查询全部数据再用subList分页)、拦截器分页(自定义拦截器为SQL添加分页语句)。最后总结了逻辑分页(内存分页,适合小数据量)和物理分页(直接在数据库层面分页,适合大数据量)的优缺点,强调物理分页优先于逻辑分页。
|
10月前
|
SQL Java 数据库连接
MyBatis 实现分页的机制
MyBatis 的分页机制主要依赖于 `RowBounds` 对象和分页插件。`RowBounds` 实现内存分页,适合小数据量场景,通过设定偏移量和限制条数对结果集进行筛选。而针对大数据量,则推荐使用分页插件(如 PageHelper),实现物理分页。插件通过拦截 SQL 执行,动态修改语句添加分页逻辑,支持多种数据库方言。配置插件后,无需手动调整查询方法即可完成分页操作,提升性能与灵活性。
249 0
|
10月前
|
Oracle 关系型数据库 Java
|
11月前
|
Oracle 关系型数据库 MySQL
【YashanDB 知识库】Mybatis-Plus 调用 YashanDB 怎么设置分页
**Mybatis-Plus 自动分页配置问题简介** Mybatis-Plus 是 Mybatis 的增强工具,简化 CRUD 操作并适配多种数据库,包括 YashanDB。自动分页配置错误会导致应用开发受影响。解决方法:1. 配置 pagehelper 为 oracle 或 mysql;2. 设置分页拦截器为 oracle 或 mysql。确保返回设置后的对象。正确配置后可在 service 层使用 page 方法实现自动分页。