MyBatis-Plus 还手写 Join 联表查询?一个依赖轻松搞定,真香!
发布日期:2025-04-14 08:45:18 浏览次数:12 分类:精选文章

本文共 3633 字,大约阅读时间需要 12 分钟。

MyBatis-Plus Join 联表查询:一个依赖轻松搞定,真香!

众所周知,Mybatis Plus 封装的 mapper 不支持 join,如果需要支持就必须自己去实现。然而,对于大部分的业务场景来说,多表 join 是必不可少的,否则就没什么意义。

那么,有没有一种不通过硬 SQL 的形式,通过框架提供 join 功能呢?答案是肯定的。


安装

为了使用这个插件,你需要先在项目中添加相应的依赖。

Maven

com.github.yulichang
mybatis-plus-join-boot-starter
1.4.4

Gradle

implementation 'com.github.yulichang:mybatis-plus-join-boot-starter:1.4.4'

或者,直接 clone 代码到本地,执行 mvn install,然后引入以上依赖。

注意:Mybatis Plus 版本需要大于等于 3.4.0。


使用

  • Mapper 类继承 MPJBaseMapper(必选)
  • Service 类继承 MPJBaseService(可选)
  • ServiceImpl 类继承 MPJBaseServiceImpl(可选)

  • 核心类:MPJLambdaWrapper 和 MPJQueryWrapper

    MPJLambdaWrapper 用法

    简单的三表查询

    class Test {
    @Resource
    private UserMapper userMapper;
    void testJoin() {
    MPJLambdaWrapper
    wrapper = new MPJLambdaWrapper<>()
    .selectAll(UserDO.class)
    .select(UserAddressDO::getTel)
    .selectAs(UserAddressDO::getAddress, UserDTO::getUserAddress)
    .select(AreaDO::getProvince, AreaDO::getCity)
    .leftJoin(UserAddressDO.class, UserAddressDO::getUserId, UserDO::getId)
    .leftJoin(AreaDO.class, AreaDO::getId, UserAddressDO::getAreaId)
    .eq(UserDO::getId, 1)
    .like(UserAddressDO::getTel, "1")
    .gt(UserDO::getId, 5);
    List
    list = userMapper.selectJoinList(UserDTO.class, wrapper);
    }
    }

    对应 SQL

    SELECT 
    t.id, t.name, t.sex, t.head_img,
    t1.tel AS userTel,
    t1.address AS userAddress,
    t2.province,
    t2.city
    FROM
    user t
    LEFT JOIN user_address t1 ON t1.user_id = t.id
    LEFT JOIN area t2 ON t2.id = t1.area_id
    WHERE
    t.id = ?
    AND t1.tel LIKE ?
    AND t.id > ?

    MPJLambdaWrapper 其他功能

    • 一对一、一对多 使用
    • 简单的 SQL 函数 使用(如上述示例)
    • ON 语句多条件 支持
    • ResultMap 等效 支持

    String 形式用法(MPJQueryWrapper)

    简单的连表查询

    class Test {
    @Resource
    private UserMapper userMapper;
    void testJoin() {
    MPJQueryWrapper wrapper = new MPJQueryWrapper()
    .selectAll(UserDO.class)
    .select("addr.tel", "addr.address", "a.province")
    .leftJoin("user_address addr on t.id = addr.user_id")
    .rightJoin("area a on addr.area_id = a.id")
    .like("addr.tel", "1")
    .le("a.province", "1");
    List
    list = userMapper.selectJoinList(UserDTO.class, wrapper);
    }
    }

    对应 SQL

    SELECT 
    t.id, t.name, t.sex, t.head_img,
    addr.tel,
    addr.address,
    a.province
    FROM
    user t
    LEFT JOIN user_address addr ON t.id = addr.user_id
    RIGHT JOIN area a ON addr.area_id = a.id
    WHERE
    addr.tel LIKE ?
    AND a.province <= ?

    高级用法

    class Test {
    @Resource
    private UserMapper userMapper;
    void testJoin() {
    List
    list = userMapper.selectJoinList(UserDTO.class, new MPJQueryWrapper()
    .selectAll(UserDO.class)
    .select("addr.tel", "addr.address")
    .select("CASE t.sex WHEN '男' THEN '1' ELSE '0' END AS sex")
    .select("sum(a.province) AS province")
    .leftJoin("(select * from user_address) addr on t.id = addr.user_id")
    .rightJoin("area a on addr.area_id = a.id")
    .like("addr.tel", "1")
    .le("a.province", "1")
    .orderByDesc("addr.id"));
    }
    }

    对应 SQL

    SELECT 
    t.id, t.name, t.sex, t.head_img,
    addr.tel,
    addr.address,
    CASE t.sex WHEN '男' THEN '1' ELSE '0' END AS sex,
    sum(a.province) AS province
    FROM
    user t
    LEFT JOIN (select * from user_address) addr ON t.id = addr.user_id
    RIGHT JOIN area a ON addr.area_id = a.id
    WHERE
    addr.tel LIKE ?
    AND a.province <= ?
    ORDER BY
    addr.id DESC

    通过以上方法,我们可以像使用 Mybatis Plus 一样轻松进行表关联操作!

    上一篇:mybatis-plus 扩展、插件
    下一篇:Mybatis-plus 集成 PostgreSQL 数据库自增序列问题记录

    发表评论

    最新留言

    表示我来过!
    [***.240.166.169]2025年05月11日 13时15分57秒