假设一个常见的员工分页查询功能
/**
* 员工信息分页查询
*
* @param page
* @param pageSize
* @param name
* @return
*/
@GetMapping("/page")
public R<Page> page(int page, int pageSize, String name) {
//构造分页构造器
Page pageInfo = new Page(page,pageSize);
//构造条件构造器
LambdaQueryWrapper<Employee> queryWrapper = new LambdaQueryWrapper();
//添加过滤条件,name不等空
queryWrapper.like(StringUtils.isNotEmpty(name),Employee::getName,name);
//添加排序条件
queryWrapper.orderByDesc(Employee::getUpdateTime);
//执行查询
employeeService.page(pageInfo,queryWrapper);
return R.success(pageInfo);
}
解读代码
第一个要点:
R<Page>其中这个Page是来自框架中定义好的一个实体类,里面都是跟分页信息有关的对象例如:
private static final long serialVersionUID = 8545996863226528798L; // 序列化版本号,确保类的版本控制
protected List<T> records; // 数据记录列表,存储查询结果中的实体对象集合
protected long total; // 总记录数,查询不分页时的总行数
protected long size; // 每页显示数量,每页包含的记录数
protected long current; // 当前页码,标识当前查询页
protected List<OrderItem> orders; // 排序规则列表,定义结果集的排序方式
protected boolean optimizeCountSql; // 是否优化计数SQL,启用时优化统计总数的SQL执行效率
protected boolean isSearchCount; // 是否进行总数查询,false时跳过总数查询提高性能
protected boolean hitCount; // 是否命中计数缓存,表明总记录数是否从缓存中获取
protected String countId; // 计数SQL的ID,用于区分不同情况下的计数逻辑
protected Long maxLimit; // 最大限制值,限制单次查询最多可获取的记录数,防止数据提取过多影响性能
第二个要点:
创建一个page()分页对象,将前端提交的请求中int page通常指的是当前页,int pageSize一般指的是每页应该显示的行数,比如page=2,pageSize=10,并将这俩参数赋值给page()对象中,方便使用。如果不加【其他限制】,mybatisPlus帮我们执行分页查询的源代码如下:
<E extends IPage<T>> E selectPage(E page, @Param("ew") Wrapper<T> queryWrapper);
其中,E page就是我们之前提到的分页对象,E代表返回值类型,如果没有queryWrapper对象的话,即我们刚刚所说的【其他限制】,那么真正执行的SQL语句则是:
SELECT * FROM `t_name` LIMIT 2 , 10;
也可以是
SELECT * FROM `t_name` LIMIT 2 OFFSET 10;
第三个要点:
@Param("ew") Wrapper<T> queryWrapper对象,queryWrapper 是一个包装器,它封装了SQL查询条件。Wrapper<T> 可以是 LambdaQueryWrapper<T> 或 QueryWrapper<T> 等,用来构建动态SQL。@Param 注解用于指定参数名,方便MyBatis-Plus识别。比如我们可以丢一些参数进去
// 创建查询包装器,设置查询条件
QueryWrapper<Employee> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "张三");
第一行先new出这个对象,Employee是实体类,第二行则是设置插叙条件,最终和page分页对象一起拼接到selectPage()方法中
// 创建分页对象,设置页码和每页数量
Page<Employee1> page = new Page<>(2, 10); // 第二页,每页10条
// 调用selectPage方法
List<Employee1> employees = employee1Mapper.selectPage(page, queryWrapper);
实际上执行的sql语句则是如下,代表着查询名字叫张三的数据,从第二页开始,每页10行
SELECT *
FROM `employee1`
WHERE name = '张三' //queryWrapper对象决定这一行
LIMIT 2 OFFSET 10; //page对象决定这一行
以上就是简单很细的讲解mybatisPlus的分页查询方法,比较入门,简单易懂(大概吧),能让你直观地知道什么参数对应着sql中的什么东西,这样好编写java代码去决定应该怎么写。