使用Mybatis-plus-join做多表查询

使用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)]

我们进去看看里面指定的mybatis-plus的版本:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kFour6py-1689579111869)(MyBatisPlus自定义sql/image-20230716181234084.png)]

看到是3.4.1版本的mybatis-plus,所以可以放心引入依赖了。

引入好后如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0zcc5Elv-1689579111870)(MyBatisPlus自定义sql/image-20230716181350962.png)]

二、建表

我们新建三个表用来演示:

这三个表如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0Eoh0RWx-1689579111870)(MyBatisPlus自定义sql/image-20230717092513762.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1kx5h2Xl-1689579111871)(MyBatisPlus自定义sql/image-20230717092533898.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oXvKjEWJ-1689579111872)(MyBatisPlus自定义sql/image-20230717092545652.png)]

三、新建实体类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eb1shnga-1689579111872)(MyBatisPlus自定义sql/image-20230717103553780.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XHRoQQh3-1689579111873)(MyBatisPlus自定义sql/image-20230717103612983.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tBJxc6vv-1689579111873)(MyBatisPlus自定义sql/image-20230717103634367.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wqiJB9bE-1689579111881)(MyBatisPlus自定义sql/image-20230717104016887.png)]

这个DTO里面写你要多表查询的全部数据。

四、新建dao层的接口

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d0fynB8g-1689579111883)(MyBatisPlus自定义sql/image-20230717143723744.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fevaf41r-1689579111884)(MyBatisPlus自定义sql/image-20230717143813308.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qzyb1znW-1689579111885)(MyBatisPlus自定义sql/image-20230717143824957.png)]

五、我们直接测试
测试一:多表查询

你可以把下面的测试代码当作service层的代码。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A8NzxPKA-1689579111887)(MyBatisPlus自定义sql/image-20230717143949138.png)]

结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5mbAA03Z-1689579111888)(MyBatisPlus自定义sql/image-20230717144026858.png)]

我们修改一下查询条件,看看结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7kmNlFNh-1689579111890)(MyBatisPlus自定义sql/image-20230717144136302.png)]

结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hpNnWmH4-1689579111893)(MyBatisPlus自定义sql/image-20230717144149992.png)]

测试二:多表分页查询

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CLBOA2PA-1689579111900)(MyBatisPlus自定义sql/image-20230717145108414.png)]

结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UUO29QYe-1689579111919)(MyBatisPlus自定义sql/image-20230717145205752.png)]

数据库我们执行sql的结果如下(下面的这个sql执行的时候是没有带分页的limit的):

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OQxmGIht-1689579111921)(MyBatisPlus自定义sql/image-20230717145449784.png)]

看到,两个一组,第一组里面就是id为4和id为5的数据。所以测试完全正确。

但是要注意:这里之前是配置了分页插件的,要是没有配置分页插件,上面的执行结果不会有分页效果的。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xWLa3zih-1689579111922)(MyBatisPlus自定义sql/image-20230717145631612.png)]

测试三:多表分页查询且自定义别名

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g2a3cN9o-1689579111923)(MyBatisPlus自定义sql/image-20230717151346435.png)]

结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hKDQSm2Y-1689579111925)(MyBatisPlus自定义sql/image-20230717151413394.png)]

测试四:多表查询分页且不把数据封装到实体类里面

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5KNZ3Bui-1689579111927)(MyBatisPlus自定义sql/image-20230717152103699.png)]

结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hHAxhK87-1689579111930)(MyBatisPlus自定义sql/image-20230717152132917.png)]

测试五:多表分页查询,不封装到实体类,自定义别名

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L0jsmO1m-1689579111931)(MyBatisPlus自定义sql/image-20230717153006733.png)]

结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FrnjXG8b-1689579111932)(MyBatisPlus自定义sql/image-20230717153050937.png)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值