• 12、JavaWeb启程——分页查询的设计


    1、分页查询介绍

    【简介】: 分页查询则是在页面上将本来很多的数据分段显不,每页显示用户自定义的行数,同时减少一次性加载,内存溢出风险。

    2、分页的分类

    1、假分页

    【简介】: 一次性查询所有数据存入内存,翻页从内存中获取数据。

    【优点】: 实现简单,性能高。

    【缺点】: 一旦数据量过大,会造成内存泄漏

    2、真分页

    【介绍】: 每次翻页都是从数据库中查询数据。

    【优点】: 不容易造成内存溢出。

    【缺点】: 实现复杂,性能相对较低。

    3、分页效果

    在这里插入图片描述

    2、分页查询设计

    1、分页查询需要传递的参数

    • currentPage:当前页,跳转到第几页,int类型,需要设置默认值,一般为1
    • pageSize:每页最多显示多少条数据。int 类型,需要设置默认值,一般为5、10、等。

    2、分页需要展示的数据

    • 展示当前页得货品信息
    • 分页条的信息
      • beginPage:首页
      • prevPage:上一页
      • nextPage:下一页
      • totalPage:总页数/末页
      • totalCount/rows:总条数
      • currentPage:当前页
      • pageSize:每页显示多少条数据

    3、分页需要展示的数据来源

    • 来源于用户传入
      • currentPage:当前页,跳转到第几页,int类型,需要设置默认值,一般为1。
      • pageSize:每页最多显示多少条数据。int 类型,需要设置默认值,一般为5、10、等。
    • 来源于两条sql的查询
      • totalCount/rows:总条数 int类型
      • data/list:每一页的结果集数据,List类型
    • 来源于程序计算
      • totalPage:总页数/末页
      • prevPage:上一页
      • nextPage:下一页

    4、结果总条数和结果集

    • totalCount/rows:总条数
    SELECT cOUNT(*)FROM表名[WHERE条件]
    
    • 1
    • data/list:每一页的结果集数据
    # 第一个?:从哪一个索引的数据开始查询(默认从O开始)
    # 第二个 ?:查询多少条数据
    SELECT *FROM表名[WHERE条件]LIMIT ?,?
    
    • 1
    • 2
    • 3

    5、总页数、上一页、下一页

    int totalPage = rows % pagesize == 0 ? rows / pagesize : rows / pagesize + 1;
    //优先计算
    int prevPage = currentPage - 1 >= 1 ? currentPage - 1 : 1;
    int nextPage = currentPage + 1 <= tota7Page ? currentPage + 1 : totalPage;
    
    • 1
    • 2
    • 3
    • 4

    3、分页查询的实现

    1、分页的逻辑图示

    在这里插入图片描述

    2、分页数据的封装

    • PageResult 返回结果数据的封装
    package cn.simplelife.results;
    
    /**
     * @ClassName PageResult
     * @Description
     * @Author simplelife
     * @Date 2022/11/1 9:13
     * @Version 1.0
     */
    
    import lombok.*;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * 用来封装分页的结果数据
     */
    @Getter
    @Setter
    public class PageResult {
        private int currentPage;// 当前页
        private int pageSize;   // 每页要显示的条数
        private List data;      // 当前页的数据
        private int totalCount; // 总条数
        private int totalPage;  // 总页数
        private int prevPage;   // 上一页
        private int nextPage;   // 下一页
    
        public PageResult(int currentPage, int pageSize, List data, int totalCount) {
            this.currentPage = currentPage;
            this.pageSize = pageSize;
            this.data = data;
            this.totalCount = totalCount;
            
            // 计算上一页 总条数、下一页、
            this.prevPage = currentPage - 1 >= 1 ? currentPage - 1 : 1;
            this.totalPage = totalCount % pageSize == 0 ? totalCount / pageSize : totalCount / pageSize + 1;
            this.nextPage = currentPage + 1 <= this.totalPage ? currentPage + 1 : this.totalPage;
        }
    
    
        /**
         * 表中没有数据的时候
         * @param currentPage 当前页
         * @param pageSize 页面大小
         */
        public PageResult(int currentPage, int pageSize) {
            this(currentPage, pageSize, new ArrayList(), 0);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51

    3、分页参数的封装

    • QueryObject分页参数的封装
    package cn.simplelife.query;
    
    import lombok.*;
    
    /**
     * @ClassName QueryObject
     * @Description
     * @Author simplelife
     * @Date 2022/11/1 9:38
     * @Version 1.0
     */
    @AllArgsConstructor
    @NoArgsConstructor
    @Setter
    @Getter
    @ToString
    public class QueryObject {
        private int currentPage = 1;// 当前页 需要默认值
        private int pageSize = 3;   // 每页要显示的条数 需要默认值
    
        public int getBeginIndex() {
            return (currentPage - 1) * pageSize;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    4、持久层分页的实现

    • 接口
        /**
         * 根据条件查询当前页数据
         *
         * @param queryObject 查询对象条件
         * @return 返回满足条件的数据集合
         */
        List<Product> selectForList(QueryObject queryObject);
    
        /**
         * 查询满足条件的总数
         *
         * @return 返回数据的总条数
         */
        int selectForCount(QueryObject queryObject);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 实现类
        @Override
        public List<Product> selectForList(QueryObject queryObject) {
            SqlSession sqlSession = MyBatisUtils.openSession();
            List<Product> list = sqlSession.selectList("cn.simplelife.dao.IProductDAO.selectForList",queryObject);
            sqlSession.commit();
            sqlSession.close();
            return list;
        }
    
        @Override
        public int selectForCount(QueryObject queryObject) {
            SqlSession sqlSession = MyBatisUtils.openSession();
            int totalCount = sqlSession.selectOne("cn.simplelife.dao.IProductDAO.selectForCount",queryObject);
            sqlSession.commit();
            sqlSession.close();
            return totalCount;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • mapper文件
        <select id="selectForList" resultType="cn.simplelife.domain.Product">
            SELECT *
            FROM product
            LIMIT #{beginIndex},#{pageSize}
        </select>
    
        <select id="selectForCount" resultType="int">
            SELECT COUNT(*)
            FROM product
        </select>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    【备注】: 业务层和表现层的实现这里不做演示。

  • 相关阅读:
    关于JavaScript关键字之一this解读
    使用Jetpack Compose构建Flappy Musketeer街机游戏
    命名空间提示“http://schemas.microsoft.com/xaml/behaviors”不存在Interation的解决办法
    记一次WPF集成SemanticKernel+OneAPI+讯飞星火认知大模型实践
    滚雪球学Java(09-3):Java中的逻辑运算符,你真的掌握了吗?
    k8s-服务网格实战-入门Istio
    4. ArrayList
    数据结构之队列
    Android实时获取音量(单位:分贝)
    外贸新人最全面的领英Linkedin开发客户方法(建议收藏)
  • 原文地址:https://blog.csdn.net/m0_37911124/article/details/127717214