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

(0)

相关推荐

  • Mybatis plus中使用in查询出错如何解决

    不想看我bb的直接点上面的 ''解决方法'' 我的情况是这样的,在使用mybatis plus提供的QueryWrapper方法里的in查询时,我的参数为类似"1,2,3,4"这样的字符串 //要查的参数 String masterIds = "81554,5654,55948,48945"; QueryWrapper<FpjyPauperInfo> pauperqw = new QueryWrapper<>(); pauperqw.in(&

  • 结合mybatis-plus实现简单不需要写sql的多表查询

    项目地址: GITHUB (本地下载) java mybatis 多表查询 简介 实现简单的实体类操作多表,  首先你的项目是使用了mybatis-plus 才可以使用 设计说明 如何关联表? 找第一张表注解为 TableId (mybatis-plus 注解)的属性名, 到每二张表找同样的属性名, 如果没找到,反过来找,如果还没找到,挨个属性找.以此类推,实现关联的前提条件是 主从表的关联例名必须一样 // user 表 @TableId private Integer userId // a

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

    在项目开发中,难免会遇到连表查询的操作. 项目中用的是 MyBatis-Plus,是新使用的框架.官方文档看这里. 我写过一篇通过单元测试来验证 MyBatis-Plus 的 CRUD 操作.点这里跳转 今天遇到连表查询的问题,特此记录一下. 遇到需要连表操作,想起 MyBatis 的操作连表查询,要是 MyBatis-Plus 也像 MyBatis 一样,就脑壳痛了.(MyBatis-Plus 是 MyBatis 的增强版) 脑壳痛归脑壳痛,先动手干. 首先 因为官方的内置接口方法都是针对单表

  • Mybatis基于注解实现多表查询功能

    对应的四种数据库表关系中存在四种关系:一对多,多对应,一对一,多对多.在前文中已经实现了xml配置方式实现表关系的查询,本文记录一下Mybatis怎么通过注解实现多表的查询,算是一个知识的补充. 同样的先介绍一下Demo的情况:存在两个实体类用户类和账户类,用户类可能存在多个账户,即一对多的表关系.每个账户只能属于一个用户,即一对一或者多对一关系.我们最后实现两个方法,第一个实现查询所有用户信息并同时查询出每个用户的账户信息,第二个实现查询所有的账户信息并且同时查询出其所属的用户信息. 1.项目

  • 基于Mybatis Plus实现多表分页查询的示例代码

    注意:Mybatis Plus 3.0.7 版本才开始用[自定义sql]+[QueryWrapper],低版本不能使用,还是老实写SQL进行条件拼接 1.源码分析 在Wrapper<T>接口中就有如下方法 /** * 获取自定义SQL 简化自定义XML复杂情况 * 使用方法:自定义sql + ${ew.customSqlSegment} * 1.逻辑删除需要自己拼接条件 (之前自定义也同样) * 2.不支持wrapper中附带实体的情况 (wrapper自带实体会更麻烦) * 3.用法 ${e

  • springboot整合mybatis-plus实现多表分页查询的示例代码

    1.新建一个springboot工程 2.需要导入mybatis和mybatis-plus的依赖文件 <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.1.1</version> </dependency> <dependency> &l

  • MybatisPlus自定义Sql实现多表查询的示例

    前言 前段时间看同事的代码,发现他用Layui+MybatisPlus做分页查询做得很规整,认真看了下代码发现这种方式不仅适用于与Layui做分页查询,在任何时候需要多表联查的时候都可以用到.  以下以Layui分页查询作为参考,在实际应用中可以灵活使用. 分页查询VO对象 @Data @AllArgsConstructor @NoArgsConstructor public class LayuiData { private Integer code=0; private Long count

  • Mybatis实现动态增删改查功能的示例代码

    一.Mybatis 流程简介 最近在看 Mybatis 的源码,大致了解整个框架流程后便手写了一个特别简单的SimpMybatis的小Demo,来巩固这整个框架的学习.下图是我所画的框架大致执行流程:

  • django admin实现动态多选框表单的示例代码

    背景 借助django-admin,可以快速得到CRUD界面,但若需要创建多选标签字段时,需要对表单进行调整 示例 model.py 一个tag(标签类),一个book(书本类) book携带tag,这里不借助有性能问题的外键 class tag(models.Model):     name = models.CharField(max_length=20, verbose_name='标签') class book(models.Model):     name = models.CharF

  • MybatisPlus实现分页查询和动态SQL查询的示例代码

    目录 一.描述 二.实现方式 三. 总结 一.描述 实现下图中的功能,分析一下该功能,既有分页查询又有根据计划状态.开始时间.公司名称进行动态查询. 二.实现方式 Controller层 /** * @param userId 专员的id * @param planState 计划状态 * @param planStartTime 计划开始时间 * @param emtCode 公司名称-分身id * @return java.util.List<com.hc360.crm.entity.po.

  • Layui实现多条件查询的示例代码

    最近做一个档案系统,发现字段超多 带分页的多条件查询(分页需要后端分页,传page给后端才可实现,前端无法直接实现) 当我们点击搜索按钮时会筛选出输入值的相关数据,多条件查询是建立在数据之上,数据查询出来后开辟条件在用户输入的值不为空的情况下让查询出来的数据下面的某值等于用户输入的值,然后查询的数据返回到视图再重新加载渲染的表格,查询出来的数据是所筛选的出来的数据与用户输入的值相关. 多条件查询表单 <form class="layui-form" action="&q

  • 微信小程序form表单组件示例代码

    表单,将组件内的用户输入的<switch/> <input/> <checkbox/> <slider/> <radio/> <picker/> 提交. 当点击<form/>表单中 formType 为 submit 的<button/>组件时,会将表单组件中的 value 值进行提交,需要在表单组件中加上 name 来作为 key. 属性名 类型 说明 report-submit Boolean 是否返回fo

随机推荐