Mybatis-Plus实现分页查询
1、spring和mybatis-plus整合
2、spring boot和mybatis-plus整合
//Spring boot方式
@Configuration
@MapperScan("mapper包名")
public class MybatisPlusConfig {
// 旧版
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
// 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求 默认false
// paginationInterceptor.setOverflow(false);
// 设置最大单页限制数量,默认 500 条,-1 不受限制
// paginationInterceptor.setLimit(500);
// 开启 count 的 join 优化,只针对部分 left join
paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
return paginationInterceptor;
}
// 最新版
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.H2));
return interceptor;
}
}
UserMapper.java 方法内容
public interface UserMapper {//可以继承或者不继承BaseMapper
/**
*
* 查询 : 根据state状态查询用户列表,分页显示
*
*
* @param page 分页对象,xml中可以从里面进行取值,传递参数 Page 即自动分页,必须放在第一位(你可以继承Page实现自己的分页对象)
* @param state 状态
* @return 分页对象
*/
IPage selectPageVo(Page> page, Integer state);
}
UserMapper.xml 等同于编写一个普通 list 查询,mybatis-plus 自动替你分页
UserServiceImpl.java 调用分页方法
public IPageselectUserPage(Page page, Integer state) { // 不进行 count sql 优化,解决 MP 无法自动优化 SQL 问题,这时候你需要自己查询 count 部分 // page.setOptimizeCountSql(false); // 当 total 为小于 0 或者设置 setSearchCount(false) 分页插件不会进行 count 查询 // 要点!! 分页返回的对象与传入的对象是同一个 return userMapper.selectPageVo(page, state); }
需要注意的是:
如果返回类型是 IPage 则入参的 IPage 不能为null,因为 返回的IPage == 入参的IPage
如果返回类型是 List 则入参的 IPage 可以为 null(为 null 则不分页),但需要你手动入参的IPage.setRecords(返回的 List);
如果 xml 需要从 page 里取值,需要 page.属性 获取。
流程图:

除了上述做法,那你可以使用BaseMapper里声明了的很强大的CRUD方法,可以看下面的例子。
/**
* 查询未审核帖子(分页)
* @param tag 搜索项目
* @param page 页码
* @return post 帖子列表
*/
public BackPage findBackPostList(String tag, int page){
BackPage postBackPage = new BackPage<>();
// 设置条件构造器
QueryWrapper wrapper = new QueryWrapper<>();
wrapper.like("post_title", tag);
wrapper.eq("is_check", NOT_CHECKED);
// 构造分页信息,其中的Page<>(page, PAGE_RECORDS_NUM)的第一个参数是页数,而第二个参数是每页的记录数
Page postPage = new Page<>(page, PAGE_RECORDS_NUM);
// page(postPage, wrapper)这里的第一个参数就是上面定义了的Page对象,第二个参数就是上面定义的条件构造器对象,通过调用这个方法就可以根据你的分页信息以及查询信息获取分页数据
IPage postIPage = page(postPage, wrapper);
// 封装数据,其中getRecords()是获取记录数,getCurrent()获取当前页数,getPages()获取总页数,getTotal()获取记录总数,还要其他更多的方法,大家可以自行查看,在这里就不过多赘述了
postBackPage.setContentList(postIPage.getRecords());
postBackPage.setCurrentPage(postIPage.getCurrent());
postBackPage.setTotalPage(postIPage.getPages());
postBackPage.setTotalNum(postIPage.getTotal());
return postBackPage;
}
其中的BackPage以及Post是我为了封装查询数据写的实体类,大家根据自己的需求来选择就好了。
public class BackPage{ private static final long serialVersionUID=1L; /** * 总页数 */ private long totalPage; /** * 当前页数 */ private long currentPage; /** * 总数 */ private long totalNum; /** * 内容 */ private List contentList; }
流程图:

/**
*
* 根据 entity 条件,查询全部记录(并翻页)
*
*
* @param rowBounds 分页查询条件(可以为 RowBounds.DEFAULT)
* @param wrapper 实体对象封装操作类(可以为 null)
* @return List
*/
List selectPage(RowBounds rowBounds, Wrapper wrapper);
如果你使用了Mybatis-Plus,并且有需要用到分页的功能,可以考虑Mybatis-Plus的分页插件,只需要简单的配置就可以使用,是个不错的选择。
参考文献
https://www.cnblogs.com/FZU-TKQ/p/14944506.html
我是在写项目中想起来了分页查询,以前学过,但是有点忘了,这篇博客园的文章真心不错,让我想起很多知识点。强烈推荐去看看。
加油叭!程序猿!