mybatis plus left join查询
时间: 2023-10-07 07:05:57 浏览: 110
支持连表查询的mybatis-plus
5星 · 资源好评率100%
MyBatis Plus 提供了一种方便的方法来执行左连接查询。下面是一个简单的例子:
假设有两个表,一个是订单表,一个是用户表。每个订单记录都有一个用户 ID ,我们想要查询订单记录和对应的用户信息。
首先,我们需要定义两个实体类:
```java
@Data
public class Order {
private Long id;
private Long userId;
private BigDecimal amount;
}
@Data
public class User {
private Long id;
private String name;
private Integer age;
}
```
然后,我们需要创建两个对应的 Mapper 接口:
```java
public interface OrderMapper extends BaseMapper<Order> {
}
public interface UserMapper extends BaseMapper<User> {
}
```
接下来,我们可以使用 MyBatis Plus 提供的 LambdaQueryWrapper 来执行左连接查询。LambdaQueryWrapper 提供了一种类型安全的查询方式,可以避免手写 SQL 带来的风险。
```java
@Test
public void testSelectJoin() {
List<Order> orders = orderMapper.selectList(new LambdaQueryWrapper<Order>()
.select(Order.class, i -> !i.getColumn().equals("id"))
.leftJoin(User.class, Order::getUserId, User::getId)
.select(User.class, i -> !i.getColumn().equals("id"))
);
orders.forEach(System.out::println);
}
```
在上面的例子中,我们首先使用 select 方法指定要查询的字段,这里排除了订单 ID 字段。然后,我们使用 leftJoin 方法指定要进行左连接的表和连接条件。最后,我们再次使用 select 方法指定要查询的字段,这里排除了用户 ID 字段。
当然,你也可以手写 SQL 来执行左连接查询。MyBatis Plus 提供了一个方便的注解 @SelectProvider ,可以让你在注解中编写动态 SQL。
```java
@Mapper
public interface OrderMapper extends BaseMapper<Order> {
@SelectProvider(type = OrderSqlProvider.class, method = "selectOrdersWithUser")
List<OrderWithUser> selectOrdersWithUser();
}
@Mapper
public interface UserMapper extends BaseMapper<User> {
}
public class OrderSqlProvider {
public String selectOrdersWithUser() {
return new SQL() {{
SELECT("o.*, u.name, u.age");
FROM("t_order o");
LEFT_OUTER_JOIN("t_user u ON u.id = o.user_id");
}}.toString();
}
}
@Data
public class OrderWithUser {
private Long id;
private Long userId;
private BigDecimal amount;
private String userName;
private Integer userAge;
}
@Test
public void testSelectJoin() {
List<OrderWithUser> orders = orderMapper.selectOrdersWithUser();
orders.forEach(System.out::println);
}
```
在上面的例子中,我们首先在 OrderMapper 中定义了一个名为 selectOrdersWithUser 的方法,并使用 @SelectProvider 注解指定了对应的 SQL 构建器类和方法。然后,在 OrderSqlProvider 中编写了动态 SQL,使用 SQL 类来拼接 SQL 语句。最后,我们定义了一个名为 OrderWithUser 的实体类来封装查询结果。
阅读全文