mybatis的两种分页⽅式:RowBounds和PageHelper
1.
原理:。
使⽤⽅法:
RowBounds:在mapper.java中的⽅法中传⼊RowBounds对象
//接⼝⽅法
public List<Honor> getHonorList(HashMap<String, Object> maps,RowBounds rowBounds);
//调⽤⽅法
RowBounds rowBounds = new RowBounds(offset, PageSize()); // offset起始⾏ // limit是当前页显⽰多少条数据
RowBounds  rowBounds = new RowBounds(2, 2);
List<Honor> honors = HonorList(maps,rowBounds);
Mybatis使⽤RowBounds对象进⾏分页,它是针对ResultSet结果集执⾏的内存分页,⽽⾮物理分页,可以在sql内直接书写带有物理分页的参数来完成物理分页功能,也可以使⽤分页插件来完成物理分页。
分页插件的基本原理是使⽤Mybatis提供的插件接⼝,实现⾃定义插件,在插件的拦截⽅法内拦截待执⾏的sql,然后重写sql,根据dialect⽅⾔,添加对应的物理分页语句和物理分页参数。
举例:select * from student,拦截sql后重写为:select t.* from (select * from student)t limit 0,10
2.Mybatis的插件 PageHelper 分页查询使⽤⽅法
Mybatis的⼀个插件,PageHelper,⾮常⽅便mybatis分页查询。国内⽜⼈的⼀个开源项⽬,有兴趣的可以去看源码,都有中⽂注释(ps:某些源码⼀⼤堆英⽂,痛哭流涕!)
在github上仓库地址为:Mybatis-PageHelper
它⽀持基本主流与常⽤的数据库,这可以在它的⽂档上看到。这⾥记录⼀下使⽤的基本⽅法
0.查看⽂档与使⽤准备
开发⽂档有中⽂⽂档也有英⽂⽂档
PageHelper官⽅⽂档
官⽅地址
Maven依赖
<!-- mvnrepository/artifact/com.github.pagehelper/pagehelper -->
<!--mybatis pagehelper 分页  -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.8</version>
</dependency>
配置插件
这个是配置在l⽂件中
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<!-- config params as the following -->
<!--<!–分页参数合理化  –>-->
<property name="reasonable" value="true"/>
</plugin>
</plugins>
参数配置
分页插件参数介绍
分页插件提供了多个可选参数,这些参数使⽤时,按照上⾯两种配置⽅式中的⽰例配置即可。
分页插件可选参数如下:
dialect:默认情况下会使⽤ PageHelper ⽅式进⾏分页,如果想要实现⾃⼰的分页逻辑,可以实现Dialect(com.github.pagehelper.Dialect) 接⼝,然后配置该属性为实现类的全限定名称。
下⾯⼏个参数都是针对默认 dialect 情况下的参数。使⽤⾃定义 dialect 实现时,下⾯的参数没有任何作⽤。
1. helperDialect:分页插件会⾃动检测当前的数据库链接,⾃动选择合适的分页⽅式。你可以配置helperDialect属性来指定分页插件使⽤哪种
⽅⾔。配置时,可以使⽤下⾯的缩写值:
oracle,mysql,mariadb,sqlite,hsqldb,postgresql,db2,sqlserver,informix,h2,sqlserver2012,derby
特别注意:使⽤ SqlServer2012 数据库时,需要⼿动指定为sqlserver2012,否则会使⽤ SqlServer2005 的⽅式进⾏分页。
你也可以实现AbstractHelperDialect,然后配置该属性为实现类的全限定名称即可使⽤⾃定义的实现⽅法。
2. offsetAsPageNum:默认值为false,该参数对使⽤RowBounds作为分页参数时有效。当该参数设置为true时,会将RowBounds中
的offset参数当成pageNum使⽤,可以⽤页码和页⾯⼤⼩两个参数进⾏分页。
3. rowBoundsWithCount:默认值为false,该参数对使⽤RowBounds作为分页参数时有效。当该参数设置为true时,使⽤RowBounds分页会进⾏
count 查询。
4. pageSizeZero:默认值为false,当该参数设置为true时,如果pageSize=0或者RowBounds.limit = 0就会查询出全部的结果(相当于没有执⾏
分页查询,但是返回结果仍然是Page类型)。
5. reasonable:分页合理化参数,默认值为false。当该参数设置为true时,pageNum<=0时会查询第⼀页,pageNum>pages(超过总数时),
会查询最后⼀页。默认false时,直接根据参数进⾏查询。
6. params:为了⽀持startPage(Object params)⽅法,增加了该参数来配置参数映射,⽤于从对象中根据属性名取值,可以配
置pageNum,pageSize,count,pageSizeZero,reasonable,不配置映射的⽤默认值,默认值
为pageNum=pageNum;pageSize=pageSize;count=countSql;reasonable=reasonable;pageSizeZero=pageSizeZero。
7. supportMethodsArguments:⽀持通过 Mapper 接⼝参数来传递分页参数,默认值false,分页插件会从查询⽅法的参数值中,⾃动根据上
⾯params配置的字段中取值,查到合适的值时就会⾃动分页。使⽤⽅法可以参考测试代码中的com.st.basic包下的ArgumentsMapTest和ArgumentsObjTest。
8. autoRuntimeDialect:默认值为false。设置为true时,允许在运⾏时根据多数据源⾃动识别对应⽅⾔的分页(不⽀持⾃动选
择sqlserver2012,只能使⽤sqlserver),⽤法和注意事项参考下⾯的场景五。
9. closeConn:默认值为true。当使⽤运⾏时动态数据源或没有设置helperDialect属性⾃动获取数据库类型时,会⾃动获取⼀个数据库连接,
通过该属性来设置是否关闭获取的这个连接,默认true关闭,设置为false后,不会关闭获取的连接,这个参数的设置要根据⾃⼰选择的数据源来决定。
10. aggregateFunctions(5.1.5+):默认为所有常见数据库的聚合函数,允许⼿动添加聚合函数(影响⾏数),所有以聚合函数开头的函数,在
进⾏ count 转换时,会套⼀层。其他函数和列会被替换为 count(0),其中count列可以⾃⼰配置。
重要提⽰:
当offsetAsPageNum=false的时候,由于PageNum问题,RowBounds查询的时候reasonable会强制为false。使⽤PageHelper.startPage⽅法不受影响。
使⽤代码
//引⼊分页查询,使⽤PageHelper分页功能
//在查询之前传⼊当前页,然后多少记录
sqlserver2012数据库还原PageHelper.offsetPage(2, 2);
/
/startPage后紧跟的这个查询就是分页查询
List<Honor> honors = HonorList();
分页插件⽀持以下⼏种调⽤⽅式:
//第⼀种,RowBounds⽅式的调⽤
List<Country> list = sqlSession.selectList("x.y.selectIf", null, new RowBounds(0, 10));
//第⼆种,Mapper接⼝⽅式的调⽤,推荐这种使⽤⽅式。
PageHelper.startPage(1, 10);
List<Country> list = countryMapper.selectIf(1);
//第三种,Mapper接⼝⽅式的调⽤,推荐这种使⽤⽅式。
PageHelper.offsetPage(1, 10);
List<Country> list = countryMapper.selectIf(1);
/
/第四种,参数⽅法调⽤
//存在以下 Mapper 接⼝⽅法,你不需要在 xml 处理后两个参数
public interface CountryMapper {
List<Country> selectByPageNumSize(
@Param("user") User user,
@Param("pageNum") int pageNum,
@Param("pageSize") int pageSize);
}
//配置supportMethodsArguments=true
//在代码中直接调⽤:
List<Country> list = countryMapper.selectByPageNumSize(user, 1, 10);
/
/第五种,参数对象
//如果 pageNum 和 pageSize 存在于 User 对象中,只要参数有值,也会被分页
//有如下 User 对象
public class User {
//其他fields
//下⾯两个参数名和 params 配置的名字⼀致
private Integer pageNum;
private Integer pageSize;
}
//存在以下 Mapper 接⼝⽅法,你不需要在 xml 处理后两个参数
public interface CountryMapper {
List<Country> selectByPageNumSize(User user);
}
//当 user 中的 pageNum!= null && pageSize!= null 时,会⾃动分页
List<Country> list = countryMapper.selectByPageNumSize(user);
//第六种,ISelect 接⼝⽅式
//jdk6,7⽤法,创建接⼝
Page<Country> page = PageHelper.startPage(1, 10).doSelectPage(new ISelect() {
@Override
public void doSelect() {
countryMapper.selectGroupBy();
}
});
//jdk8 lambda⽤法
Page<Country> page = PageHelper.startPage(1, 10).doSelectPage(()-> countryMapper.selectGroupBy()); //也可以直接返回PageInfo,注意doSelectPageInfo⽅法和doSelectPage
pageInfo = PageHelper.startPage(1, 10).doSelectPageInfo(new ISelect() {
@Override
public void doSelect() {
countryMapper.selectGroupBy();
}
});
//对应的lambda⽤法
pageInfo = PageHelper.startPage(1, 10).doSelectPageInfo(() -> countryMapper.selectGroupBy());
//count查询,返回⼀个查询语句的count数
long total = unt(new ISelect() {
@Override
public void doSelect() {
countryMapper.selectLike(country);
}
});
//lambda
total = unt(()->countryMapper.selectLike(country));

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。