使用分页插件的时候,分页没有生效,查了一下后发现是自己忘记了配置拦截器;
并且比对原来的代码之后发现,版本更新后,拦截器的配置也有不同。(之前项目中使用的版本是3.3.2,现在使用的是3.4.3)
干脆写个博客,把使用pageHelper插件和使用IPage插件的问题记录一下。
目录
一、PageHelper插件
PageHelper是Mybatis提供的分页插件,语句如下:
Page page = PageHelper.startPage(pageNum, pageSize);
List<Object> list = mapper.selectList(...);
PageInfo pageInfo = page.toPageInfo();
PageHelper是将分页参数放在缓存中,在执行sql时会在sql最后拼接"limit ...",无论是使用Mybatis-Plus的构造器执行sql,还是自定义的sql语句,都无需修改语句及其返回类型,因此使用时非常简单。
但是,把参数放在缓存中会导致一定的问题,在其它无需拼接"limit ..."进行分页查询的sql后仍会拼接,导致查询结果不全,或者在本身已经书写了"limit ..."的sql语句后进行拼接导致报错,在多线程项目中使用有风险。
二、IPage插件
(一)pom文件中依赖引入
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-extension</artifactId>
<version>版本号</version>
</dependency>
(二)拦截器配置
1.老版本
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.pagination.optimize.JsqlParserCountOptimize;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MybatisPlusConfig {
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
// 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求
// 默认false 为false时 会返回空数据
paginationInterceptor.setOverflow(false);
// 设置最大单页限制数量,默认 500 条,-1 不受限制
// paginationInterceptor.setLimit(500);
// 开启 count 的 join 优化,只针对部分 left join
paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
return paginationInterceptor;
}
}
2.新版本
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
PaginationInnerInterceptor paginationInterceptor = new PaginationInnerInterceptor();
// 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求
// 默认false 为false时 会返回空数据
paginationInterceptor.setOverflow(false);
// 设置最大单页限制数量,默认 500 条,-1 不受限制
// paginationInterceptor.setLimit(500);
// 开启 count 的 join 优化,只针对部分 left join
paginationInterceptor.setOptimizeJoin(true);
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
mybatisPlusInterceptor.addInnerInterceptor(paginationInterceptor);
return mybatisPlusInterceptor;
}
}
(三)使用
1.Mybatis-Plus内置方法
在服务层直接调用selectPage方法
Page<Object> page = new Page<>(pageNum, pageSize);
IPage<Object> objectPage = mapper.selectPage(page, new LambdaQueryWrapper<Object>.eq(Object::test, test));
List<Object> objectList = objectPage.getRecords();
2.自定义sql
(1)数据访问层
xml中写相应业务的sql,注意无需拼接limit
IPage<Object> selectPageByParam(Page<Object> page, String Param);
(2)服务层
Page<Object> page = new Page<>(pageNum, pageSize);
IPage<Object> objectPage = mapper.selectPageByParam(page,test);
如果在项目中,还有一个业务需要实现同样的查询条件,但是要返回所有结果,则在xml、mapper中应再写一个方法用于返回List<Object>。(使用IPage比PageHelper麻烦的点就在这里,相同的筛选条件,因为分页与不分页的区别,需要写两个方法区分开来)