• Java实现SQL分页


    在日常开发需要对数据进行分页,配置如下

    1. <dependency>
    2. <groupId>com.baomidougroupId>
    3. <artifactId>mybatis-plus-boot-starterartifactId>
    4. <version>3.4.0version>
    5. dependency>

    编写配置类 

    1. @Configuration
    2. public class MybatisPlusConfiguration {
    3. /**
    4. * 配置mysql拦截器
    5. * @return
    6. */
    7. @Bean
    8. public MybatisPlusInterceptor mybatisPlusInterceptor() {
    9. MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
    10. interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
    11. return interceptor;
    12. }
    13. }

    控制器层可以加上之后使用

     page.setOptimizeCountSql(false);

    了解如下 

    1. page.setOptimizeCountSql(false); 是 MyBatis 框架中的一个配置选项,用于控制是否优化分页查询中的总记录数查询 SQL。这通常用于分页查询,其中需要获取总记录数以计算总页数等信息
    2. 当 page.setOptimizeCountSql(true); 时,MyBatis 将尝试优化总记录数查询 SQL,以提高性能。通常,这意味着 MyBatis 会尝试从分页查询的 SQL 语句中提取总记录数,而不会执行额外的总记录数查询
    3. 当 page.setOptimizeCountSql(false); 时,MyBatis 将不进行总记录数查询的优化,而是会执行一个额外的 SQL 查询来获取总记录数。这可以保证总记录数的准确性,但可能会增加数据库的负载,尤其在处理大数据集时
    4. 选择是否启用总记录数查询的优化取决于你的具体需求和性能要求。如果你可以容忍轻微的性能损失以获得更准确的总记录数,可以将其设置为 false,否则,你可以将其设置为 true 以提高性能

    大致流程如下

    在控制器中注入业务层实现方法时需要加上参数IPage

    1. public R pageByListAll(Page page) //传入 current=页码,size=页大小
    2. {
    3. IPage pageData = dabaimaoService.listAll(page); //(dabaimao为查询结果集的类)
    4. return R.ok(pageData);
    5. }

    在Service中实现将Ipage传入Mapper文件中

    1. /**
    2. * 分页
    3. * @param current 页码
    4. * @param size 页大小
    5. * @return
    6. */
    7. @Override
    8. public IPage listAll(IPage page) {
    9. // IPage pageset = new IPage(page, size);
    10. //也可以直接使用IPage获取
    11. IPage pageData = this.baseMapper.listAll(page);
    12. //数据进行分页变成IPage对象
    13. return pageData;
    14. }

     在mapper层中加入参数Ipage实现分页

    IPage listAll(IPage page);
    

    结果如下

    a2bd5c4e360f4abfb0c4e65263bcca19.png

    上面是使用mybatis-puls实现分页,也可以使用Pagehandle这个工具类

    1. <dependency>
    2. <groupId>com.github.pagehelpergroupId>
    3. <artifactId>pagehelper-spring-boot-starterartifactId>
    4. <version>1.4.2version>
    5. dependency>

    获得数据后

    1. PageHelper.startPage(page, size);
    2. PageInfo pageData= new PageInfo<>(data);

    工具类如下

    1. @Component
    2. public class PageInfoUtil {
    3. public static PageInfo getData(List data, int pageNumber, int pageSize) {
    4. PageHelper.startPage(pageNumber, pageSize);
    5. PageInfo Result= new PageInfo<>(data);
    6. return Result;
    7. }
    8. }

    结果如下

    f7887784541641d4bc46c523e373ca41.png

    最后可以自己写一个工具类

    1. public class PaginationInfo {
    2. private int pageNum; // 当前页码
    3. private int pageSize; // 每页大小
    4. private int size; // 当前页数据条数
    5. private int startRow; // 当前页的起始行
    6. private int endRow; // 当前页的结束行
    7. private long total; // 总数据条数
    8. private int pages; // 总页数
    9. private List list; // 当前页的数据列表
    10. private int prePage; // 前一页页码
    11. private int nextPage; // 后一页页码
    12. private boolean isFirstPage; // 是否是第一页
    13. private boolean isLastPage; // 是否是最后一页
    14. private boolean hasPreviousPage; // 是否有前一页
    15. private boolean hasNextPage; // 是否有后一页
    16. private int navigatePages; // 导航页码数
    17. private int navigateFirstPage; // 导航页的第一页页码
    18. private int navigateLastPage; // 导航页的最后一页页码
    19. private List navigatepageNums; // 导航页码列表
    20. // 构造函数,用于创建 PaginationInfo 对象
    21. public PaginationInfo(List data, int pageNum, int pageSize) {
    22. this.pageNum = pageNum;
    23. this.pageSize = pageSize;
    24. this.list = data;
    25. this.total = data.size();
    26. this.pages = (int) Math.ceil((double) total / pageSize);
    27. if (pageNum < 1) {
    28. pageNum = 1;
    29. } else if (pageNum > pages) {
    30. pageNum = pages;
    31. }
    32. int fromIndex = (pageNum - 1) * pageSize;
    33. int toIndex = Math.min(fromIndex + pageSize, data.size());
    34. this.size = toIndex - fromIndex;
    35. this.list = data.subList(fromIndex, toIndex);
    36. this.startRow = fromIndex + 1;
    37. this.endRow = fromIndex + size;
    38. this.prePage = pageNum > 1 ? pageNum - 1 : 1;
    39. this.nextPage = pageNum < pages ? pageNum + 1 : pages;
    40. this.isFirstPage = pageNum == 1;
    41. this.isLastPage = pageNum == pages;
    42. this.hasPreviousPage = pageNum > 1;
    43. this.hasNextPage = pageNum < pages;
    44. this.navigatePages = 8; // 可以根据需要进行调整
    45. this.calcNavigatePageNumbers();
    46. if (this.navigatepageNums != null && !this.navigatepageNums.isEmpty()) {
    47. this.navigateFirstPage = this.navigatepageNums.get(0);
    48. this.navigateLastPage = this.navigatepageNums.get(this.navigatepageNums.size() - 1);
    49. }
    50. }
    51. // 计算导航页码列表
    52. private void calcNavigatePageNumbers() {
    53. navigatepageNums = new ArrayList<>();
    54. int startNum;
    55. int endNum;
    56. if (pages <= navigatePages) {
    57. startNum = 1;
    58. endNum = pages;
    59. } else {
    60. int halfPages = navigatePages / 2;
    61. startNum = pageNum - halfPages;
    62. endNum = pageNum + halfPages;
    63. if (startNum < 1) {
    64. startNum = 1;
    65. endNum = navigatePages;
    66. }
    67. if (endNum > pages) {
    68. endNum = pages;
    69. startNum = pages - navigatePages + 1;
    70. }
    71. }
    72. for (int i = startNum; i <= endNum; i++) {
    73. navigatepageNums.add(i);
    74. }
    75. }
    76. }

    测试如下

    1. public static void main(String[] args) {
    2. // 创建一个示例数据列表
    3. List dataList = new ArrayList<>();
    4. for (int i = 1; i <= 50; i++) {
    5. dataList.add("Item " + i);
    6. }
    7. // 每页显示10条数据
    8. int pageSize = 10;
    9. // 测试PaginationInfo类
    10. PaginationInfo paginationInfo = new PaginationInfo<>(dataList, 1, pageSize);
    11. // 打印分页信息
    12. System.out.print("当前页:" + paginationInfo.getPageNum()+" ");
    13. System.out.print("每页大小:" + paginationInfo.getPageSize()+" ");
    14. System.out.print("总数据条数:" + paginationInfo.getTotal()+" ");
    15. System.out.print("总页数:" + paginationInfo.getPages()+" ");
    16. System.out.print("当前页数据条数:" + paginationInfo.getSize()+" ");
    17. System.out.print("是否第一页:" + paginationInfo.isFirstPage()+" ");
    18. System.out.print("是否最后一页:" + paginationInfo.isLastPage()+" ");
    19. System.out.print("前一页页码:" + paginationInfo.getPrePage()+" ");
    20. System.out.print("后一页页码:" + paginationInfo.getNextPage()+" ");
    21. // 打印当前页的数据列表
    22. List currentPageData = paginationInfo.getList();
    23. System.out.println("当前页的数据:");
    24. for (String item : currentPageData) {
    25. System.out.println(item);
    26. }
    27. // 打印导航页码列表
    28. List navigatePageNums = paginationInfo.getNavigatepageNums();
    29. System.out.println("导航页码列表:");
    30. for (Integer pageNum : navigatePageNums) {
    31. System.out.println(pageNum);
    32. }
    33. System.out.println(paginationInfo.toString());
    34. }

    运行

    949c2ed0126e48539c6c60c64ec657f2.png

    上述方法都可以 

  • 相关阅读:
    基于虚拟机源码分析move合约(一):本地变量
    7. CSS 网格布局
    【数据分享】GIS矢量格式的2001-2022年全国各城市平均气温数据(逐日、逐月、逐年)
    Redis(八) - Redis企业实战之优惠券秒杀
    分享一个基于springboot+vue的在线租房与招聘平台系统代码 房屋租赁系统
    PostgreSQL 数据库实现公网远程连接
    【数学】焦点弦定理(?)
    PDF 如何高效的转换成 markdown
    SQL - 函数
    希望计算机专业同学都知道这些老师
  • 原文地址:https://blog.csdn.net/m0_69156017/article/details/134036164