mybatis解析-association实现原理详解_龚厂长的博客-CSDN博客_mybatis association
可以使用association标签或者collection来完成,之前开发的时候经常会需要返回这种嵌套的结构的数据比如查询用户列表,然后用户的联系人集合 大概结构如下:
用户:{
id:用户id,
name:用户名称
phone:用户手机
contactList:[
{联系人json数据1},{联系人json数据2},{联系人json数据3}
]
}
如果先查询一个用户的集合,然后遍历根据每个用户的ID再去关联查询联系人表则效率受影响,而且一般公司也禁止这么去做,那么我之前的做法就是先查询出用户列表集合:
List 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 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配置:
然后接下来是resultMap里的配置信息
......//把需要查询的项目字段罗列下去
......//把需要查询的参与方字段罗列下去
上面的伪代码大致说明了配置信息,然后其他查询入参和正常一样,该怎么传就怎么传
最后我想看看目前大多数朋友在做这种一对多结果查询的时候 是使用的哪一种方式来完成的?