一、分页查询简介:

  • 当一个操作数据库进行查询的语句返回的结果集内容如果过多,那么内存极有可能溢出,所以在查询中含有大数据的情况下分页是必须的。

二、分页查询分类:

  1. 物理分页:
  • 在数据库执行查询时(实现分页查询),查询需要的数据—依赖数据库的SQL语句
  • 在SQL查询时,从数据库只检索分页需要的数据
  • 通常不同的数据库有着不同的物理分页语句
  1. 逻辑分页:
  • 在sql查询时,先从数据库检索出所有数据的结果集,在程序内,通过逻辑语句获得分页需要的数据

三、Mysql 分页查询实现:

# LIMIT 子句
SELECT  投影列 FROM  表名 WHERE  条件 ORDER BY LIMIT  开始位置,查询数量;

# LINIT OFFICT 子句
SELECT  投影列 FROM  表名 WHERE  条件 ORDER BY LIMIT  查询数量 OFFSET 开始位置;

查询原则:

  1. MYSQL 分页中开始位置为 0。
  2. 分页子句在查询语句的最后侧。
  3. 分页公式:(当前页-1)*每页大小

四、创建 Page 模型

  • 在一个分页页面,除了要展示的结果集,还要显示当前页、当前页条数、此次条件查询总条数,总页数等额外信息,可是 SQL 查询的单次结果只有一个数据,所以我们需要把这些数据项收集起来放到数据模型当中,返回该数据模型。

我们可以创建一个Page对象

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Page<T> {
    //当前页
    private int currentPage;
    //每页显示的条数
    private int pageSize;
    //总条数
    private int totalCount;
    //总页数
    private int totalPage;
    //结果集
    private List<T> result;
}

再写一个分页查询的方法

@Data
@AllArgsConstructor
@NoArgsConstructor
public class PageService {
    private PageMapper pageMapper;

     /**
     *  条件分页查询
     *  
     * @param page 分页信息
     * @param condition 查询条件
     * @return page对象
     */
    public Page<Users> queryByPage(Page page, String condition) {
        int count = pageMapper.queryCount(page, condition);
        // TODO: 计算总页数等信息,填入Page对象中
        // 计算总页数: 向上转型
        page.setTotalPage((int) Math.ceil(1.0 * (count / page.getPageSize())));
        List<Users> res = pageMapper.queryByPage(page, condition);
        // TODO: 数据填入Page对象,返回Page对象
        return page;
    }
}

mapper: 暂时写一个伪代码

public class PageMapper {
    
    /**
     * 统计总数
     * 
     * @param page 分页信息
     * @param condition 查询条件
     * @return 总条数
     */
    public int queryCount(Page page, String condition) {
        // TODO: 实际是连接数据库查询总条数 select count(*) from table where name = condition;
        return 1;
    }

    /**
     * 数据库分页查询
     *  
     * @param page 分页信息
     * @param condition 查询条件
     * @return 查询结果数据集合
     */
    public List queryByPage(Page page, String condition) {
        int start = (page.getCurrentPage() - 1) * page.getPageSize();
        int end = page.getPageSize();
        // TODO: 实际是连接数据库条件查询 select * from table where name = condition limit start, end;
        return new ArrayList<>();
    }
}

五、 MyBatis分页插件 – PageHelper

  • PageHelper是一款非常好用的开源免费的Mybatis第三方分页插件。使用该插件时,只要传入分页参数,即可自动生成页面对象。分页插件和持久层接口是完全不耦合的,分页插件的主要功能是帮我们封装查询结果。

我们使用该插件分页查询所有用户

<!-- PageHelper -->
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>5.3.0</version>
</dependency>

Mybatis配置文件中配置PageHelper插件

<plugins>
    <!-- 配置分页插件 -->
    <plugin interceptor="com.github.pagehelper.PageInterceptor">
        <!-- 因为不同数据库的分页查询关键字不同,所以要设置数据库类型 -->
        <property name="helperDialect" value="mysql"/>
    </plugin>
</plugins>

使用分页插件

@Test
public void testFindPage() {
    // 查询前设置分页参数,参数一:页数,从1开始。参数二:每页条数
    PageHelper.startPage(1, 3);
    // 正常查询
    List<Users> all = userMapper.queryAll();
    // 创建页面对象,将查询结果传入,并且里面会封装需要的Page信息
    PageInfo pageInfo = new PageInfo(all);
    // TODO: 返回PageInfo对象

原文地址:http://www.cnblogs.com/zygln/p/16907327.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性