MyBatis-Plus 多表联查Mybatis-Plus Join

发布于:2024-10-15 ⋅ 阅读:(87) ⋅ 点赞:(0)

com.github.yulichang Mybatis-Plus Join 简介

在 MyBatis-Plus 中,使用 com.github.yulichang 提供的扩展库(Mybatis-Plus Join),可以非常方便地实现多表联表查询,而不需要手动编写复杂的 SQL。这种扩展库简化了联表操作,提供了一种基于 Lambda 表达式的查询方式。
MyBatis-Plus-Join (opens new window)(简称 MPJ)是一个 MyBatis-Plus (opens new window)的增强工具,在 MyBatis-Plus 的基础上只做增强不做改变,为简化开发、提高效率而生。
该扩展库通过 MyBatis-Plus 的 Wrapper 和 Mapper 扩展支持 JOIN 操作,允许你在查询时使用类似 MyBatis-Plus 的链式查询语法完成多表关联查询。
特性
无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
无感引入, 支持MP风格的查询, 您会MP就会MPJ, 无需额外的学习成本
兼容MP的别名、逻辑删除、枚举列、TypeHandle列等特性
支持注解形式一对一、一对多和连表查询形式的一对一和一对多
com.github.yulichang 的 MyBatis-Plus Join 库简化了多表联表查询,让你可以通过 Lambda 表达式和链式操作编写复杂的查询逻辑,提升了代码的可读性和维护性。如果你需要多表关联查询,MyBatis-Plus Join 是一个非常强大的工具。

快速上手

  1. 添加依赖
    在你的 Maven 项目中,添加以下依赖:
<dependency>
    <groupId>com.github.yulichang</groupId>
    <artifactId>mybatis-plus-join</artifactId>
    <version>1.4.5</version>
</dependency>
  1. 数据库表结构示例
    假设我们有两个表:
    ● user 表:用户表
    ● order 表:订单表,关联用户 ID
CREATE TABLE user (
    id BIGINT PRIMARY KEY,
    name VARCHAR(50),
    age INT
);

CREATE TABLE orders (
    id BIGINT PRIMARY KEY,
    user_id BIGINT,
    order_number VARCHAR(50),
    total_amount DECIMAL(10, 2),
    FOREIGN KEY (user_id) REFERENCES user(id)
);
  1. 实体类定义
    定义两个实体类:
@Data
public class User {
    private Long id;
    private String name;
    private Integer age;
}

@Data
public class Order {
    private Long id;
    private Long userId;
    private String orderNumber;
    private BigDecimal totalAmount;
}
  1. 使用 Mybatis-Plus Join 进行多表查询
    方法一:JoinLambdaQueryWrapper
    你可以使用 JoinLambdaQueryWrapper 来构建多表联表查询的条件。例如,我们想要查询每个订单的用户信息,可以这样写:
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.github.yulichang.toolkit.MPJQueryWrapper;
import org.springframework.beans.factory.annotation.Autowired;

public class OrderService {
    
    @Autowired
    private OrderMapper orderMapper;

    public List<UserOrderDTO> getOrderWithUser() {
        MPJLambdaWrapper<Order> wrapper = new MPJLambdaWrapper<>();
        wrapper.selectAll(Order.class)        // 查询 Order 表所有字段
               .select(User::getName)         // 查询 User 表的 Name 字段
               .leftJoin(User.class, User::getId, Order::getUserId);  // 使用 left join 连接

        return orderMapper.selectJoinList(UserOrderDTO.class, wrapper);
    }
}

方法二:自定义 DTO 返回结果
创建 UserOrderDTO 类,用于存放查询结果。

@Data
public class UserOrderDTO {
    private Long id;
    private String name;
    private String orderNumber;
    private BigDecimal totalAmount;
}
然后在查询中返回 UserOrderDTO。
public List<UserOrderDTO> getOrderWithUserDTO() {
    MPJLambdaWrapper<Order> wrapper = new MPJLambdaWrapper<>();
    wrapper.select(Order::getId, Order::getOrderNumber, Order::getTotalAmount)
           .select(User::getName)
           .leftJoin(User.class, User::getId, Order::getUserId);

    return orderMapper.selectJoinList(UserOrderDTO.class, wrapper);
}
  1. Mapper 接口
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.github.yulichang.base.MPJBaseMapper;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface OrderMapper extends MPJBaseMapper<Order> {
}

通过 MPJBaseMapper 提供的 selectJoinList 方法,可以直接执行多表联表查询,并返回自定义的 DTO 对象。


网站公告

今日签到

点亮在社区的每一天
去签到