从
MyBatis-Plus 3.4.0
开始,不再使用旧版本的PaginationInterceptor
,而是使用MybatisPlusInterceptor
。
下面是MyBatis-Plus 3.4.3.3
新版分页的使用方法。
使用分页插件需要配置MybatisPlusInterceptor
,将分页拦截器添加进来:
@Configuration
public class MyBatisPlusConfig {
/**
* 分页插件配置
*
* @return
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 向MyBatis-Plus的过滤器链中添加分页拦截器,需要设置数据库类型(主要用于分页方言)
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}
和分页功能有关的类是Page
类,构造分页参数的方法:
Page<UserEntity> page = new Page<>(1, 1);
1
开始),第二个参数是分页大小。使用的时候只需要将创建的
Page
对象作为第一个参数传入即可。
首先,定义接口:
@Mapper
public interface UserMapper extends BaseMapper<UserEntity> {
/**
* 测试分页插件
*
* @param page
* @return
*/
Page<UserEntity> testPage(Page<UserEntity> page);
}
然后,编写SQL
:
DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.tao.adminserver.mapper.UserMapper">
<resultMap id="baseResultMap" type="com.tao.adminserver.entity.UserEntity">
<id column="id" property="id" jdbcType="BIGINT" javaType="java.lang.Long"/>
<result column="name" property="name" jdbcType="VARCHAR" javaType="java.lang.String"/>
<result column="age" property="age" jdbcType="INTEGER" javaType="java.lang.Integer"/>
<result column="email" property="email" jdbcType="VARCHAR" javaType="java.lang.String"/>
resultMap>
<select id="testPage" resultMap="baseResultMap">
select * from tb_user
select>
mapper>
SQL
中不需要用limit
来手动分页,分页插件会自己加上的。
最后,来测试一下:
@Test
public void testPage() {
// 分页查第一页
Page<UserEntity> page = new Page<>(1, 2);
Page<UserEntity> pageResult = userMapper.testPage(page);
System.out.println(JSON.toJSONString(pageResult));
// 分页查第二页
page = new Page<>(2, 2);
pageResult = userMapper.testPage(page);
System.out.println(JSON.toJSONString(pageResult));
}
注意:参数和结果都是用
Page
对象来包装。
控制台打印的日志:
==> Preparing: SELECT COUNT(*) FROM tb_user
==> Parameters:
<== Columns: COUNT(*)
<== Row: 3
<== Total: 1
==> Preparing: select * from tb_user LIMIT ?
==> Parameters: 2(Long)
<== Columns: id, name, age, email
<== Row: 7, Mike, 40, [email protected]
<== Row: 8, Tank, 40, [email protected]
<== Total: 2
......
==> Preparing: SELECT COUNT(*) FROM tb_user
==> Parameters:
<== Columns: COUNT(*)
<== Row: 3
<== Total: 1
==> Preparing: select * from tb_user LIMIT ?,?
==> Parameters: 2(Long), 2(Long)
<== Columns: id, name, age, email
<== Row: 9, Adele, 22, [email protected]
<== Total: 1
可以看出,分页之后,首先count
计算了总数,然后在查询的时候自动加上了limit
语句。
分页结果对象如下:
{
"current": 1, // 当前是第几页
"optimizeCountSql": true,
"orders": [],
"pages": 2, // 总共有几页
"records": [ // 当前页的记录详细信息
{
"age": 40,
"email": "[email protected]",
"id": 7,
"name": "Mike"
},
{
"age": 40,
"email": "[email protected]",
"id": 8,
"name": "Tank"
}
],
"searchCount": true,
"size": 2, // 当前页的数据量(分页大小)
"total": 3 // 数据总量
}