说明
mybatis plus内置的是逻辑分页,保存在内存中,而不是硬盘上。因此引入分页插件,实现物理分页,在数据量大时,物理分页比逻辑分页有优势。
参考 官方文档
分页插件
以admin-module微服务模块为示例,进行分页查询示例。
添加配置类MybatisPlusConfig
package com.admin.module.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.autoconfigure.ConfigurationCustomizer;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MybatisPlusConfig {
/**
* 新的分页插件,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
// 版本迭代,setUseDeprecatedExecutor方法已弃用,无需配置
// @Bean
// public ConfigurationCustomizer configurationCustomizer() {
// return configuration -> configuration.setUseDeprecatedExecutor(false);
// }
}
测试分页效果
package com.admin.module.controller;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.commons.school.entity.SchoolAdmin;
import com.commons.school.mapper.SchoolAdminMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@RestController
class SchoolAdminController {
@Autowired
private SchoolAdminMapper schoolAdminMapper;
// 获取某个学校的全部管理员信息,分页测试接口
@GetMapping("/schoolAdmin/getAdminList")
public Map<String, Object> getAdminList(
@RequestParam("sid") Long sid, @RequestParam("page") int pageNum, @RequestParam("size") int pageSize
) {
//查询第pageNum页,每页pageSize条数据
Page<SchoolAdmin> page = new Page<>(pageNum, pageSize);
// 构建查询对象
SchoolAdmin SchoolAdmin = new SchoolAdmin();
SchoolAdmin.setSid(sid);
// 查询条件
QueryWrapper<SchoolAdmin> schoolAdminQueryWrapper = new QueryWrapper<>(SchoolAdmin);
// 分页查询
Page<SchoolAdmin> schoolAdminPage = schoolAdminMapper.selectPage(page, schoolAdminQueryWrapper);
List<SchoolAdmin> records = schoolAdminPage.getRecords();
// 返回信息
Map<String, Object> result = new HashMap<>();
result.put("code", 1);// 状态码
result.put("msg", "success");// 信息
result.put("length", records.size());// data长度
result.put("data", JSONObject.toJSON(records));
return result;
}
}
测试类
/**
* 分页测试
* @param sid
* @param page
* @param size
*/
public void testSelectPage(Long sid, int page, int size) {
String CHECK_CODE_URI =
"http://localhost:8071/schoolAdmin/getAdminList?sid={sid}&page={page}&size={size}";
String uriString = UriComponentsBuilder.fromUriString(CHECK_CODE_URI)
.buildAndExpand(sid, page, size).toString();
JSONObject result = restTemplate.getForObject(uriString, JSONObject.class);
assert result != null;
log.info("result[] => {}",result.toJSONString());
}
运行测试
先启动主类再启动测试类。
测试通过,但是数据不好看,用postman效果比较好:
分页插件功能正常,但单表查询是不够的,在此基础上做联表查询,使用的是xml方式,没有使用注解方式是个人觉得xml方式比较灵活。
联表分页查询
在mapper自定义一个分页方法
package com.commons.school.mapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.commons.school.entity.SchoolAdmin;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* Mapper 接口
* </p>
*
* @author yushanma
* @since 2021-05-25
*/
public interface SchoolAdminMapper extends BaseMapper<SchoolAdmin> {
/**
* <p>
* 查询 : 根据sid状态查询学校管理员,分页显示
* </p>
*
* @param page 分页对象,xml中可以从里面进行取值,传递参数 Page 即自动分页,必须放在第一位(你可以继承Page实现自己的分页对象)
* @param sid 学校id
* @return 分页对象
*/
IPage<SchoolAdmin> selectAdminPage(Page<?> page, Long sid);
}
Mapper.xml 编写一个普通 list 查询,交付mybatis-plus 自动分页
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.commons.school.mapper.SchoolAdminMapper">
<select id="selectAdminPage" resultType="com.commons.school.entity.SchoolAdmin">
SELECT b.id,b.username,b.sid,b.reg_time,b.roles,b.status
FROM dgut_school a,dgut_school_admin b
WHERE a.id = b.sid
AND a.id = #{sid}
</select>
</mapper>
调用自定义分页查询方法
运行测试
测试通过,在xml中没有选中的字段全部都是null:
指定一个不存在的sid时返回长度为0的data: