列表查询后分页逻辑

Posted jinlang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了列表查询后分页逻辑相关的知识,希望对你有一定的参考价值。

一、你需要先创建一个bean对象(也就是page对象)

  1. 创建出你需要的属性比如在我的项目中我需要用到的:有当前的页码currentPage
  2. 当前的页显示的数量currentCount
  3. 你从数据库中查询得到的所有数据总和totalCount(这个你需要在dao层定义方法实现并把得到的数据返回给service层)
  4. 一共需要分多少页totalPage(这个需要你去计算通过查询所有的数据总和/currentCount,还用到了math.ceil()方法)
  5. 最后生成setter和getter方法

二、在servlet层去调用service层实现已经写好的方法

   public void getCategoryList(HttpServletRequest request, HttpServletResponse response) throws SQLException, ServletException, IOException {

        //为了是实现分页功能,这里需要从前端页面得到两个参数currentPage,currentCount 然后转为int类型
        int  currentPage = Integer.parseInt(request.getParameter("currentPage"));
        int  currentCount = Integer.parseInt(request.getParameter("currentCount"));
        //最后如果网页第一次没有给我们传入参数值的时候,我们需要自己设置默认值
        if (currentPage==0){
            currentPage=1;
        }
        if (currentCount==0){
            currentCount=10;
        }
        // 1 调用service中的查询方法
        CategoryService service = new CategoryService();
        Page page= service.findPageCategory(currentPage,currentCount);//这个地方返回的也是一个page类
        if (page!=null) {
            //这个部分肯定有问题
            request.setAttribute("page",page);
            request.getRequestDispatcher("/category-list.jsp").forward(request,response);
        }else {
            request.getRequestDispatcher("/category-list.jsp").forward(request,response);
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  1. 先创建一个service层的对象
  2. 然后在service层去创建一个方法 findPageCategory,这个方法就是为了获取到跟分页有关的所有的属性(也就是totalPage,totalCount)

(1)如何得到totalPage,totalCount这两个参数呢?(service层)

  1. 需要先创建一个dao层的categoryDao对象来从数据库中取出数据
  2. totalCount可以直接得到结果,而totalPage需要计算(用totalCount/currentCount)
  3. 把所得到的四个page属性都设置给page实体类(用setAttribute方法)
  4. 到这还需要重新定义一个startPosition(也就是在后面用SQL语句的limit中需要用到的那个参数,每次查询的起始位置)
  5. 规律就是规律就是:每次查询的起始位置=(当前的的页面-1)*每页固定显示的数据
public Page findPageCategory(int currentPage,int currentCount ) throws SQLException {

        Page page = new Page();

        CategoryDao dao = new CategoryDao();
        int totalCount = dao.queryCount();
        /*也是为了根据总共数据的总数除以 当前显示的总页数,来得到一共的页码数
这里用到了一个math函数的一个方法,就是只要这个数是小数,就要让这个数往上加一,如1.2  就是2  0.8  就是1
        *   总数   每页显示的数目   总页数
        *   9           10        0.9      1
        *   14          10        1.4      2
        */
        //要保证ceil跟的是一个double类型
        int  totalPage = (int) Math.ceil(1.0*totalCount / currentCount);
        //然后使用page的实体类,去把每一个属性设置进去
            page.setCurrentCount(currentCount);
            page.setCurrentPage(currentPage);
            page.setTotalCount(totalCount);
            page.setTotalPage(totalPage);


        /*
        * 这里使用到了一个SELECT  * FROM category LIMIT 1,3(1表示开始查询的位置从0开始,3表示要查询多少条数据)
        *   页数          每页显示的数据         查询的起始位置
        *   1               10                      0
        *   2                10                     10
        *   3               10                      20
        *   规律就是(当前的的页面-1)*每页固定显示的数据 = 每次查询的起始位置
        *   (currentPage-1)*currentCount = 起始位置
        * */
        //计算出每次查询的起始位置
        int startPosition = (currentPage-1)*currentCount;
        //分页查询数据,拿到DAO层的返回生鲜种类的集合,在service层进行调用,返回的也是一个生鲜的种类集合
        List<Category> categories = dao.queryPageCategoryList(startPosition, currentCount);
        //把集合封装到page类中
        page.setList(categories);

        return page;
    }
  • 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

三、在Dao层去实现两个方法

  1. 是查询数据库中的所有数据总和
public int queryCount() throws SQLException {

        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        QueryRunner queryRunner=new QueryRunner(dataSource);
        String sql = "select count(*) category ";
        //如果使用聚合函数的话,就必须new出来一个 ScalarHandler<>()来储存数据,最后返回的还是一个Long类型的值
        Long query = queryRunner.query(sql, new ScalarHandler<>());
        //还需要把Long类型转为int类型
        return query.intValue();
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  1. 分页查询数据(也就是使用SQL中聚合语句limit去查询数据limit数据后面的第一个数据是查询的起始位置,第二个参数表示每个分页查询多少条数据)
  public List<Category> queryPageCategoryList(int startPosion, int currentCount) throws SQLException {

        ComboPooledDataSource dataSource= new ComboPooledDataSource();
        QueryRunner queryRunner= new QueryRunner(dataSource);
        String sql = "select * from category limit ?,?";
        //如果用到query的话 就需要把数据给封装到BeanListHandler中,返回的是一个生鲜种类的集合
        //如果是SQL语句中需要参数的话,先用问号代替,然后在query方法中的新建的那个BeanListHandler后面加上参数
        List<Category> categoryList = queryRunner.query(sql, new BeanListHandler<Category>(Category.class),startPosion,currentCount);
        return categoryList;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
            <link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-60ecaf1f42.css" rel="stylesheet">
                            </div>
</article>

以上是关于列表查询后分页逻辑的主要内容,如果未能解决你的问题,请参考以下文章

如何先分页显示数据再查询后分页显示查询数据

这个sql语句怎么先排序后分页

Elasticsearch聚合后分页

es多字段聚合,聚合后分页,聚合后having等操作

Composite 聚合——Elasticsearch 聚合后分页新实现

jQuery页面替换+php代码实现搜索后分页