Mybatis Plus 分页插件
TIP
MyBatis-Plus 内置了分页插件,支持物理分页,性能优于内存分页。
配置分页插件
java
@Configuration
public class MyBatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 分页插件(设置数据库类型)
PaginationInnerInterceptor pagination = new PaginationInnerInterceptor(DbType.MYSQL);
pagination.setMaxLimit(500L); // 单页最大限制
pagination.setOverflow(true); // 请求页超出总页数时回正
interceptor.addInnerInterceptor(pagination);
return interceptor;
}
}分页查询
java
// 创建分页对象(第1页,每页10条)
Page<User> page = new Page<>(1, 10);
// Mapper 层分页
Page<User> result = userMapper.selectPage(page, null);
// Service 层分页
Page<User> result = userService.page(new Page<>(1, 10));
// 获取分页信息
long total = result.getTotal(); // 总记录数
long pages = result.getPages(); // 总页数
List<User> records = result.getRecords(); // 当前页数据
boolean hasNext = result.hasNext(); // 是否有下一页
boolean hasPrev = result.hasPrevious(); // 是否有上一页带条件分页
java
// Mapper 层
Page<User> page = new Page<>(1, 10);
LambdaQueryWrapper<User> wrapper = Wrappers.lambdaQuery()
.ge(User::getAge, 18)
.orderByDesc(User::getCreateTime);
Page<User> result = userMapper.selectPage(page, wrapper);
// Service 层(更简洁)
Page<User> result = userService.page(
new Page<>(1, 10),
Wrappers.lambdaQuery(User.class).ge(User::getAge, 18)
);自定义分页
可以在 Mapper XML 中使用自定义分页:
java
// Mapper 接口
Page<UserVO> selectUserPage(Page<?> page, @Param("name") String name);xml
<select id="selectUserPage" resultType="com.example.vo.UserVO">
SELECT u.*, o.order_count
FROM user u
LEFT JOIN (SELECT user_id, COUNT(*) order_count FROM `order` GROUP BY user_id) o
ON u.id = o.user_id
<where>
<if test="name != null and name != ''">
AND u.name LIKE CONCAT('%', #{name}, '%')
</if>
</where>
</select>