mybatis查询一对多数据

本文详细介绍了MyBatis中association标签的使用,通过示例展示了如何在查询用户列表时同时获取每个用户的联系人集合,避免了多次数据库查询导致的效率问题。文章还给出了项目实体类与参与人实体类的示例,并提供了resultMap的配置信息,帮助理解一对多查询的映射配置。最后,作者探讨了在实际开发中处理此类查询的不同方法。
摘要由CSDN通过智能技术生成

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>

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

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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值