Java实现SQL分页
在日常开发需要对数据进行分页,配置如下
<!-- baomidou -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.0</version>
</dependency>
在控制器层参数加上Page page,之后使用
page.setOptimizeCountSql(false);
了解如下
page.setOptimizeCountSql(false); 是 MyBatis 框架中的一个配置选项,用于控制是否优化分页查询中的总记录数查询 SQL。这通常用于分页查询,其中需要获取总记录数以计算总页数等信息
当 page.setOptimizeCountSql(true); 时,MyBatis 将尝试优化总记录数查询 SQL,以提高性能。通常,这意味着 MyBatis 会尝试从分页查询的 SQL 语句中提取总记录数,而不会执行额外的总记录数查询
当 page.setOptimizeCountSql(false); 时,MyBatis 将不进行总记录数查询的优化,而是会执行一个额外的 SQL 查询来获取总记录数。这可以保证总记录数的准确性,但可能会增加数据库的负载,尤其在处理大数据集时
选择是否启用总记录数查询的优化取决于你的具体需求和性能要求。如果你可以容忍轻微的性能损失以获得更准确的总记录数,可以将其设置为 false,否则,你可以将其设置为 true 以提高性能
Page<类> page = new Page(page, pageSize);
//生成数据data
pageInfo = this.baseMapper.selectPage(page, data);
return pageInfo;
结果如下
也可以使用Pagehandle这个包
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.4.2</version>
</dependency>
获得数据后
PageHelper.startPage(页码, 页大小);
PageInfo<类> 对象= new PageInfo<>(数据);
工具类如下
@Component
public class PageInfoUtil {
public static PageInfo<T> getData(List<T> data, int pageNumber, int pageSize) {
PageHelper.startPage(pageNumber, pageSize);
PageInfo<T> Result= new PageInfo<>(data);
return Result;
}
}
结果如下
最后可以自己写一个工具类
public class PaginationInfo<T> {
private int pageNum; // 当前页码
private int pageSize; // 每页大小
private int size; // 当前页数据条数
private int startRow; // 当前页的起始行
private int endRow; // 当前页的结束行
private long total; // 总数据条数
private int pages; // 总页数
private List<T> list; // 当前页的数据列表
private int prePage; // 前一页页码
private int nextPage; // 后一页页码
private boolean isFirstPage; // 是否是第一页
private boolean isLastPage; // 是否是最后一页
private boolean hasPreviousPage; // 是否有前一页
private boolean hasNextPage; // 是否有后一页
private int navigatePages; // 导航页码数
private int navigateFirstPage; // 导航页的第一页页码
private int navigateLastPage; // 导航页的最后一页页码
private List<Integer> navigatepageNums; // 导航页码列表
// 构造函数,用于创建 PaginationInfo 对象
public PaginationInfo(List<T> data, int pageNum, int pageSize) {
this.pageNum = pageNum;
this.pageSize = pageSize;
this.list = data;
this.total = data.size();
this.pages = (int) Math.ceil((double) total / pageSize);
if (pageNum < 1) {
pageNum = 1;
} else if (pageNum > pages) {
pageNum = pages;
}
int fromIndex = (pageNum - 1) * pageSize;
int toIndex = Math.min(fromIndex + pageSize, data.size());
this.size = toIndex - fromIndex;
this.list = data.subList(fromIndex, toIndex);
this.startRow = fromIndex + 1;
this.endRow = fromIndex + size;
this.prePage = pageNum > 1 ? pageNum - 1 : 1;
this.nextPage = pageNum < pages ? pageNum + 1 : pages;
this.isFirstPage = pageNum == 1;
this.isLastPage = pageNum == pages;
this.hasPreviousPage = pageNum > 1;
this.hasNextPage = pageNum < pages;
this.navigatePages = 8; // 可以根据需要进行调整
this.calcNavigatePageNumbers();
if (this.navigatepageNums != null && !this.navigatepageNums.isEmpty()) {
this.navigateFirstPage = this.navigatepageNums.get(0);
this.navigateLastPage = this.navigatepageNums.get(this.navigatepageNums.size() - 1);
}
}
// 计算导航页码列表
private void calcNavigatePageNumbers() {
navigatepageNums = new ArrayList<>();
int startNum;
int endNum;
if (pages <= navigatePages) {
startNum = 1;
endNum = pages;
} else {
int halfPages = navigatePages / 2;
startNum = pageNum - halfPages;
endNum = pageNum + halfPages;
if (startNum < 1) {
startNum = 1;
endNum = navigatePages;
}
if (endNum > pages) {
endNum = pages;
startNum = pages - navigatePages + 1;
}
}
for (int i = startNum; i <= endNum; i++) {
navigatepageNums.add(i);
}
}
}
测试如下
public static void main(String[] args) {
// 创建一个示例数据列表
List<String> dataList = new ArrayList<>();
for (int i = 1; i <= 50; i++) {
dataList.add("Item " + i);
}
// 每页显示10条数据
int pageSize = 10;
// 测试PaginationInfo类
PaginationInfo<String> paginationInfo = new PaginationInfo<>(dataList, 1, pageSize);
// 打印分页信息
System.out.print("当前页:" + paginationInfo.getPageNum()+" ");
System.out.print("每页大小:" + paginationInfo.getPageSize()+" ");
System.out.print("总数据条数:" + paginationInfo.getTotal()+" ");
System.out.print("总页数:" + paginationInfo.getPages()+" ");
System.out.print("当前页数据条数:" + paginationInfo.getSize()+" ");
System.out.print("是否第一页:" + paginationInfo.isFirstPage()+" ");
System.out.print("是否最后一页:" + paginationInfo.isLastPage()+" ");
System.out.print("前一页页码:" + paginationInfo.getPrePage()+" ");
System.out.print("后一页页码:" + paginationInfo.getNextPage()+" ");
// 打印当前页的数据列表
List<String> currentPageData = paginationInfo.getList();
System.out.println("当前页的数据:");
for (String item : currentPageData) {
System.out.println(item);
}
// 打印导航页码列表
List<Integer> navigatePageNums = paginationInfo.getNavigatepageNums();
System.out.println("导航页码列表:");
for (Integer pageNum : navigatePageNums) {
System.out.println(pageNum);
}
System.out.println(paginationInfo.toString());
}
运行
上述方法都可以