PageHelper+SpringBoot分页
<!-- pagehelper-spring-boot-starter -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.3.0</version>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
2. 配置 (这里选择yml配置)
#pagehelper配置
pagehelper:
# 选择数据库类型
helper-dialect: mysql
#是否开启合理化分页
reasonable: true
3.为了方便使用 建立一个PageParams类存放分页参数(pageSize数量,pageNum当前页)
public class PageParams {
private Integer pageNum;数量
private Integer pageSize;当前页
//自己生成set,get方法 。。。
}
4.Controller里需要使用分页的方法里接收前端数据
!!!注意在接下来使用中PageParams一定要导自己刚刚创建的
import com.jiazhong.office.commons.PageParams;
@RestController
@RequestMapping("/rbac/account/")
public class AccountController {
@Autowired
private AccountService accountService;
@GetMapping("getAccountList")
public Map<String, Object> getAccountList(PageParams pageParams){
return accountService.getAccountList(pageParams);
}
}
5.serviceImpl类
分页三部曲
@Override
public Map<String, Object> getAccountList(PageParams pageParams) {
//1 开启分页 传入参数
PageHelper.startPage(pageParams);
//2 数据库获取数据
List<AccountView> accountViewList = accountDao.getAccountList();
//3 用PageInfo对结果进行包装
PageInfo pageInfo = new PageInfo(accountViewList);
//存入并返回一个map集合
Map<String,Object> map = new HashMap<>();
map.put("total",pageInfo.getTotal());
map.put("accountList",pageInfo.getList());
return map;
}
6.前端实现举例(这里使用Element组件)
<template>
<div class="user-data-list">
<el-table :data="accountList" border style="width: 100%">
<el-table-column type="index" label="序号" align="center" width="50">
</el-table-column>
<el-table-column prop="account_name" label="用户名" align="center">
</el-table-column>
</el-table>
</div>
<!-----------------------------分页条------------------------------------->
<div class="pagination-div">
<!--
layout:设置分页条的显示内容
sizes:设置显示每页可选记录数列表
prev:上一页图标
pager:页面图标
next:下一页图标
jumper:跳转到某一页
->:指定下一个元素的显示为最右边
total:总记录数
@current-change="页面改变时执行"
@size-change="页面数量改变时执行"
-->
<el-pagination
background
layout="sizes,prev, pager, next,jumper,->,total"
:total="total"
:page-size.sync="pageParams.pageSize"
:current-page.sync="pageParams.pageNum"
:page-sizes="pageSizes"
@current-change="getAccountList"
@size-change="getAccountList">
>
</el-pagination>
</div>
<!-----------------------------分页条------------------------------------->
<template>
<script>
import qs from "qs"
export default {
data() {
return {
accountList: [], //账户列表(用户列表)
pageParams:{
pageSize:5,//每页条数
pageNum:1//当前页
},
total:100,//总记录条数
pageSizes:[5, 10, 15],
};
},
methods: {
/**
* 获得账户列表
*/
getAccountList() {
this.$axios
.get("/rbac/account/getAccountList",{
params:this.pageParams})
.then((response) => {
let result = response.data;
this.total=result.total;
this.accountList = result.accountList;
console.log(this.accountList);
})
.catch((err) => {
alert(err);
});
},
mounted() {
//获得账户列表
this.getAccountList();
},
};
</script>
原理
pageHelper会使用ThreadLocal获取到同一线程中的变量信息,各个线程之间的Threadlocal不会相互干扰,也就是Thread1中的ThreadLocal1之后获取到Tread1中的变量的信息,不会获取到Thread2中的信息
所以在多线程环境下,各个Threadlocal之间相互隔离,可以实现,不同thread使用不同的数据源或不同的Thread中执行不同的SQL语句
所以,PageHelper利用这一点通过拦截器获取到同一线程中的预编译好的SQL语句之后将SQL语句包装成具有分页功能的SQL语句,并将其再次赋值给下一步操作,所以实际执行的SQL语句就是有了分页功能的SQL语句