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 也许也能像上面一样,并不需要在主表的实体类里面关联另外一个实体,不过有机会还是可以试试看的。
上一篇:windows环境下java开发工具maven的安装教程图解
栏 目:JAVA代码
本文标题:MyBatis-Plus 如何实现连表查询的示例代码
本文地址:http://www.codeinn.net/misctech/28930.html
阅读排行
- 1Java Swing组件BoxLayout布局用法示例
- 2java中-jar 与nohup的对比
- 3Java邮件发送程序(可以同时发给多个地址、可以带附件)
- 4Caused by: java.lang.ClassNotFoundException: org.objectweb.asm.Type异常
- 5Java中自定义异常详解及实例代码
- 6深入理解Java中的克隆
- 7java读取excel文件的两种方法
- 8解析SpringSecurity+JWT认证流程实现
- 9spring boot里增加表单验证hibernate-validator并在freemarker模板里显示错误信息(推荐)
- 10深入解析java虚拟机