SpringBoot集成PageHelper分页查询
近期在公司内部开展了一个项目。但上级公司方面的需求迟迟未有明确。无奈之下只好独立完成。最终产出的代码存在较大的差异性针对分页查询的功能四个开发人员完成了三个相关类别的封装工作这对于我这样的追求完美的人而言这实在不够理想因此决定制定统一的技术规范以减少后续工作的混乱程度
在之前使用[Mybatis-Plus](http://mp mq.com/guide/crud-interface.html#mapper-crud-接口)完成了一次重构工作后,在查阅了该库提供的分页器功能之后发现其操作实现较为便捷。然而,在实际应用中发现一些查询代码并未被重构复用,并因此暂时未采用该分页器进行开发
所以后面决定还是用PageHelper来做。
1.引入插件
引入分页插件有下面2种方式,推荐使用 Maven 方式。
1). 引入 Jar 包
你可以从下面的地址中下载最新版本的 jar 包
导航至 Sonatype 官网的资源库页面,请访问 https://oss.sonatype.org/content/repositories/releases/com/github/pagehelper/pagehelper/ 以获取 PageHelper 的最新版本。
http://repo1.maven.org/maven2/com/github/pagehelper/pagehelper/
由于采用SQL解析软件进行数据处理需求分析,请确保已安装jSqlParser JAR文件(需与PageHelper使用的版本一致):
2). 使用 Maven
在 pom.xml 中添加如下依赖:
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>最新版本</version>
</dependency>
当前版本号位于作者Github处
不过,在使用官方推荐的新版本时可能会遇到与Spring Boot存在兼容性问题而导致数据无法分页的情况。经过多次尝试后发现这种做法并不适用,并最终决定采用以下两种方案结合的方法来解决问题。该方案能够正常运行并满足当前需求,并且在实际应用中表现良好。对于其他情况仍需进一步验证以确保稳定性
<!-- spring-mybatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<!--pageHelper分页插件-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.5</version>
</dependency>
2. 配置拦截器插件
在application.yml中配置
# pageHelper分页配置
pagehelper:
helper-dialect: mysql
reasonable: true
support-methods-arguments: true
params: count=countSql
3.代码中使用
后台代码:
@GetMapping("/list")
public PageInfo<TbProject> listProject(String name, String type, int pageSize, int page) {
PageHelper.startPage(page + 1, pageSize);
Map map = new HashMap();
map.put("name", name);
map.put("type", type);
List<TbProject> tbProjects = proService.listProject(map);
PageInfo pageInfo = new PageInfo(tbProjects);
System.out.println("总数为:"+pageInfo.getTotal());
return pageInfo;
}
由于我的前端框架采用了elementUI,在处理当前页时与pageHelper的行为存在差异,因此需要将传回的当前页数据进行加一处理。
在pageHelper调用startPage方法之后会执行后续的第一个select元素的物理分页操作,并采用与全面查询相同的写法以确保数据完整性的一致性。最后会将处理结果返回给主程序逻辑部分
创建一个新的InfoPage实例,并将其与tbProjects绑定;将所需的所有信息存储至pageInfo变量中并发送回前端端口。
前台代码
getProList() {
this.axios({
method: 'get',
url: '/project/list',
params: {
'page': this.pageInfo.page,
'pageSize': this.pageInfo.pageSize,
'name': this.proName4search,
'type': this.selType,
}
}).then((response) => {
//可以在前台控制台上查看返回的pageInfo中有哪些数据
console.log(response);
//通过list拿到目标页的对象集合,total获取到总数量
this.tableData = response.data.list;
this.total = response.data.total;
}).catch(error => {
this.$message.error(this.erroStr + error);
});
},
以上。
在此表示对Liuzh的支持与感谢。
