mybatis-plus连接查询
时间: 2025-03-16 16:14:58 浏览: 36
### 使用 MyBatis-Plus 实现多表连接查询
MyBatis-Plus 提供了一种简单的方式来实现多表连接查询。虽然其核心功能主要围绕单表操作设计,但借助 `mybatis-plus-join` 插件以及自定义拦截器可以轻松完成复杂的多表联查。
#### 1. 多表联查的核心组件
为了实现多表联查,开发者可以通过以下两种方式来构建查询逻辑:
- **MPJLambdaWrapper**:这是由 `mybatis-plus-join` 插件提供的一种条件构造器,允许用户像使用 `LambdaQueryWrapper` 那样编写链式调用的 SQL 条件语句[^2]。
- **selectJoinList 方法**:该方法来自 `MPJBaseMapper` 接口,用于执行多表联合查询并返回指定的结果集对象[^4]。
以下是具体的实现步骤和代码示例。
---
#### 2. 添加依赖项
在项目中引入必要的 Maven 或 Gradle 依赖项以支持多表联查功能。例如,在 `pom.xml` 文件中添加如下内容:
```xml
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-extension</artifactId>
<version>最新版本号</version>
</dependency>
<!-- 如果需要 mybatis-plus-join 功能 -->
<dependency>
<groupId>mpj</groupId>
<artifactId>mybatis-plus-join</artifactId>
<version>对应版本号</version>
</dependency>
```
---
#### 3. 创建实体类与 Mapper 接口
假设存在两个表:`user` 和 `order`,分别表示用户信息和订单记录,则对应的 Java 实体类可能如下所示:
```java
@Data
public class User {
private Long id;
private String name;
}
@Data
public class Order {
private Long orderId;
private Long userId; // 关联字段
private BigDecimal amount;
}
```
接着创建一个 DTO 类用来接收查询结果数据:
```java
@Data
public class UserOrderDTO {
private Long userId;
private String userName;
private Long orderId;
private BigDecimal orderAmount;
}
```
随后为 `User` 表配置相应的 Mapper 接口,并继承 `MPJBaseMapper<User>` 而不是普通的 `BaseMapper<User>`:
```java
@Mapper
public interface UserMapper extends MPJBaseMapper<User> {}
```
---
#### 4. 编写查询逻辑
利用 `MPJLambdaWrapper` 构建查询条件并通过 `selectJoinList` 执行实际查询操作。下面是一个完整的例子:
```java
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public List<UserOrderDTO> getUserOrders() {
MPJLambdaWrapper<User> wrapper = new MPJLambdaWrapper<>();
// 设置主表 (user),并加入关联子表 (order) 的 JOIN 查询条件
wrapper.select(User.class, u -> Arrays.asList(u.getId(), u.getName()))
.selectAs(Order::getOrderId, UserOrderDTO::getOrderId)
.selectAs(Order::getAmount, UserOrderDTO::getOrderAmount)
.leftJoin(Order.class, o -> o.getUserId().eq(User::getId)));
return userMapper.selectJoinList(wrapper, UserOrderDTO.class);
}
}
```
上述代码片段展示了如何通过设置不同的 SELECT 子句选择目标列,并将它们映射到最终的目标 DTO 中去][^[^24]。
---
#### 5. 自定义拦截器(可选)
如果希望进一步扩展框架能力或者解决某些特殊场景下的需求,还可以考虑注册自定义拦截器。比如按照官方文档中的指导修改 SqlSession 工厂 Bean 定义即可生效[^5]:
```java
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
MybatisSqlSessionFactoryBean factoryBean = new MybatisSqlSessionFactoryBean();
factoryBean.setDataSource(dataSource);
Interceptor[] plugins = {new MyInterceptor()};
factoryBean.setPlugins(plugins);
return factoryBean.getObject();
}
```
---
### 总结
综上所述,MyBatis-Plus 支持多种途径来进行高效的多表连接查询处理。无论是采用内置插件还是自行定制解决方案都能满足大多数业务需求。
阅读全文
相关推荐


















