
MyBatis-Plus 还手写 Join 联表查询?一个依赖轻松搞定,真香!
Mapper 类继承 MPJBaseMapper(必选) Service 类继承 MPJBaseService(可选) ServiceImpl 类继承 MPJBaseServiceImpl(可选)
发布日期: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。
使用
核心类:MPJLambdaWrapper 和 MPJQueryWrapper
MPJLambdaWrapper 用法
简单的三表查询
class Test { @Resource private UserMapper userMapper; void testJoin() { MPJLambdaWrapperwrapper = 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 tLEFT JOIN user_address t1 ON t1.user_id = t.idLEFT JOIN area t2 ON t2.id = t1.area_idWHERE 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"); Listlist = userMapper.selectJoinList(UserDTO.class, wrapper); }}
对应 SQL
SELECT t.id, t.name, t.sex, t.head_img, addr.tel, addr.address, a.province FROM user tLEFT JOIN user_address addr ON t.id = addr.user_idRIGHT JOIN area a ON addr.area_id = a.idWHERE addr.tel LIKE ? AND a.province <= ?
高级用法
class Test { @Resource private UserMapper userMapper; void testJoin() { Listlist = 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 tLEFT JOIN (select * from user_address) addr ON t.id = addr.user_idRIGHT JOIN area a ON addr.area_id = a.idWHERE addr.tel LIKE ? AND a.province <= ?ORDER BY addr.id DESC
通过以上方法,我们可以像使用 Mybatis Plus 一样轻松进行表关联操作!
发表评论
最新留言
表示我来过!
[***.240.166.169]2025年05月11日 13时15分57秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
MATLAB实现主成分分析
2025-04-12
MATLAB实现交叉小波变换
2025-04-12
MATLAB实现各种概率密度函数(概率密度/分布/逆概率分布函数)
2025-04-12
MATLAB实现各种熵:香农熵、条件熵、模糊熵、样本熵等
2025-04-12
MATLAB实现各种离散概率密度函数(概率密度/分布/逆概率分布函数)
2025-04-12
MATLAB实现基于遗传算法/引力搜索算法优化新安江水文模型
2025-04-12
Maven学习总结(23)——Maven常用命令介绍
2025-04-12
maven常用命令集合(收藏大全)
2025-04-13
Maven项目怎样重新下载依赖
2025-04-13
MaxCompute访问TableStore(OTS) 数据(20170601更新)
2025-04-13
MBA中的企业金融课程涉及什么内容
2025-04-13
McPicker-iOS 使用指南
2025-04-13
MC新手入门(二十二)------ 游戏场景
2025-04-13
md5 16位及32位
2025-04-13
MD5的算法(C)
2025-04-13
Mdrill 测试数据写入程序
2025-04-13
Mean-Shift聚类方法
2025-04-13
Meanshift,聚类算法
2025-04-13
media="screen"啥意思?
2025-04-13