Mybatis-PageHelper分页插件,这个插件功能强大且易于使用,支持多种数据库的物理分页,并且在自定义配置方面也非常灵活。今天,我将通过实战的方式,详细介绍如何在项目中使用Mybatis-PageHelper。
一、引入Mybatis-PageHelper
首先,我们需要在项目中引入Mybatis-PageHelper。有两种方式可以实现:直接引入jar包或者使用Maven方式引入。在这里,我推荐使用Maven方式,因为它可以自动管理依赖,并且更新起来也非常方便。
在pom.xml
中添加以下依赖:
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>最新版本号</version>
</dependency>
二、配置拦截器
接下来,我们需要在MyBatis配置xml文件或者Spring配置文件中配置拦截器插件。
在MyBatis配置xml文件中配置:
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<property name="helperDialect" value="mysql"/>
<!-- 其他参数配置 -->
</plugin>
</plugins>
在Spring配置文件中配置:
如果你使用的是Spring框架,那么可以在Spring配置文件中进行如下配置:
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="plugins">
<array>
<bean class="com.github.pagehelper.PageInterceptor">
<property name="helperDialect" value="mysql"/>
<!-- 其他参数配置 -->
</bean>
</array>
</property>
</bean>
三、插件参数详解
Mybatis-PageHelper提供了多个可选参数,以下是一些常见参数的详细介绍:
-
helperDialect:分页插件会自动检测当前的数据库链接,自动选择合适的分页方式。通过配置
helperDialect
属性来指定分页插件使用哪种数据库方言。例如,mysql
、oracle
等。 -
offsetAsPageNum:该参数对使用
RowBounds
作为分页参数时有效。当该参数设置为true
时,会将RowBounds
中的offset
参数当成pageNum
使用,可以用页码和页面大小两个参数进行分页。 -
rowBoundsWithCount:该参数对使用
RowBounds
作为分页参数时有效。当该参数设置为true
时,使用RowBounds
分页会进行count
查询。 -
pageSizeZero:该参数设置为
true
时,如果pageSize=0
或者RowBounds.limit=0
就会查询出全部的结果(相当于没有执行分页查询,但是返回结果仍然是Page
类型)。 -
reasonable:分页合理化参数,当该参数设置为
true
时,pageNum<=0
时会查询第一页;pageNum>pages
(超过总数时),会查询最后一页。 -
params:该参数来配置参数映射,用于从对象中根据属性名取值。
-
supportMethodsArguments:支持通过Mapper接口参数来传递分页参数,分页插件会从查询方法的参数值中,自动根据
params
配置的字段中取值,查找到合适的值时就会自动分页。 -
autoRuntimeDialect:允许在运行时根据多数据源自动识别对应方言的分页。
-
closeConn:当使用运行时动态数据源或没有设置
helperDialect
属性自动获取数据库类型时,会自动获取一个数据库连接,通过该属性来设置是否关闭获取的这个连接。
四、调用方式实战
接下来,我将通过实战的方式介绍Mybatis-PageHelper的几种调用方式。
第一种:RowBounds方式的调用
List<User> list = sqlSession.selectList("x.y.selectIf", null, new RowBounds(0, 10));
这种方式比较直接,但是推荐使用Mapper接口方式,因为更加简洁和易读。
第二种:Mapper接口方式的调用(推荐)
PageHelper.startPage(1, 10);
List<User> list = userMapper.selectIf(1);
这种方式通过PageHelper.startPage(pageNum, pageSize)
来设置分页参数,然后直接调用Mapper接口的方法即可。
第三种:Mapper接口方式的另一种调用(也推荐)
PageHelper.offsetPage(1, 10);
List<User> list = userMapper.selectIf(1);
PageHelper.offsetPage(offset, limit)
方法与startPage
类似,只是参数不同。
第四种:参数方法调用
如果Mapper接口方法中有分页参数,可以通过配置supportMethodsArguments=true
来自动分页。
public interface CountryMapper {
List<User> selectByPageNumSize(@Param("user") User user, @Param("pageNum") int pageNum, @Param("pageSize") int pageSize);
}
// 在代码中直接调用:
List<User> list = userMapper.selectByPageNumSize(user, 1, 10);
第五种:参数对象调用
如果分页参数存在于一个对象中,只要该对象中的分页参数有值,也会被自动分页。
public class User {
// 其他fields
private Integer pageNum;
private Integer pageSize;
}
public interface CountryMapper {
List<User> selectByPageNumSize(User user);
}
// 当user中的pageNum!= null && pageSize!= null时,会自动分页
List<User> list = userMapper.selectByPageNumSize(user);
第六种:ISelect接口方式
对于复杂的查询,可以使用ISelect
接口来实现。
// jdk6,7用法,创建接口
Page<User> page = PageHelper.startPage(1, 10).doSelectPage(new ISelect() {
@Override
public void doSelect() {
userMapper.selectGroupBy();
}
});
// jdk8 lambda用法
Page<User> page = PageHelper.startPage(1, 10).doSelectPage(()-> userMapper.selectGroupBy());
// 也可以直接返回PageInfo
PageInfo<User> pageInfo = PageHelper.startPage(1, 10).doSelectPageInfo(new ISelect() {
@Override
public void doSelect() {
userMapper.selectGroupBy();
}
});
// 对应的lambda用法
pageInfo = PageHelper.startPage(1, 10).doSelectPageInfo(() -> userMapper.selectGroupBy());
count查询
有时候我们只需要查询总记录数,可以使用PageHelper.count
方法。
// 匿名内部类用法
long total = PageHelper.count(new ISelect() {
@Override
public void doSelect() {
userMapper.selectLike(user);
}
});
// lambda用法
total = PageHelper.count(()->userMapper.selectLike(user));
五、实战结果展示
假设我们有一个用户表,并且使用第二种调用方式进行分页查询,查询第一页,每页10条记录。以下是可能的查询结果和日志输出:
查询结果:
List<User> list = userMapper.selectIf(1); // 假设这个方法是根据某个条件查询用户
for (User user : list) {
System.out.println(user);
}
日志输出(假设使用MyBatis的日志功能):
DEBUG [main] - ==> Preparing: SELECT * FROM user WHERE some_condition LIMIT ?,?
DEBUG [main] - ==> Parameters: 0(Integer), 10(Integer)
DEBUG [main] - <== Total: 10
User{id=1, name='Alice', ...}
User{id=2, name='Bob', ...}
...
可以看到,Mybatis-PageHelper自动为我们生成了分页的SQL语句,并且正确地返回了分页结果。
六、总结
Mybatis-PageHelper是一个非常实用的分页插件,支持多种数据库和自定义配置。通过简单的配置和调用,就可以实现复杂的分页功能。在实际项目中,我强烈推荐使用这个插件来处理分页问题。希望这篇文章对你有所帮助,如果你有任何问题或者建议,欢迎留言交流。