mybatis解析-association实现原理详解_龚厂长的博客-CSDN博客_mybatis association

可以使用association标签或者collection来完成,之前开发的时候经常会需要返回这种嵌套的结构的数据比如查询用户列表,然后用户的联系人集合 大概结构如下:

用户:{id:用户id,name:用户名称phone:用户手机contactList:[{联系人json数据1},{联系人json数据2},{联系人json数据3}]
}

如果先查询一个用户的集合,然后遍历根据每个用户的ID再去关联查询联系人表则效率受影响,而且一般公司也禁止这么去做,那么我之前的做法就是先查询出用户列表集合:

List<Long> userIds =userList.stream().map(user->user.getId()).collect(Collection.toList);
ContactList  联系人结果List= 联系人Mapper.selectUserByIds(userIds);

然后用用户的集合和联系人的结果双向遍历,如果用户的id等于联系人的用户ID,就往用户的联系人集合里put 这样其实也是能解决问题的,但是写起来的话就比较麻烦 其实可以使用mybatis里的映射来做 会简单很多,开发这么些年 其实还真没有用过这个功能 下面我就以collection这个标签来举例

首先是返回的实体对象1-项目表

@Data
public class BusiProjectInitiationParam extends BaseParam {/*** */@NotNull(message = "不能为空,请检查id参数", groups = {edit.class, delete.class, detail.class})private Long projectId;/*** 操作id*/@NotNull(message = "操作id不能为空,请检查optId参数", groups = {add.class, edit.class})private Long busiOptId;/*** 项目编号*/@NotBlank(message = "项目编号不能为空,请检查code参数", groups = {add.class, edit.class})private String code;/*** 项目名称*/@NotBlank(message = "项目名称不能为空,请检查name参数", groups = {add.class, edit.class})private String name;/*** 租赁类型*/@NotBlank(message = "租赁类型不能为空,请检查rentType参数", groups = {add.class, edit.class})private String rentType;/*** 项目金额(元)*/@NotNull(message = "项目金额(元)不能为空,请检查amount参数", groups = {add.class, edit.class})private BigDecimal amount;/*** 业务经理*/@NotNull(message = "业务经理不能为空,请检查busiManager参数", groups = {add.class, edit.class})private Long busiManager;/*** 所属部门*/@NotNull(message = "所属部门不能为空,请检查busiDept参数", groups = {add.class, edit.class})private Long busiDept;/*** 是否有担保*/@NotBlank(message = "是否有担保不能为空,请检查isGuarantee参数", groups = {add.class, edit.class})private String isGuarantee;/*** 还款来源*/@NotBlank(message = "还款来源不能为空,请检查repaySource参数", groups = {add.class, edit.class})private String repaySource;/*** 项目综述(优劣势分析)*/@NotBlank(message = "项目综述(优劣势分析)不能为空,请检查analysisNote参数", groups = {add.class, edit.class})private String analysisNote;//项目参与人@NotNull(message = "项目参与人不能为空,请检查updateUser参数", groups = {add.class, edit.class})private List<BusiProjectInitiationParterParam> parterList;}

然后下面是项目参与人的实体:

@Data
public class BusiProjectInitiationParterParam extends BaseParam {/*** */@NotNull(message = "不能为空,请检查id参数", groups = {edit.class, delete.class, detail.class})private Long parterId;/*** 项目主键*/@NotNull(message = "项目主键不能为空,请检查projectId参数", groups = {add.class, edit.class})private Long projectId;/*** 客户ID*/@NotNull(message = "客户ID不能为空,请检查customerId参数", groups = {add.class, edit.class})private Long customerId;/*** 客户名称*/@NotNull(message = "客户ID不能为空,请检查customerId参数", groups = {add.class, edit.class})private String customerName;/*** 参与角色*/@NotBlank(message = "参与角色不能为空,请检查role参数", groups = {add.class, edit.class})private String role;/*** 类型*/private String type;/*** */@NotNull(message = "不能为空,请检查isDelete参数", groups = {add.class, edit.class})private Integer isDelete;/*** */@NotNull(message = "不能为空,请检查createTime参数", groups = {add.class, edit.class})private String createTime;/*** */@NotNull(message = "不能为空,请检查createUser参数", groups = {add.class, edit.class})private Long createUser;/*** */@NotNull(message = "不能为空,请检查createDept参数", groups = {add.class, edit.class})private Long createDept;/*** */@NotNull(message = "不能为空,请检查updateTime参数", groups = {add.class, edit.class})private String updateTime;/*** */@NotNull(message = "不能为空,请检查updateUser参数", groups = {add.class, edit.class})private Long updateUser;}

查询项目列表的同时 查询每个项目的参与人集合,下面是mybatis配置:

<select id="selectProjectPageNew" resultMap="associationResultMap">
select 项目表.字段信息,参与人表.字段信息 from 项目表 left join 项目参与人表 on 项目表.id=项目参与方表.项目id </select>

然后接下来是resultMap里的配置信息

<resultMap id="associationResultMap" type="项目表的全路径"><id column="project_id(项目表主键数据库字段)"  property="projectId(项目表POJO属性字段)" /><result column="项目表普通字段"  property="对应的POJO属性" />......//把需要查询的项目字段罗列下去<collection property="parterList(项目表对象里参与方的集合属性名称)" column="project_id(项目表和参与方表关联的数据库字段)" ofType="参与方的全路径"><id column="参与方数据库字段(parter_id)"  property="参与方POJI属性(parterId)" />......//把需要查询的参与方字段罗列下去</collection></resultMap>

上面的伪代码大致说明了配置信息,然后其他查询入参和正常一样,该怎么传就怎么传

最后我想看看目前大多数朋友在做这种一对多结果查询的时候 是使用的哪一种方式来完成的?

mybatis查询一对多数据相关推荐

  1. 循环查询sql带逗号(,)分隔的数据 以及一对多数据转化为逗号(,)分割数据...

    逗号分割数据转化为一对多数据select * from sys_role_list where id in(select c from(with test as (select roleid c fr ...

  2. mybatis中一对多的写法,注解SQL, and XML

    mybatis中注解对collection集成不是太好. 应用场景:当需要从表中获取一对多数据时(入redis用),我们用注解sql写的时候,长这样: //以userId为key,对应的多条记录为va ...

  3. Mybatis Plus一对多完整版实战教学!

    Mybatis Plus完整版一对多实战教学! 最近做项目用到了mybatis plus 刚使用确实不是很熟练. 增删改查非常方便,但是然项目中需要用到了一对多的一个查询,我却毫无思路,所以在网上查阅 ...

  4. mybatis查询报错:com.mysql.cj.exceptions.DataConversionException: Cannot determine value type from string

    mybatis查询报错: com.mysql.cj.exceptions.DataConversionException: Cannot determine value type from strin ...

  5. 不敢相信,相同 SQL 下 Mybatis 查询结果和数据库竟然不一样!

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | jianshu.com/p/7c569ca68 ...

  6. Spring Boot之基于Redis实现MyBatis查询缓存解决方案

    转载自 Spring Boot之基于Redis实现MyBatis查询缓存解决方案 1. 前言 MyBatis是Java中常用的数据层ORM框架,笔者目前在实际的开发中,也在使用MyBatis.本文主要 ...

  7. 【Java从0到架构师】MyBatis - 查询

    MyBatis - 查询 数据库事务 (Database Transaction) MyBatis 使用准备 依赖 配置文件 创建 Session MyBatis 查询 实体映射 字段映射 - res ...

  8. mybatis查询返回null解决方案

    mybatis查询返回null解决方案 参考文章: (1)mybatis查询返回null解决方案 (2)https://www.cnblogs.com/zipon/p/6361661.html 备忘一 ...

  9. Mybatis查询oracle之clob类型

    clob是大字段,可以存储文档内容,mybatis查询clob字段需要做一些处理,才可以返回字符串,可用以下方法处理: 1.public static String getClob(Object o) ...

最新文章

  1. Python字符串练习题
  2. OpenCASCADE:Foundation Classes使用句柄编程
  3. 有关软件测试的证书,软件测试证书有用吗
  4. 委婉的拒绝offer
  5. 阿里研究院:2020阿里农产品电商报告
  6. 常数除以0的极限是什么_酶动力学中的一些常数简介
  7. 《创造奇迹的编程语言也有黑历史!原来他还有这副面孔?!》
  8. sql server使用convert来取得datetime日期数据
  9. linux ns机制,Linux内核API ns_to_timespec
  10. android 安装卸载应用提醒_Android程序使用代码的安装和卸载!!!
  11. 仿百度地图全景小球旋转
  12. Oracle中函数/过程返回结果集的几种方式
  13. putty秘钥转换成xhell支持的格式
  14. 文件白名单如何从行为管控走向信息安全
  15. 量化投资理论文献综述
  16. 单片机万年历阴阳历c语言,自己制作的单片机万年历 程序+原理图
  17. SOPCAST所有频道的地址
  18. 公安部中标十大身份证阅读器品牌型号
  19. 下载keep运动软件_Keep下载_Keep苹果官方免费版APP下载[健身运动]-下载之家
  20. Pytorch深度学习基础 实战天气图片识别(基于ResNet50预训练模型,超详细)

热门文章

  1. 日期moment与yy-mm-dd之间的转换:moment(‘00:00:00‘,‘HH:mm:ss‘)
  2. windows上传本地项目到github
  3. Mysql5.7 Yum安装详解
  4. 阿里云ubuntu下载地址
  5. os.listdir()和os.listdir(“c:“)
  6. cocostudio骨骼动画问题总汇
  7. python 编写一个定时闹钟播放音乐的脚本
  8. 环保 HJ212协议解析
  9. 七个让你轻松减肥de小妙招
  10. 用户认购定期存款预测R语言实现