本文共 3633 字,大约阅读时间需要 12 分钟。
众所周知,Mybatis Plus 封装的 mapper 不支持 join,如果需要支持就必须自己去实现。然而,对于大部分的业务场景来说,多表 join 是必不可少的,否则就没什么意义。
那么,有没有一种不通过硬 SQL 的形式,通过框架提供 join 功能呢?答案是肯定的。
为了使用这个插件,你需要先在项目中添加相应的依赖。
com.github.yulichang mybatis-plus-join-boot-starter 1.4.4
implementation 'com.github.yulichang:mybatis-plus-join-boot-starter:1.4.4'
或者,直接 clone 代码到本地,执行 mvn install
,然后引入以上依赖。
注意:Mybatis Plus 版本需要大于等于 3.4.0。
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); }}
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 > ?
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); }}
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")); }}
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 一样轻松进行表关联操作!
转载地址:http://ryffk.baihongyu.com/