mybatis-plus分页查询排序案例
时间: 2023-06-01 11:07:34 浏览: 139
好的,我可以回答这个问题。Mybatis-plus 可以使用 Page 对象进行分页查询,并可以通过 LambdaQueryWrapper 对象进行排序,以下是一个示例:
```
// 分页查询
Page<User> page = new Page<>(1, 10);
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<User>()
.eq(User::getGender, "female")
.orderByAsc(User::getAge);
IPage<User> userPage = userService.page(page, wrapper);
// 查看结果
List<User> userList = userPage.getRecords();
for (User user : userList) {
System.out.println(user.getName() + " " + user.getAge());
}
```
这段代码演示了如何使用 Mybatis-plus 进行分页查询,并按照年龄升序排列女性用户。
相关问题
mybatis-plus 分页查询参数
### MyBatis-Plus 分页查询参数使用方法
#### Page 类的主要属性及其作用
MyBatis-Plus 提供了一个 `Page` 类来处理分页查询,该类包含了多个重要属性:
- **current**: 表示当前页面编号。通过设置这个属性可以指定要获取哪一页的数据[^2]。
- **size**: 定义每页显示的记录数量。调整此值可控制每次请求返回的结果集大小。
- **total**: 总记录数,在执行完查询操作之后会被框架自动填充。这有助于前端展示总共有多少条目以及计算总的页数。
- **records**: 存储当前页的具体记录列表,同样是在完成查询后由 MyBatis-Plus 自动赋值给它。
- **optimizeCountSql**: 当只关心特定页的数据而不需知晓全部总数时,开启此项能有效降低数据库负担。默认情况下关闭该项功能。
- **orders**: 接收排序规则数组,允许开发者自定义SQL中的ORDER BY子句部分。
- **searchCount**: 控制是否执行COUNT(*)语句以统计符合条件的记录数目,默认启用。当启用了`optimizeCountSql`选项时,本项配置将被忽略。
- **countId**: 为了避免缓存带来的问题,对于每一次COUNT查询都会生成唯一的键名。除非特别需求一般无需手动设定。
#### 实际应用案例
下面是一个简单的Java代码片段展示了如何利用上述提到的各种参数来进行一次完整的分页查询:
```java
// 导入必要的包
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
public class Example {
public void queryExample() {
// 创建一个新的Page对象实例, 并初始化分页参数
Page<User> page = new Page<>(currentPageNumber, pageSize);
// 构建查询条件 (这里假设User是我们想要查询的对象模型)
QueryWrapper<User> wrapper = new QueryWrapper<>();
// 添加任何额外的过滤条件到wrapper中...
// 如: wrapper.eq("status", "active");
// 执行带分页的查询并将结果存储回page对象内
userMapper.selectPage(page, wrapper);
// 获取并打印出本次查询得到的信息
System.out.println("Total Records:" + page.getTotal());
System.out.println("Current Page Data:");
for(User record : page.getRecords()){
System.out.println(record.toString());
}
}
}
```
在这个例子中,`selectPage()` 方法接收一个已经设置了必要分页信息(`current`, `size`) 的 `Page<T>` 对象 和 一个可能含有筛选逻辑的 `QueryWrapper<T>` 来构建最终的SQL查询命令。
mybatis-plus多表关联分页查询
### MyBatis-Plus 实现多表关联分页查询的方法
#### 方法概述
MyBatis-Plus 提供了强大的工具来简化多表联查和分页查询的操作。对于多表关联分页查询,可以通过 `selectJoinPageList` 或者自定义 SQL 的方式实现。这里主要介绍通过 `MPJLambdaWrapper` 和 `selectJoinPageList` 方法的组合来完成多表关联分页查询的功能。
---
#### 自定义 Mapper 接口与方法
为了实现多表关联分页查询,首先需要在 Mapper 接口中定义一个方法,并配合 XML 文件或者注解的方式编写对应的 SQL 语句。以下是一个典型的接口设计示例:
```java
package com.example.mapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.entity.UserRoleVO;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.SelectProvider;
public interface UserMapper {
/**
* 多表联查分页查询用户角色信息
*
* @param page 分页对象
* @param bo 查询条件封装对象
* @return 返回分页后的用户角色信息
*/
IPage<UserRoleVO> getUserRolesByMultiTable(@Param("page") IPage<UserRoleVO> page, @Param("bo") UserRoleQueryBO bo);
}
```
---
#### MPJLambdaWrapper 构造查询条件
`MPJLambdaWrapper` 是 mybatis-plus-join 插件提供的条件构造器,支持多表联查。以下是其基本用法示例:
```java
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.mpj.join.wrapper.MPJLambdaWrapper;
import java.util.List;
public class UserService {
public Page<UserRoleVO> queryUserRole(Page<UserRoleVO> page, UserRoleQueryBO bo) {
// 初始化 MPJLambdaWrapper 并指定主表
MPJLambdaWrapper<UserRoleVO> wrapper = new MPJLambdaWrapper<>();
// 设置联查条件:假设存在 user 表和 role 表
wrapper.select(UserRoleVO.class, u -> true) // 主表字段选择
.leftJoin(Role.class, r -> r.getId().eq(UserRoleVO::getRoleId)) // 左连接 role 表
.where(u -> u.getName().like(bo.getUserName())) // 添加过滤条件
.orderByAsc(UserRoleVO::getId); // 排序规则
// 调用 mapper 方法执行查询
return userMapper.getUserRolesByMultiTable(page, bo);
}
}
```
---
#### XML 配置文件
如果采用 XML 方式配置 SQL,则可以在对应的 Mapper.xml 文件中定义如下内容:
```xml
<select id="getUserRolesByMultiTable" resultType="com.example.vo.UserRoleVO">
SELECT
u.id AS userId,
u.name AS userName,
r.role_name AS roleName
FROM
user u
LEFT JOIN
role r ON u.role_id = r.id
WHERE
<if test="bo.userName != null and bo.userName != ''">
u.name LIKE CONCAT('%', #{bo.userName}, '%')
</if>
ORDER BY
u.id ASC
</select>
```
---
#### 示例代码整合
下面展示了一个完整的多表关联分页查询案例:
```java
// 创建分页对象
Page<UserRoleVO> page = new Page<>(1, 10);
// 封装查询条件
UserRoleQueryBO bo = new UserRoleQueryBO();
bo.setUserName("张三");
// 执行查询
Page<UserRoleVO> resultPage = userService.queryUserRole(page, bo);
// 输出结果
System.out.println("总记录数:" + resultPage.getTotal());
resultPage.getRecords().forEach(System.out::println);
```
---
#### 性能优化建议
1. **索引优化**
确保参与联查的关键字段(如外键)已建立合适的索引,以提高查询效率[^3]。
2. **减少不必要的字段加载**
使用 `SELECT` 子句显式指定需要的字段,而非全量加载所有列。
3. **缓存机制**
对于频繁访问的数据,考虑引入 Redis 缓存或其他分布式缓存方案降低数据库压力。
---
### 注意事项
- 如果未正确配置分页插件,则可能导致 SQL 执行失败或无法完成分页操作。
- 当前版本可能不完全兼容旧版 API,请确认所使用的 MyBatis-Plus 及 mybatis-plus-join 插件版本是否匹配[^4]。
---
阅读全文
相关推荐














