当前位置:

首页 > 编程开发 > 怎么用Java实现分页查询功能

怎么用Java实现分页查询功能

分页查询分页查询将数据库中庞大的数据分段显示,每页显示用户自定义的行数,提高用户体验度,最主要的是如果一次性从服务器磁盘中读出全部数据到内存,有内存溢出的风险真假分页假分页:其原理还是将所有的数据读到内存中,翻页从内存中读取数据,优点:实现简单,性能高缺点:如果数据大容易造成内存溢出真分页:每次翻页从数据库查询数据(即磁盘),优点:不容易造成内存溢出缺点:实现复杂,性能相对低一些分页效果一般分页的功能包括:首页上一页下一页末页当前是多少页总共多少页一共多少行数据跳转到第几页每页多少条数据我们需要将这个数据

本文目录

    分页查询

    分页查询将数据库中庞大的数据分段显示,每页显示用户自定义的行数,提高用户体验度,最主要的是如果一次性从服务器磁盘中读出全部数据到内存,有内存溢出的风险

    真假分页

    假分页: 其原理还是将所有的数据读到内存中,翻页从内存中读取数据, 优点: 实现简单,性能高 缺点:如果数据大容易造成内存溢出
    真分页: 每次翻页从数据库查询数据(即磁盘) , 优点 : 不容易造成内存溢出 缺点: 实现复杂,性能相对低一些

    分页效果

    一般分页的功能包括: 首页 上一页 下一页 末页 当前是多少页 总共多少页 一共多少行数据 跳转到第几页 每页多少条数据 我们需要将这个数据查询出来封装到一个对象中,体现了封装思想,也节省了很多复杂代码

    怎么用Java实现分页查询功能

    分页需要传递的参数

    需要用户传入的参数:
    currentPage: 当前页,跳转到第几页, 第一次访问,我们创建一个对象,默认值是1
    pageSize: 每页显示多少行数据, 第一次我们也给个默认值 比如10条

    分页需要展示的数据

    1.当前页的货品信息
    2.首页是第几页
    3.上一页是第几页
    4.下一页是第几页
    5.一共有多少页,和末页的值是一样的
    6.数据一共有多少条(行)
    7.当前是第几页
    8.每页显示多少条信息

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

    来源于用户上传: 当前页 , 每页显示多少条数据
    来源于数据库查询 : 数据总条数 , 每一页需要展示的商品信息
    来源于根据上面的已知信息计算 : 总页数 , 上一页 , 下一页

    书写从数据库查询的sql语句

    第一条sql 查询数据库中有多少条数据,COUNT后面不能有空格

    SELECT COUNT(*) FROM 表名

    第二条sql 根据传入的参数查询第几页,一页多少条数据的结果集

    # 第一个 ?:从哪一个索引的数据开始查询(默认从 0 开始)
    # 第二个 ?:查询多少条数据
    SELECT * FROM 表名 LIMIT ?, ?

    接下来分析第二条 SQL 中两个 ? 取值来源:
    假设 product 表中有 21 条数据,每页分 5 条数据:
    查询第一页数据:SELECT * FROM product LIMIT 0, 5
    查询第二页数据:SELECT * FROM product LIMIT 5, 5
    查询第三页数据:SELECT * FROM product LIMIT 10, 5
    查询第四页数据:SELECT * FROM product LIMIT 15, 5
    通过寻找规律发现:第一个 ? 取值来源于 (currentPage - 1) * pageSize;第二个 ? 取值来源于
    pageSize,即都来源于用户传递的分页参数。

    总页数,上一页和下一页

    // 优先计算总页数
    int totalPage = rows % pageSize == 0 ? rows / pageSize : rows / pageSize + 1;
    //上一页等于当前页-1,但不能超过1页界限
    int prevPage = currentPage - 1 >= 1 ? currentPage - 1 : 1;
    //下一页等于当前页+1,但不能超过总页数界限
    int nextPage = currentPage + 1 <= totalPage ? currentPage + 1 : totalPage;

    分页查询实现

    访问流程:

    怎么用Java实现分页查询功能

    封装需要展示的数据

    如果不封装数据,每个数据都需要存到作用域中,数据太分散,不方便统一管理

    /**
    * 封装结果数据(某一页的数据)
    */
    @Getter
    public class PageResult {
        // 两个用户的输入
        private int currentPage; // 当前页码
        private int pageSize; // 每页显示的条数
        // 两条 SQL 语句执行的结果
        private int totalCount; // 总条数
        private List data; // 当前页结果集数据
        // 三个程序计算的数据
        private int prevPage; // 上一页页码
        private int nextPage; // 下一页页码
        private int totalPage; // 总页数/末页页码
        // 分页数据通过下面构造期封装好
        public PageResult(int currentPage, int pageSize, int totalCount, List
        data) {
            this.currentPage = currentPage;
            this.pageSize = pageSize;
            this.totalCount = totalCount;
            this.data = data;
            // 计算三个数据
            this.totalPage = totalCount % pageSize == 0 ? totalCount / pageSize :
            totalCount / pageSize + 1;
            this.prevPage = currentPage - 1 >= 1 ? currentPage - 1 : 1;
            this.nextPage = currentPage + 1 <= this.totalPage ? currentPage + 1 :
            this.totalPage;
        }
    }

    持久层DAO

    Mybatis提供的操作方法只能传入一个参数执行SQL任务,而我们现在查询某一页的数据,需要知道是第几页和每页多少条数据这两个参数,所以我们需要将这两个参数封装在一个对象里面
    编写一个类(起名叫查询对象类)来封装这些查询数据

    @Setter
    @Getter
    /**
    * 封装分页查询需要的两个请求传入的分页参数
    */
    public class QueryObject {
        private int currentPage = 1; // 当前页码,要跳转到哪一页的页码(需要给默认值)
        private int pageSize = 3; // 每页显示条数(需要给默认值)
    }

    再书写持久层DAO接口和实现类

    //DAO接口提供两个根据查询对象的查询方法
    int queryForCount();
    List queryForList(QueryObject qo);
    //DAO实现类
    @Override
    //查询数据库总数据条数
    public int queryForCount() {
        SqlSession session = MyBatisUtil.getSession();
        int totalCount =
        session.selectOne("cn.xxx.mapper.ProductMapper.queryForCount");
        session.close();
        return totalCount;
    }
    @Override
    //查询某一页的结果集
    public List queryForList(QueryObject qo) {
        SqlSession session = MyBatisUtil.getSession();
        List products =
        session.selectList("cn.xxx.mapper.ProductMapper.queryForList",qo);
        session.close();
        return products;
    }

    修改productMapper.xml

    
    SELECT COUNT(*) FROM product
    
    
    SELECT * FROM product LIMIT #{start}, #{pageSize}
    

    修改QueryObject.java

    给这个类增加getStart方法,返回根据当前页,每页大小需要从数据库从第几行开始显示

    @Setter
    @Getter
    /**
    * 封装分页查询需要的两个请求传入的分页参数
    */
    public class QueryObject {
        private int currentPage = 1; // 当前页码,要跳转到哪一页的页码(需要给默认值)
        private int pageSize = 3; // 每页显示条数(需要给默认值)
        // 用于 Limit 子句第一个 ? 取值
        public int getStart(){
            return (currentPage - 1) * pageSize;
        }
    }

    业务层ProductService

    调用持久层DAO完成数据的查询,并将多个数据封装到一个对象中

    //IProductService接口
    public interface IProductService {
        /**
        * 完成查询某一页的业务逻辑功能
        */
        PageResult query(QueryObject qo);
    }
    //Service实现类
    public class ProductServiceImpl implements IProductService {
        private IProductDAO productDAO = new ProductDAOImpl();
        @Override
        public PageResult query(QueryObject qo) {
            // 调用 DAO 查询数据数量
            int totalCount = productDAO.queryForCount();
            // 为了性能加入判断,若查询的数据数量为 0,说明没有数据,返回返回空集合,即集合中没有
            元素
            if(totalCount == 0){
                return new PageResult(qo.getCurrentPage(), qo.getPageSize(),
                totalCount, Collections.emptyList());
            }
            // 执行到这里代表有数据,查询当前页的结果数据
            List products = productDAO.queryForList(qo);
            return new PageResult(qo.getCurrentPage(), qo.getPageSize(), totalCount,
            products);
        }
    }

    前台分页功能实现

    1.必须先完成业务层组件,保证后台测试通过。
    2.遵循 MVC 思想。
    3.浏览器发出分页请求参数(去往第几页/每页多少条数据),在 Servlet 中接收这些参数,并封装
    4.到 QueryObject 对象,调用 Service 中分页查询方法(query)。
    5.把得到的分页查询结果对象(PageResult)共享在请求作用域中,跳转到 JSP,显示即可。
    6.修改 JSP 页面,编写出分页条信息(分页条中的信息来源于 PageResult 对象)。

    修改ProductServlet.java和展示jsp

    1.获取页面请求参数,判断是查询操作,调用查询方法,获取分页参数
    2.将参数封装成查询对象QueryObject
    3.调用业务层方法查询某一页数据
    4.将查询出来的结果存到作用域中
    5.转发到展示页面jsp
    6.在jsp从作用域中将结果取出来响应到浏览器

    //创建业务层对象
    private IProductService productService = new ProductServiceImpl();
    
    protected void list(HttpServletRequest req, HttpServletResponse resp) throws
    ServletException, IOException {
        QueryObject qo = new QueryObject();
        // 获取请求参数 currentPage,并转型封装
        String currentPage = req.getParameter("currentPage");
        if(StringUtil.hasLength(currentPage)) {
            qo.setCurrentPage(Integer.valueOf(currentPage));
        }
        // 获取请求参数 pageSize,并转型封装
        String pageSize = req.getParameter("pageSize");
        if(StringUtil.hasLength(pageSize)) {
            qo.setPageSize(Integer.valueOf(pageSize));
        }
        // 调用业务层方法来处理请求查询某一页数据
        PageResult pageResult = productService.query(qo);
        // 把数据共享给 list.jsp
        req.setAttribute("pageResult", pageResult);
        // 控制跳转到 list.jsp 页面
        req.getRequestDispatcher("/WEB-INF/views/product/list.jsp").forward(req,
        resp);
    }

    修改jsp文件,使用JSTL+EL获取作用域中的数据

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    
        
            产品列表
            
                window.onload = function () {
                    var trClzs = document.getElementsByClassName("trClassName");
                    for(var i = 0; i < trClzs.length; i++){
                        trClzs[i].onmouseover = function () {
                            console.log(1);
                            this.style.backgroundColor = "gray";
                        }
                        trClzs[i].onmouseout = function () {
                            console.log(2);
                            this.style.backgroundColor = "";
                        }
                    }
                }
                // 分页 JS
                function changePageSize() {
                    document.forms[0].submit();
                }
            
        
        
            
            添加                                                            编号                     货品名                     分类编号                     零售价                     供应商                     品牌                     折扣                     进货价                     操作                                                                                ${status.count}                         ${product.productName}                         ${product.dir_id}                         ${product.salePrice}                         ${product.supplier}                         ${product.brand}                         ${product.cutoff}                         ${product.costPrice}                                                      删除                             修改                                                                                                                              首页                         上一页                         下一页                         尾页                         当前第 ${pageResult.currentPage} / ${pageResult.totalPage} 页                         一共 ${pageResult.totalCount} 条数据                         跳转到                              3                               5                               8                          条数据                                                                 

    常见问题

    若开始翻页操作成功,翻了几页不能翻了,只能重启tomcat才能翻,问题: DAO中没有关闭SqlSession对象

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 Java
    相关文章 更多
    Java单元测试入门:使用JUnit 5编写第一个测试用例
    Java单元测试入门:使用JUnit 5编写第一个测试用例

    面向初学者的JUnit 5实用入门指南。从测试概念、Maven依赖配置,到手把手编写首个单元测试用例及断言验证,助你掌握Java单元测试的核心流程。

    Java变量未初始化报错解析:局部变量与成员变量默认值差异
    Java变量未初始化报错解析:局部变量与成员变量默认值差异

    深入解析Java中局部变量未初始化编译报错与成员变量自动赋予默认值的机制差异,涵盖JVM内存分配、编译期确定性赋值检查与实际排查修复方案。

    Java获取当前时间并格式化输出:DateTimeFormatter与SimpleDateFormat
    Java获取当前时间并格式化输出:DateTimeFormatter与SimpleDateFormat

    详细讲解在Java中获取当前系统时间并进行格式化输出的两种核心方案:基于Java 8全新日期时间API的DateTimeFormatter与传统遗留的SimpleDateFormat,包含完整代码示例、线程安全机制对比及生产选型建议。

    Java中final与static final常量的定义及初始化规则
    Java中final与static final常量的定义及初始化规则

    深入解析Java中final变量与static final常量的定义、内存语义、初始化时机及合法赋值路径,涵盖编译期常量优化与实战避坑指南。

    Java抽象方法与接口方法的区别及选型建议
    Java抽象方法与接口方法的区别及选型建议

    深入对比Java中抽象类抽象方法与接口方法的语法演进、设计意图及运行期差异,并提供清晰的架构选型决策流程与实战范例。

    Java实现HTTP请求与JSON解析的完整代码示例
    Java实现HTTP请求与JSON解析的完整代码示例

    本文提供Java标准库HttpClient发起HTTP GET/POST请求并结合Jackson进行JSON数据反序列化与序列化的完整代码示例与工程实践指南。

    Java递归出现StackOverflowError的原因分析及栈空间优化方案
    Java递归出现StackOverflowError的原因分析及栈空间优化方案

    详细分析Java递归调用出现StackOverflowError的原因,结合代码说明线程栈、栈帧和递归深度之间的关系,并介绍终止条件排查、迭代改写、减少栈帧开销以及通过-Xss调整JVM栈空间的方法。

    Java空指针异常(NPE)的代码排查与修复实例
    Java空指针异常(NPE)的代码排查与修复实例

    针对Java中常见的NullPointerException(NPE),本文从堆栈日志定位、典型代码触发场景、具体修复代码对比到防御体系进行系统讲解,提供实用且易上手的排查与修复方案。

    selenium上传文件教程本地文件路径设置方法
    selenium上传文件教程本地文件路径设置方法

    深入解析Selenium处理文件上传的技术细节,涵盖标准HTML控件的路径直接注入法与非标准控件的系统级模拟方案,提供Windows与Linux环境下的路径设置最佳实践及常见异常排查。

    大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景
    大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景

    针对大数据工程场景,系统对比Java、Scala与Python在执行性能、生态结合、开发效率和维护成本上的核心差异,给出清晰的架构选型依据与落地方案。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。