MybatisPlus多表连接查询
创始人
2025-01-16 00:04:12
0

mybatis-plus作为mybatis的增强工具,它的出现极大的简化了开发中的数据库操作,但是长久以来,它的联表查询能力一直被大家所诟病。一旦遇到left join或right join的左右连接,你还是得老老实实的打开xml文件,手写上一大段的sql语句。

偶然碰到了这么一款叫做mybatis-plus-join的工具(后面就简称mpj了),使用了一下,不得不说真香!彻底将我从xml地狱中解放了出来,终于可以以类似mybatis-plus中QueryWrapper的方式来进行联表查询了,话不多说,我们下面开始体验。

插件文档 https://mybatisplusjoin.com
插件Github仓库 https://github.com/yulichang/mybatis-plus-join
一、添加依赖

在pom中添加 mybatis plus join依赖

  	com.github.yulichang     mybatis-plus-join-boot-starter     1.4.5        com.baomidou     mybatis-plus-boot-starter     3.5.3.1  
二、创建实体

添加两个数据库实体类 UserAddress 和结果类 UserDTO
这里用lombok简单代码

@Data @ToString @TableName("area") public class User { 	@TableId     private Long id;     private String name;     private Integer age;     private String email; } 
@Data @ToString @TableName("address") public class Address { 	@TableId     private Long id;     private Long userId;     private String city;     private String address; } 
@Data @ToString public class UserDTO{     private Long id;     private String name;     private Integer age;     private String email;  	//address关联表中的两个字段     private String city;     private String address;      	//地址列表 用于接下来的一对多映射查询 	private List
addressList; //地址 用于接下来的一对一映射查询 private Address address; }
三、创建mapper

添加mapper并且继承MPJBaseMapper

@Mapper public interface UserMapper extends MPJBaseMapper {  } 
@Mapper public interface AddressMapper extends MPJBaseMapper
{ }
四、连表查询测试
实体和mapper都建好了就可以直接用了~~
@SpringBootTest public class SampleTest {      @Autowired     private UserMapper userMapper;      @Test     public void testSelect() {         MPJLambdaWrapper wrapper = new MPJLambdaWrapper()                 .selectAll(User.class)//查询user表全部字段                 .select(Address::getCity, Address::getAddress)                 .leftJoin(Address.class, Address::getUserId, User::getId);         List userList = userMapper.selectJoinList(UserDTO.class, wrapper);         userList.forEach(System.out::println);     } } 
sql打印
SELECT t.id,t.name,t.age,t.email,t2.city,t2.address FROM user t LEFT JOIN address t1 ON t1.user_id = t.id 
控制台输出
User(id=1, name=Jone, age=18, email=test1@baomidou.com,city=北京,address=人民广场) User(id=2, name=Jack, age=20, email=test2@baomidou.com,city=上海,address=人民广场) User(id=3, name=Tom, age=28, email=test3@baomidou.com,city=广州,address=人民广场) User(id=4, name=Sandy, age=21, email=test4@baomidou.com,city=上海,address=人民广场) User(id=5, name=Billie, age=24, email=test5@baomidou.com,city=北京,address=人民广场) 
连表分页也是很常用的功能,MPJ也支持,调用selectJoinPage()就可以了
@SpringBootTest public class SampleTest {      @Autowired     private UserMapper userMapper;      @Test     public void testSelect() {         MPJLambdaWrapper wrapper = new MPJLambdaWrapper()                 .selectAll(User.class)//查询user表全部字段                 .select(Address::getCity, Address::getAddress)                 .leftJoin(Address.class, Address::getUserId, User::getId);         Page page= userMapper.selectJoinPage(new Page(1,10), UserDTO.class, wrapper);     } } 
sql打印可以看到多了分页方言
SELECT t.id,t.name,t.age,t.email,t2.city,t2.address FROM user t LEFT JOIN address t1 ON t1.user_id = t.id LIMIT ? 

小结:
通过以上几个简单的步骤,我们就实现了 User 表的连表功能,甚至连 XML 文件都不用编写!
从以上步骤中,我们可以看到集成MyBatis-Plus-Join非常的简单,只需要引入 starter 工程即可。
但 MyBatis-Plus-Join 的强大远不止这些功能,
可以查阅插件文档 https://mybatisplusjoin.com/
接下来测试一对多和一对一映射查询

五、一对多、一对一映射

一对多 selectCollection

@SpringBootTest public class SampleTest {      @Autowired     private UserMapper userMapper;      @Test     public void testSelect() {         MPJLambdaWrapper wrapper = new MPJLambdaWrapper()                 .selectAll(User.class)//查询user表全部字段                 .selectCollection(Address::getCity, UserDTO::getAddressList)                 .leftJoin(Address.class, Address::getUserId, User::getId);         List userList = userMapper.selectJoinList(UserDTO.class, wrapper);     } } 

一对一 selectAssociation

@SpringBootTest public class SampleTest {      @Autowired     private UserMapper userMapper;      @Test     public void testSelect() {         MPJLambdaWrapper wrapper = new MPJLambdaWrapper()                 .selectAll(User.class)//查询user表全部字段                 .selectAssociation(Address::getCity, UserDTO::getAddress)                 .leftJoin(Address.class, Address::getUserId, User::getId);         List userList = userMapper.selectJoinList(UserDTO.class, wrapper);     } } 
六、总结

通过以上几个简单的步骤,我们就实现了 User 表的连表功能,甚至连 XML 文件都不用编写!
从以上步骤中,我们可以看到集成MyBatis-Plus-Join非常的简单,只需要引入 starter 工程即可。
但 MyBatis-Plus-Join 的强大远不止这些功能,想要详细了解 MyBatis-Plus-Join 的强大功能?
可以查阅插件文档 https://mybatisplusjoin.com/

相关内容

热门资讯

第九分钟辅助!天天爱柳州辅助器... 天天爱柳州辅助器是一款可以让一直输的玩家,快速成为一个“必胜”的ai辅助神器,有需要的用户可以加我微...
热门推荐!微信小程序蜀山辅助器... 热门推荐!微信小程序蜀山辅助器免费下载(辅助)外挂辅助开挂插件(有挂秘诀)-哔哩哔哩;最新版2026...
第4分钟普及!奇迹陕西辅助器(... 第4分钟普及!奇迹陕西辅助器(透视)原来真的是有挂脚本(推荐开挂软件);奇迹陕西辅助器免费下载原版,...
第八分钟讲解!越乡游金花辅助,... 第八分钟讲解!越乡游金花辅助,九酷众游辅助,细节方法(有挂实锤)-哔哩哔哩1、下载安装好越乡游金花辅...
透视软件!浙江宝宝游戏辅助工具... 透视软件!浙江宝宝游戏辅助工具(辅助)外挂开挂辅助插件(了解有挂)-哔哩哔哩;是一款可以让一直输的玩...
第5分钟发现!桃乐甘肃麻将下载... 《第5分钟发现!桃乐甘肃麻将下载辅助器(辅助)原来有挂软件(必看开挂工具)》 桃乐甘肃麻将下载辅助器...
第8分钟了解!河洛刚次辅助,温... 第8分钟了解!河洛刚次辅助,温州茶苑辅助软件,详细教程(有挂攻略)-哔哩哔哩;无需打开直接搜索加薇1...
热点讨论!新二号辅助软件下载(... 热点讨论!新二号辅助软件下载(辅助)外挂辅助开挂软件(有挂教程)-哔哩哔哩;是一款可以让一直输的玩家...
8分钟解说!网易亲友圈辅助(开... 8分钟解说!网易亲友圈辅助(开挂)原来有挂平台(必看开挂安装);小薇(透视辅助)致您一封信;亲爱网易...
第5分钟开挂!如何在哈灵上辅助... 第5分钟开挂!如何在哈灵上辅助,决战卡五星辅助看牌器,解说技巧(有挂方略)-哔哩哔哩 了解更多开挂安...