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

 更新时间:2020年08月24日 09:57:24   作者:liujianko  
这篇文章主要介绍了MyBatis-Plus 如何实现连表查询的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

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

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

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

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

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

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

首先

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

// 第一步,在 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 来封装成一个实体类。

// 将查询字段 自定义成 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

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

运行成功

// 对应 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 连表查询内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • SpringBoot使用validation-api实现参数校验的示例

    SpringBoot使用validation-api实现参数校验的示例

    这篇文章主要介绍了SpringBoot使用validation-api实现参数校验的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • 聊一聊Java的JVM类加载机制

    聊一聊Java的JVM类加载机制

    这篇文章主要介绍了聊一聊Java的JVM类加载机制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • mybatis中的if test判断入参的值问题

    mybatis中的if test判断入参的值问题

    这篇文章主要介绍了mybatis中的if test判断入参的值问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • 在maven中引入本地jar包的步骤

    在maven中引入本地jar包的步骤

    这篇文章主要介绍了在maven中引入本地jar包的步骤,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下
    2021-04-04
  • Java file类中renameTo方法操作实例

    Java file类中renameTo方法操作实例

    renameTo()方法是File类的一部分,renameTo()函数用于将文件的抽象路径名重命名为给定的路径名​​,下面这篇文章主要给大家介绍了关于Java file类中renameTo方法操作的相关资料,需要的朋友可以参考下
    2022-11-11
  • 浅析Java中Future接口的使用方法

    浅析Java中Future接口的使用方法

    在Java开发中,异步编程是提高系统性能和响应能力的重要手段之一。本文将深入探讨Future接口的原理和源码解读,帮助读者更好地理解Future接口的工作机制和使用方法
    2023-05-05
  • java+jsp+struts2实现发送邮件功能

    java+jsp+struts2实现发送邮件功能

    这篇文章主要为大家详细介绍了java+jsp+struts2实现发送邮件功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • Java Web编程之Servlet技术详解

    Java Web编程之Servlet技术详解

    这篇文章主要为大家详细介绍了Java Web编程之Servlet技术,Servlet就是一种实现了Servlet接口的类,它由Web容器(Tomcat/Jetty等)负责调用并创建,用于接收和响应用户请求,感兴趣的小伙伴们可以参考一下
    2016-05-05
  • SpringSecurity自动登录流程与实现详解

    SpringSecurity自动登录流程与实现详解

    这篇文章主要介绍了SpringSecurity自动登录流程与实现详解,所谓的自动登录是在访问链接时浏览器自动携带上了Cookie中的Token交给后端校验,如果删掉了Cookie或者过期了同样是需要再次验证的,需要的朋友可以参考下
    2024-01-01
  • Java使用redisson实现分布式锁的示例详解

    Java使用redisson实现分布式锁的示例详解

    这篇文章主要为大家详细介绍了在Java项目中使用redisson实现分布式锁,文中的示例代码讲解详细,具有一定的学习价值,需要的可以参考一下
    2023-07-07

最新评论