分页查询

Jul 10, 2017 10:38:44 AM

概述

使用数据库的应用程序,多数情况下都需要使用 “分页” 这个功能。尤其是在 Web 应用程序中,后端的分页查询尤其的普遍。在以往的使用经验中,一个分页查询,除了能获取到一个列表外,我们通常需要如下几个信息才能在客户端显示出一个完整的翻页条。

  • 当前页数 — 第几页
  • 页大小 — 每页有多少条记录
  • 总页数 — 一共多少页
  • 总记录数 — 如果不分页,一共有多少条记录
    当我们获得了这四条信息后,对于维护一个翻页查询就足够。

Nutz.Dao 的查询接口天然就支持分页查询。

Dao 接口的第三个参数

让我们先看看 Nutz.Dao 接口查询函数的声明:

  1. <T> List<T> query(Class<T> classOfT, Condition condition, Pager pager);

这个接口有三个参数

  • classOfT 告诉 Nutz.Dao 需要查询的实体类型
  • condition 告诉 Nutz.Dao 查询出的列表需要符合的条件。详细请看 复杂条件
  • 最后一个参数,就是告诉 Nutz.Dao 将结果如何分页的了。
    Pager 对象有如下几个注意事项:

  • 如果 pager 被传入了 null,则不分页

  • 生成 Pager 对象的时候需要传入 “当前页数” 和 “页大小”
  • Pager 虽然有 getRecordCount() 和 getPageCount() 方法,但是它不会自动被设值 — 因为考虑到效率
  • 通过 Pager.setRecordCount() 可以为 Pager 设置结果集的总数,Pager 会通过 getPageCount() 返回总页数
  • 分页页数从1开始算,如果页数是0,代表不分页,请特别注意.

将分页信息和查询结果一起返回

  1. public QueryResult getPetList(Dao dao, int pageNumber, int pageSize){
  2. Pager pager = dao.createPager(pageNumber, pageSize);
  3. List<Pet> list = dao.query(Pet.class, null, pager);
  4. pager.setRecordCount(dao.count(Pet.class));
  5. return new QueryResult(list, pager);
  6. }

Nutz 会自动为各种不同的数据库,根据你传入的 Pager 生成翻页方言。但是考虑到效率因素,Nutz.Dao 并不会为 Pager 计算结果集的总数。我知道这那么一点点让人觉得有点不方便,但是我想给你控制权,我想让你可以: "只在必要的时候才计算结果集的总数",我想,这个控制权对你来说,比少写一行CRUD代码更加重要,对吗?

本页面的文字允许在知识共享 署名-相同方式共享 3.0协议GNU自由文档许可证下修改和再使用。

原文: http://nutzam.com/core/dao/pager.html