博客
关于我
MyBatis-Plus 还手写 Join 联表查询?一个依赖轻松搞定,真香!
阅读量:797 次
发布时间:2023-02-09

本文共 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 一样轻松进行表关联操作!

    转载地址:http://ryffk.baihongyu.com/

    你可能感兴趣的文章
    Mybatis配置useGeneratedKeys=“true“ keyProperty=“id“的作用
    查看>>
    Mybatis配置
    查看>>
    mybatis逆向工程详细配置讲解(全)
    查看>>
    Mybatis连接池与事务深入
    查看>>
    MyBatis实现 if-else功能
    查看>>
    MyBatis实操第一课5月17号.在学完了MaBatis框架后。
    查看>>
    Mybatis学习(1)
    查看>>
    MyBatis学习总结(9)——使用MyBatis Generator自动创建代码
    查看>>
    MyBatis学习总结(8)——Mybatis3.x与Spring4.x整合
    查看>>
    MyBatis学习总结(7)——Mybatis缓存
    查看>>
    MyBatis学习总结(6)——调用存储过程
    查看>>
    MyBatis学习总结(5)——实现关联表查询
    查看>>
    MyBatis学习总结(4)——解决字段名与实体类属性名不相同的冲突
    查看>>
    MyBatis学习总结(3)——优化MyBatis配置文件中的配置
    查看>>
    MyBatis学习总结(2)——使用MyBatis对表执行CRUD操作
    查看>>
    MyBatis学习总结(28)—— MyBatis-Plus 实战技巧总结
    查看>>
    MyBatis学习总结(27)——Mybatis-Plus使用小技巧
    查看>>
    MyBatis学习总结(26)——Mybatis源码中使用了哪些设计模式?
    查看>>
    MyBatis学习总结(25)——Mybatis Generator generatorConfig.xml配置文件详细说明
    查看>>
    MyBatis学习总结(24)——Mybatis常见问题汇总
    查看>>