resultMap之collection聚集

本文介绍了MyBatis中处理一对多关系的聚集元素的使用方法,包括通过select执行额外SQL语句及使用resultMap处理join查询的方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

聚集元素用来处理“一对多”的关系。

需要指定映射的Java实体类的属性,属性的javaType(一般为ArrayList);

列表中对象的类型ofType(Java实体类);对应的数据库表的列名称;
不同情况需要告诉MyBatis 如何加载一个聚集。

MyBatis 可以用两种方式加载:

1. select: 执行一个其它映射的SQL 语句返回一个Java实体类型。较灵活但会将执行多次嵌套的SQL语句。
2. resultMap: 使用一个嵌套的结果映射来处理通过join查询结果集,映射成Java实体类型。

两种加载方式格式如下:

1.集合的嵌套查询(select)

<collection property="Java属性名" ofType="另一Java类名" javaType="ArrayList" column="关联主键ID(用于嵌套查询SQL语句传入参数,多个用逗号分开)" select="另一个select映射SQL的ID"/>

<select parameterType="int" resultType="另一Java类名" id="另一个select映射SQL的ID">

SQL语句

<select>

注意:column属性的值必须与相应的SQL查询语句中的列名相同。MyBatis会将第一条SQL语句查询出来的该列的值用于所嵌套的SQL映射语句的入参。因第一条SQL语句查询出来的每个该列的值都将用于执行另一个SQL语句,所以嵌套的SQL语句将被多次执行。

2.集合的嵌套结果(resultMap)

<collection property="Java属性名" ofType="另一Java类名" javaType="ArrayList" resultMap="另一个resultMap的ID"/>

<resultMap="另一个resultMap的ID" type="另一Java类名">

<id property="id" column="关联主键ID"/>

........

</resultMap>

注意:column属性的值必须与相应的SQL查询语句的列名一样。

集合的嵌套查询(select)示例:
[html]  view plain  copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"   
  3. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">  
  4.   
  5. <mapper namespace="com.myapp.mapper.UserMapper">  
  6.   <select id="getUserList" resultMap="userdetailResult">  
  7.     select * from t_user where id between 1 and 10  
  8.   </select>  
  9.   <select id="selectRoles" resultType="com.myapp.domain.Role" parameterType="int">  
  10.     select * from t_user_role a,t_role b where a.user_id=#{id} and a.role_id=b.id  
  11.   </select>  
  12.   <resultMap id="userdetailResult"  type="User">   
  13.          <id property="id"  column="user_id" />  
  14.     <result property="name" column="user_name"/>  
  15.     <result property="createDate" column="create_date"/>  
  16.     <collection property="roles"  ofType="Role" javaType="ArrayList"  column="id" select="selectRoles"/>  
  17.   </resultMap>  
  18. </mapper>  


集合的嵌套结果(result)示例:

[html]  view plain  copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"   
  3. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">  
  4.   
  5. <mapper namespace="com.myapp.mapper.UserMapper">  
  6.   <select id="getUserList" resultMap="userdetailResult">  
  7.     SELECT  
  8.         u.id as user_id,  
  9.         u.name as user_name,  
  10.         u.create_date,  
  11.         r.id as role_id,  
  12.         r.name as role_name  
  13.     FROM t_user u  
  14.     LEFT JOIN t_user_role ur ON(u.id=ur.user_id)  
  15.     LEFT JOIN t_role r ON(r.id=ur.role_id) where u.id=1  
  16.   </select>  
  17.   <resultMap id="userdetailResultNew"  type="User">   
  18.     <id property="id"  column="user_id" />  
  19.     <result property="name" column="user_name"/>  
  20.     <result property="createDate" column="create_date"/>  
  21.     <collection property="roles"  ofType="Role" javaType="ArrayList">   
  22.         <id property="id"  column="role_id"/>   
  23.         <result property="name"  column="role_name"/>  
  24.     </collection>   
  25.   </resultMap>  
  26.   <resultMap id="roleResult" type="Role">  
  27.     <id property="id"  column="role_id"/>   
  28.     <result property="name"  column="role_name"/>  
  29.   </resultMap>  
  30.   <resultMap id="userdetailResult"  type="User">   
  31.     <id property="id"  column="user_id" />  
  32.     <result property="name" column="user_name"/>  
  33.     <result property="createDate" column="create_date"/>  
  34.     <collection property="roles"  ofType="Role" javaType="ArrayList" resultMap="roleResult"/>   
  35.   </resultMap>  
  36. </mapper>  

如果你只是简单的嵌套,可以像id="userdetailResultNew" 那样将要嵌套的结果直接写在collection子元素中去。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值