我们做多表查询都是要自己写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.yulichanggroupId>
<artifactId>mybatis-plus-joinartifactId>
<version>1.2.4version>
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
我们进去看看里面指定的mybatis-plus的版本:
看到是3.4.1版本的mybatis-plus,所以可以放心引入依赖了。
引入好后如下:
我们新建三个表用来演示:
这三个表如下:
这个DTO里面写你要多表查询的全部数据。
你可以把下面的测试代码当作service层的代码。
结果:
我们修改一下查询条件,看看结果:
结果:
结果:
数据库我们执行sql的结果如下(下面的这个sql执行的时候是没有带分页的limit的):
看到,两个一组,第一组里面就是id为4和id为5的数据。所以测试完全正确。
但是要注意:这里之前是配置了分页插件的,要是没有配置分页插件,上面的执行结果不会有分页效果的。
结果:
结果:
结果: