这是我参与8月更文挑战的第14天,活动详情查看:8月更文挑战
上文Mybatis之动态SQL介绍了Mybatis中很常用的动态标签,本来继续来介绍一下在Mybatis中十分常用的分页查询。废话不多说,开始今天的内容。
准备
- 查询参数的POJO中,在
offset
参数的get方法中,对offset
的值进行了相应的计算。 - 查询结果的POJO中,在构造方法中对总页数
pages
进行了相应的计算。
1 | java复制代码// 封装查询参数的POJO |
- 数据库数据
手写limit分页
- 顾名思义,这种方法就是我们自己在SQL中添加
limit
关键字来实现分页;
1 | xml复制代码<select id="findPageByHand" parameterType="org.apache.ibatis.z_run.pojo.QueryCondition" resultType="org.apache.ibatis.z_run.pojo.Purchase"> |
- 另外,为了返回一个总条数,我们还得单独再写一条SQL,用于统计分页查询的总条数,在计算总页数的时候使用。
1 | xml复制代码<select id="count" parameterType="org.apache.ibatis.z_run.pojo.QueryCondition" resultType="java.lang.Integer"> |
- 测试代码及返回结果
1 | java复制代码int pageSize = 2; |
1 | txt复制代码DEBUG [main] - ==> Preparing: select count(1) from ( select id, `name`, price, category from purchase ) t1 |
RowBounds分页
RowBounds
对象是Mybatis提供的一个分页类,只需要在查询的方法参数中加上这个对象即可使用。
1 | xml复制代码<select id="findPageByRowBounds" parameterType="org.apache.ibatis.z_run.pojo.QueryCondition" resultType="org.apache.ibatis.z_run.pojo.Purchase"> |
- 使用
RowBounds
对象后,就不需要在SQL语句中写limit
语句了,但是仍然要对满足条件的数据条数进行单独查询,其结果将用于计算总页数,语句同上。 - 测试代码及返回结果
1 | java复制代码 int pageSize = 2; |
1 | txt复制代码DEBUG [main] - ==> Preparing: select count(1) from ( select id, `name`, price, category from purchase ) t1 |
- 可以看到,使用
RowBounds
进行分页时,SQL语句中并没有添加limit
关键字进行分页,这是因为RowBounds
分页是将所有的数据查询到内存中以后,再使用RowBounds
参数进行分页的,对内存的压力很大,性能很低,因此这种方式不建议使用。
分页插件
- 这里主要介绍目前使用最广泛的Pagehelper插件。Pagehelper插件的原理是使用拦截器拦截SQL语句的执行,并为SQL语句添加
limit
关键字进行分页查询,以及count语句来查询总数(就不需要我们自己手写count方法来计算数据总条数了)。 - 导入依赖
1 | xml复制代码<!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper --> |
- 配置文件
1 | xml复制代码<plugins> |
- XML语句同
RowBounds
相同,不需要在SQL语句中写limit
关键字。
1 | java复制代码<select id="findByCondition" parameterType="org.apache.ibatis.z_run.pojo.QueryCondition" resultType="org.apache.ibatis.z_run.pojo.Purchase"> |
- 测试代码及查询结果。查询结果的总条数以及总页数都可以在
Page
对象中直接获取。
1 | java复制代码int pageSize = 2; |
1 | txt复制代码DEBUG [main] - ==> Preparing: SELECT count(0) FROM purchase |
Tips
- Mybatis配置文件的标签顺序是有讲究的,如果顺序出问题,是会报错的。例如:
1 | xml复制代码<!--指定Mapper.xml所在位置--> |
- 此时,配置文件报错,内容如下:
- 运行项目报错,内容大体如下:
1 | txt复制代码org.apache.ibatis.exceptions.PersistenceException: |
以上便是对于Mybatis中分页方式的介绍,一般来说,使用Pagehelper更为方便,但是引入第三方插件之后可能会有一些bug,需要在遇到之后进行仔细的排查。而自己手写分页不容易出现问题,但是比较麻烦。具体情况具体分析,根据自身情况挑选适合自己的方式:)
本文转载自: 掘金