Mybatis-Plus实现分页查询
文章目录
1.1技术概述
- 分页查询是一项常用的数据库查询方法,而使用Mybatis-Plus的分页插件,可以为你省去更多的时间去编写复杂的数据库语句,当然,前提是你还是要懂得一些数据库查询语句以及Mybatis-Plus的常用方法。
- 之所以学习该技术,也是因为在软工实践中有分页查询的需求,为了能够加快开发效率,所以选择了使用分页插件。
- 难点:需要注意Mybatis-Plus不同版本的要求不同;对Mybatis-Plus的相关方法还是需要进行学习。
1.2技术详述
1.2.1配置分页插件
spring和mybatis-plus整合
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; } }
1.2.2自定义分页
1、如果你的mapper没有继承BaseMapper
UserMapper.java 方法内容
public interface UserMapper {//可以继承或者不继承BaseMapper IPage selectPageVo(Page> page, Integer state);}
UserMapper.xml 等同于编写一个普通 list 查询,mybatis-plus 自动替你分页
UserServiceImpl.java 调用分页方法
public IPage selectUserPage(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.属性 获取。
流程图:
2、如果你的mapper继承了BaseMapper
除了上述做法,那你可以使用BaseMapper里声明了的很强大的CRUD方法,可以看下面的例子。
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;}
流程图:
1.3技术使用中遇到的问题和解决过程
- 关于mybatis-plus版本的问题,3.x版本要使用分页,必须配置插件,否则会没有效果,不像2.x没配插件就是内存分页(在分页的时候,是把所有的数据都查询出来,然后通过RowBounds进行在内存分页)。
List selectPage(RowBounds rowBounds, Wrapper wrapper);
- 以及上述提到的IPage传参与返回参数的关系。解决过程就是通过网上查询(博客园、csdn等)获取相关解决方案。
1.4总结
如果你使用了Mybatis-Plus,并且有需要用到分页的功能,可以考虑Mybatis-Plus的分页插件,只需要简单的配置就可以使用,是个不错的选择。
参考文献
https://www.cnblogs.com/FZU-TKQ/p/14944506.html
我是在写项目中想起来了分页查询,以前学过,但是有点忘了,这篇博客园的文章真心不错,让我想起很多知识点。强烈推荐去看看。
加油叭!程序猿!
来源地址:https://blog.csdn.net/lj20020302/article/details/129739505