使用Mybatis-plus-join做多表查询
我们做多表查询都是要自己写sql的,还是比较麻烦的,下面介绍一种不用自己写sql的方式来完成多表查询。
这个第三方工具是一个大佬封装的一个jar包,即mybatis-plus-join架包,这个架包可以支持MyBatis-Plus的多表联查。
官网如下:https://mybatisplusjoin.com/
或者你看这个博主写的也行:https://blog.csdn.net/weixin_39555954/article/details/128217887
快速入门的使用
一、引依赖
注意:要求mybatis plus version >= 3.4.0
<dependency>
<groupId>com.github.yulichang</groupId>
<artifactId>mybatis-plus-join</artifactId>
<version>1.2.4</version>
</dependency>
二、使用方法
mapper继承MPJBaseMapper (必选)
service继承MPJBaseService (可选)
serviceImpl继承MPJBaseServiceImpl (可选)
三、(实战)多表查询
MPJLambdaWrapper<Map> mpjLambdaWrapper = new MPJLambdaWrapper();
mpjLambdaWrapper.select(ChatRecord::getId,ChatRecord::getRedMoney)
.select(OfShopMembers::getUsablePoint)
.select(ChatMultiList::getName)
.leftJoin(OfShopMembers.class,OfShopMembers::getId,ChatRecord::getId)
.leftJoin(ChatMultiList.class,ChatMultiList::getId,ChatRecord::getMultiId)
.eq(ChatRecord::getMemberId,3213);
List list = chatRecordMybatisJoinMapper.selectJoinList(Map.class, mpjLambdaWrapper);
对应查询语句
SELECT
t.id,
t.red_money,
t1.username,
t2.name
FROM
chat_record t
LEFT JOIN of_shop_members t1 ON (t1.id = t.id)
LEFT JOIN chat_multi_list t2 ON (t2.id = t.multi_id)
WHERE
(t.member_id = 3213)
参数说明
1、select:表示查询的指定字段,一个select只能查一个表的
2、leftJoin:
第一个参数: 参与连表的实体类class
第二个参数: 连表的ON字段,这个属性必须是第一个参数实体类的属性
第三个参数: 参与连表的ON的另一个实体类属性
3、默认主表别名是t,其他的表别名以先后调用的顺序使用t1,t2,t3…
四、(实战)多表分页查询
MPJLambdaWrapper<Map> mpjLambdaWrapper = new MPJLambdaWrapper();
mpjLambdaWrapper.select(ChatRecord::getId,ChatRecord::getRedMoney)
.select(OfShopMembers::getUsablePoint)
.select(ChatMultiList::getName)
.leftJoin(OfShopMembers.class,OfShopMembers::getId,ChatRecord::getId)
.leftJoin(ChatMultiList.class,ChatMultiList::getId,ChatRecord::getMultiId)
.eq(ChatRecord::getMemberId,3213)
.orderByDesc(ChatRecord::getAddTime);
Page page = new Page(1,2);
IPage<Map> mapIPage = chatRecordMybatisJoinMapper.selectJoinPage(page, Map.class, mpjLambdaWrapper);
对应查询语句
SELECT
t.id,
t.red_money,
t1.usable_point,
t2.name
FROM
chat_record t
LEFT JOIN of_shop_members t1 ON (t1.id = t.id)
LEFT JOIN chat_multi_list t2 ON (t2.id = t.multi_id)
WHERE
(t.member_id = 3213)
ORDER BY
t.add_time
DESC
LIMIT 2
我的测试:
一、引入依赖
这里我们测试的项目使用的是3.4.1的mybatis-plus-boot-starter
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EzV800v1-1689579111867)(MyBatisPlus自定义sql/image-20230716181148224.png)]](https://img-blog.csdnimg.cn/4b823583669c4bac87eed26025906b62.png)
我们进去看看里面指定的mybatis-plus的版本:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kFour6py-1689579111869)(MyBatisPlus自定义sql/image-20230716181234084.png)]](https://img-blog.csdnimg.cn/5dd169ae696f4477b0219934e371d8da.png)
看到是3.4.1版本的mybatis-plus,所以可以放心引入依赖了。
引入好后如下:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0zcc5Elv-1689579111870)(MyBatisPlus自定义sql/image-20230716181350962.png)]](https://img-blog.csdnimg.cn/a2b6e54d3ff748e2b29594a314eef7a1.png)
二、建表
我们新建三个表用来演示:
这三个表如下:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0Eoh0RWx-1689579111870)(MyBatisPlus自定义sql/image-20230717092513762.png)]](https://img-blog.csdnimg.cn/82aec1d2c65b4ceba82bb8fd8afa29c6.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1kx5h2Xl-1689579111871)(MyBatisPlus自定义sql/image-20230717092533898.png)]](https://img-blog.csdnimg.cn/2ae735d48e274bacbb848f6fb316fadb.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oXvKjEWJ-1689579111872)(MyBatisPlus自定义sql/image-20230717092545652.png)]](https://img-blog.csdnimg.cn/4a616cbae7a64e279f553908e39a7939.png)
三、新建实体类
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eb1shnga-1689579111872)(MyBatisPlus自定义sql/image-20230717103553780.png)]](https://img-blog.csdnimg.cn/5c974d76ef1d4eeeacf66350c9e315d5.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XHRoQQh3-1689579111873)(MyBatisPlus自定义sql/image-20230717103612983.png)]](https://img-blog.csdnimg.cn/049c8a8ecc6c42bfbc613e1b5cd366ea.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tBJxc6vv-1689579111873)(MyBatisPlus自定义sql/image-20230717103634367.png)]](https://img-blog.csdnimg.cn/c1151955901248178c8a3c614d67a115.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wqiJB9bE-1689579111881)(MyBatisPlus自定义sql/image-20230717104016887.png)]](https://img-blog.csdnimg.cn/e12c6368e9844ccab32bac8fb8974151.png)
这个DTO里面写你要多表查询的全部数据。
四、新建dao层的接口
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d0fynB8g-1689579111883)(MyBatisPlus自定义sql/image-20230717143723744.png)]](https://img-blog.csdnimg.cn/7aa9aafa8fe44b74a4f6f8df1a423529.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fevaf41r-1689579111884)(MyBatisPlus自定义sql/image-20230717143813308.png)]](https://img-blog.csdnimg.cn/8756dcff1ffb4dfd911aa6659efbda8d.png)
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qzyb1znW-1689579111885)(MyBatisPlus自定义sql/image-20230717143824957.png)]](https://img-blog.csdnimg.cn/74bfcfc8a54048b282b2e8d5df0e2925.png)
五、我们直接测试
测试一:多表查询
你可以把下面的测试代码当作service层的代码。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A8NzxPKA-1689579111887)(MyBatisPlus自定义sql/image-20230717143949138.png)]](https://img-blog.csdnimg.cn/24bcb14ca9c544829682be289342ecb3.png)
结果:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5mbAA03Z-1689579111888)(MyBatisPlus自定义sql/image-20230717144026858.png)]](https://img-blog.csdnimg.cn/efb8db6d194449fc8566ca7eb9ba08cb.png)
我们修改一下查询条件,看看结果:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7kmNlFNh-1689579111890)(MyBatisPlus自定义sql/image-20230717144136302.png)]](https://img-blog.csdnimg.cn/2cc70d1141ae4eb1b927cff7af805cb4.png)
结果:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hpNnWmH4-1689579111893)(MyBatisPlus自定义sql/image-20230717144149992.png)]](https://img-blog.csdnimg.cn/7068e02830854ae4b114be5bff3ff1d6.png)
测试二:多表分页查询
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CLBOA2PA-1689579111900)(MyBatisPlus自定义sql/image-20230717145108414.png)]](https://img-blog.csdnimg.cn/834274b41f0c4652bd472c4d2c79e0e5.png)
结果:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UUO29QYe-1689579111919)(MyBatisPlus自定义sql/image-20230717145205752.png)]](https://img-blog.csdnimg.cn/8a9412a4dcf6437b810fe120fc9c8934.png)
数据库我们执行sql的结果如下(下面的这个sql执行的时候是没有带分页的limit的):
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OQxmGIht-1689579111921)(MyBatisPlus自定义sql/image-20230717145449784.png)]](https://img-blog.csdnimg.cn/56be340b3a0d455eb0c887bd4f3cf458.png)
看到,两个一组,第一组里面就是id为4和id为5的数据。所以测试完全正确。
但是要注意:这里之前是配置了分页插件的,要是没有配置分页插件,上面的执行结果不会有分页效果的。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xWLa3zih-1689579111922)(MyBatisPlus自定义sql/image-20230717145631612.png)]](https://img-blog.csdnimg.cn/9d7fa4b4133f47599904f9f1b2fe1770.png)
测试三:多表分页查询且自定义别名
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g2a3cN9o-1689579111923)(MyBatisPlus自定义sql/image-20230717151346435.png)]](https://img-blog.csdnimg.cn/fc68d23510be40e587b850deaebb7783.png)
结果:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hKDQSm2Y-1689579111925)(MyBatisPlus自定义sql/image-20230717151413394.png)]](https://img-blog.csdnimg.cn/5618b8d3fab24250ad757864126b5248.png)
测试四:多表查询分页且不把数据封装到实体类里面
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5KNZ3Bui-1689579111927)(MyBatisPlus自定义sql/image-20230717152103699.png)]](https://img-blog.csdnimg.cn/4e09bcd7d7754e2c9246c5d72ce0c3c2.png)
结果:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hHAxhK87-1689579111930)(MyBatisPlus自定义sql/image-20230717152132917.png)]](https://img-blog.csdnimg.cn/03154394c5fd4a7bb8845da53b882c3c.png)
测试五:多表分页查询,不封装到实体类,自定义别名
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L0jsmO1m-1689579111931)(MyBatisPlus自定义sql/image-20230717153006733.png)]](https://img-blog.csdnimg.cn/41bad0a3ab674fb4a7f6c7bafef63517.png)
结果:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FrnjXG8b-1689579111932)(MyBatisPlus自定义sql/image-20230717153050937.png)]](https://img-blog.csdnimg.cn/2d563fcedf624c208fcd4d866e536c5f.png)


















![[USACO06DEC] Milk Patterns G](https://img-blog.csdnimg.cn/a2c4539a349c4d2b9fc8eca676724cc2.gif)