mybatis plus多表联查返回vo对象(纯java代码无需xml和注解)

示例展示了如何用MyBatis-Plus的QueryWrapper类进行多表联查,包括指定查询字段、左连接条件和分组条件,然后通过selectList方法获取查询结果并转化为List对象。这种方式在构建动态查询条件时更为灵活。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MyBatis-Plus提供了`QueryWrapper`类,可以用它来构建多表联查的查询条件。下面是一个示例代码:```java
QueryWrapper<UserOrderVO> wrapper = new QueryWrapper<>();
wrapper.select("user.user_id", "user.user_name", "order.order_id", "order.order_name")
    .leftJoin("order", "user.user_id = order.user_id")
    .groupBy("user.user_id", "user.user_name", "order.order_id", "order.order_name");
List<UserOrderVO> list = userOrderMapper.selectList(wrapper);
```

在这个示例中,我们使用`QueryWrapper`类构建了一个多表联查的查询条件。首先使用`select()`方法指定要查询的字段,然后使用`leftJoin()`方法指定关联查询的表和条件,最后使用`groupBy()`方法指定分组条件。最后,使用`selectList()`方法查询数据,并将查询结果转换成`List`对象。这种方式相对于注解方式来说,更加灵活,更容易动态构建查询条件。

### 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-Plusmybatis-plus-join 插件版本是否匹配[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值