MyBatis-Plus 如何实现连表查询的示例代码

2025-05-29 0 76

在项目开发中,难免会遇到连表查询的操作。

项目中用的是 MyBatis-Plus,是新使用的框架。官方文档看这里。

我写过一篇通过单元测试来验证 MyBatis-Plus 的 CRUD 操作。点这里跳转

今天遇到连表查询的问题,特此记录一下。

遇到需要连表操作,想起 MyBatis 的操作连表查询,要是 MyBatis-Plus 也像 MyBatis 一样,就脑壳痛了。(MyBatis-Plus 是 MyBatis 的增强版)

脑壳痛归脑壳痛,先动手干。

首先

因为官方的内置接口方法都是针对单表的,所以要连表的话,还是得中规中矩来。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32
// 第一步,在 mapper.java 类中定义一个连表查询的方法 selectTsxxWsla

public interface WTsxxMapper extends SuperMapper<WTsxx> {

List<Object> selectTsxxWsla();

}

// 第二步,在 mapper.xml 中定义 id='selectTsxxWsla' 的查询块

<mapper namespace="com.haoda.sswfw.dao.primary.mapper.WTsxxMapper">

<select id="selectTsxxWsla" resultType="map">

SELECT a.*,CONCAT(b.xxid,'') AS xxid,b.nr,b.xxbt,b.weixzt,b.ywlxbm,b.createtime,b.glid

FROM v_weix_user a,w_tsxx b

JOIN (

SELECT xxid,user_name,createtime FROM w_tsxx_user

) c ON b.xxid = c.xxid

WHERE a.user_name = c.user_name AND a.openid != '' AND b.weixzt = '2' AND b.errcode IS NULL AND LOWER(b.ywlxbm) = 'wsla'

</select>

</mapper>

// 第三步,直接写测试用例,看看能出来什么效果

@RunWith(SpringRunner.class)

@SpringBootTest

public class DbTest {

@Autowired

private WTsxxMapper tsxxMapper;

@Test

public void test3() {

List<Object> selectTsxxWsla = tsxxMapper.selectTsxxWsla();

for (Object obj : selectTsxxWsla) {

System.out.println(obj);

}

}

}

运行结果出来发现,select 语句中的字段都封装成 Object,存到 List 集合中去了,不过有一点就是如果字段的值是 null 的,就不会封到 Object 里。

有点小开心

回顾一下我上次在 MyBatis 的连表方式,首先我在主表的实体类中把需要连表的实体类加进去了。

然后在 mapper.xml 添加了 association 标签,用来配置关联关系的。

然后

我发现可以封装 Object,那我想是不是就可以自定义一个 VO 来封装成一个实体类。

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22
// 将查询字段 自定义成 WxTsxxVo

public class WxTsxxVo {

private String openid;

private String unionid;

private Long user_id;

private String user_name;

.....

}

// 原本 List<Object> 替换成 List<WxTsxxVo>

public interface WTsxxMapper extends SuperMapper<WTsxx> {

List<WxTsxxVo> selectTsxxWsla();

}

// 原本 List<Object> 替换成 List<WxTsxxVo>

@Test

public void test3() {

List<WxTsxxVo> selectTsxxWsla = tsxxMapper.selectTsxxWsla();

for (WxTsxxVo obj : selectTsxxWsla) {

System.out.println(obj);

}

}

然后很开心运行了 test3,想着结果应该没问题的了,结果报错了,报了个转换异常,不能转换成 WxTsxxVo 对象。

不对啊,Object 都没有报错,我定义了个 WxTsxxVo 实体就报错了?

后来想想应该是查询出来的结果不认识我这个 WxTsxxVo,网上搜了一下「连表查询封装进自定义实体类」,看到有个解决方案是 添加association标签,还有另外一个解决方案是在 mapper.xml 中写一个对应的 resultMap

所以我选择尝试第二种方案。

运行成功

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18
// 对应 WxTsxxVo 实体类,写了一个对应的 resultMap

<resultMap id="WxTsxxVo" type="com.haoda.sswfw.job.vo.WxTsxxVo">

<result column="openid" property="openid" />

<result column="unionid" property="unionid" />

<result column="user_id" property="user_id" />

<result column="user_name" property="user_name" />

...

</resultMap >

// 原先的 resultType="map" 替换成 resultMap="WxTsxxVo"

<select id="selectTsxxWsla" resultMap="WxTsxxVo">

SELECT a.*,CONCAT(b.xxid,'') AS xxid,b.nr,b.xxbt,b.weixzt,b.ywlxbm,b.createtime,b.glid

FROM v_weix_user a,w_tsxx b

JOIN (

SELECT xxid,user_name,createtime FROM w_tsxx_user

) c ON b.xxid = c.xxid

WHERE a.user_name = c.user_name AND a.openid != '' AND b.weixzt = '2' AND b.errcode IS NULL AND LOWER(b.ywlxbm) = 'wsla'

</select>

再次运行,这次就成功了。查询出来的每条结果都封装成 WxTsxxVo,然后在放到 List 集合里面。

总结
1.新框架需要多点尝试,所以写测试用例就很重要了。
2.MyBatis 也许也能像上面一样,并不需要在主表的实体类里面关联另外一个实体,不过有机会还是可以试试看的。

到此这篇关于MyBatis-Plus 如何实现连表查询的示例代码的文章就介绍到这了,更多相关MyBatis-Plus 连表查询内容请搜索快网idc以前的文章或继续浏览下面的相关文章希望大家以后多多支持快网idc!

原文链接:https://blog.csdn.net/godbrian/article/details/89562499

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 MyBatis-Plus 如何实现连表查询的示例代码 https://www.kuaiidc.com/118309.html

相关文章

发表评论
暂无评论