使用mybatis-plus进行三表联查
时间: 2023-10-13 22:22:31 浏览: 97
mybatis-plus逆向工程
假设我们有三张表:user、order、order_item,user表和order表是一对多关系,order表和order_item表是一对多关系。现在我们想要查询一个用户的所有订单及其订单详情,可以使用mybatis-plus的Wrapper类来完成三表联查。
1. 首先定义三个实体类:User、Order、OrderItem,分别对应user、order、order_item表。
2. 在mapper中定义三个方法,分别对应三个表的查询,例如:
```
public interface UserMapper extends BaseMapper<User> {
List<User> selectUserWithOrders(Long userId);
}
public interface OrderMapper extends BaseMapper<Order> {
List<Order> selectOrderWithOrderItems(Long orderId);
}
public interface OrderItemMapper extends BaseMapper<OrderItem> {
// 略
}
```
3. 使用Wrapper类进行三表联查,例如:
```
public List<User> selectUserWithOrders(Long userId) {
QueryWrapper<User> userWrapper = new QueryWrapper<>();
userWrapper.eq("id", userId);
List<User> userList = selectList(userWrapper);
if (CollectionUtils.isEmpty(userList)) {
return null;
}
QueryWrapper<Order> orderWrapper = new QueryWrapper<>();
orderWrapper.eq("user_id", userId);
List<Order> orderList = orderMapper.selectList(orderWrapper);
for (User user : userList) {
user.setOrderList(orderList);
for (Order order : orderList) {
QueryWrapper<OrderItem> orderItemWrapper = new QueryWrapper<>();
orderItemWrapper.eq("order_id", order.getId());
List<OrderItem> orderItemList = orderItemMapper.selectList(orderItemWrapper);
order.setOrderItemList(orderItemList);
}
}
return userList;
}
```
以上代码中,我们先使用user_id查询订单,再使用order_id查询订单详情,最后将订单详情设置到订单中,订单设置到用户中,完成三表联查。
需要注意的是,这种方式可能存在N+1问题,即查询一个用户的所有订单及其订单详情时,需要执行N+1次SQL,其中N为订单数量。可以考虑使用join方式优化查询性能。
阅读全文