通过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,createTime=Wed Dec 23 23:27:32 CST 2020,updateTime=Thu Dec 24 23:27:36 CST 2020,User(id=4,name=daxiong,age=22,createTime=null,updateTime=Fri Dec 25 00:55:02 CST 2020,User(id=5,name=wesson5,updateTime=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",MetaObject);
this.setFieldValByName("version",MetaObject); //为了第一次新增就设置版本值
this.setFieldValByName("deleted",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
 (编辑:北几岛)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|