resultMap标签中里的collection标签详解
resultMap标签中的collection标签
collection(一对多)
元素的作用和association元素的作用差不多一样,事实上,它们非常类似,也是映射到JavaBean的某个“复杂类型” 属性,只不过这个属性是一个集合列表,即JavaBean内部嵌套一个复杂数据类型(集合)。和使用association元素一样,我们使用嵌套查询, 或者从连接中嵌套结果集。
下面通过一个示例来演示coeltien 的具体应用,示例需求获取指定用户的相关的信息和地址列表。
我们有实体类Employee如下:
package com.xyj.entity;
import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Employee {
private int eid;
private String ename;
private String epwd;
private String address;
private String tel;
private List<Sport> sports;//职员所参加的所有运动项目
}
员工间举行了一个小型运动会,又有Sport实体类如下:
package com.xyj.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Sport {
private int sportId;
private String sportName;
private String sportScore;
}
可知一个员工可以参加多个运动项目,所以我们的Employee对象内部嵌套了一个复杂数据类型的属性,sports,接下来在EmpDao接口中添加根据职员id获取职员参加的项目列表的方法,代码如下:
List<Employee> findSportsInfoByEmpId(@Param("eid")Integer id);
修改对应的映射文件,由于Employee内部嵌套了集合对象,因此需要使用collection来实现结果映射,实例代码如下:
<select id="findSportsInfoByEmpId" resultMap="empmap">
select e.*,s.*
from employee as e,sport as s
where e.eid=s.eid
and e.eid=#{eid}
</select>
<resultMap type="Employee" id="empmap">
<id property="eid" column="eid"/>
<result property="ename" column="ename"/>
<result property="epwd" column="epwd"/>
<result property="address" column="address"/>
<result property="tel" column="tel"/>
<!-- collection描述一对多的关系,ofType是集合所包含的类型,可以写完整Java类名或别名 -->
<collection property="sports" ofType="Sport">
<id property="sportId" column="sportid"/>
<result property="sportName" column="sportname"/>
<result property="sportScore" column="sportscore"/>
</collection>
</resultMap>
最后进行测试,查看结果是否正确:
@org.junit.Test
public void test() {
SqlSession session = MyBatisUtils.getSqlSession();
EmpDao ed = session.getMapper(EmpDao.class);
List<Employee> list = ed.findSportsInfoByEmpId(1);
for (Employee emp : list) {
for (Sport e : emp.getSports()) {
System.out.println(e);
}
}
}
运行结果:
查询成功,但是我们的collection标签写在resultMap标签的内部,不能达到复用,当然是可以复用的,只需修改代码如下:
<select id="findSportsInfoByEmpId" resultMap="empmap">
select e.*,s.*
from employee as e,sport as s
where e.eid=s.eid
and e.eid=#{eid}
</select>
<resultMap type="Employee" id="empmap">
<id property="eid" column="eid"/>
<result property="ename" column="ename"/>
<result property="epwd" column="epwd"/>
<result property="address" column="address"/>
<result property="tel" column="tel"/>
<collection property="sports" ofType="Sport" resultMap="sportmap"></collection>
</resultMap>
<resultMap type="Sport" id="sportmap">
<id property="sportId" column="sportid"/>
<result property="sportName" column="sportname"/>
<result property="sportScore" column="sportscore"/>
</resultMap>
collection标签中各属性的说明
<result column="name" property="name"/>
<!--
collection定义一个子集合对象返回
ofType:指定集合里面元素的类型
property属性设置集合的属性名
-->
<collection property="passengers" ofType="Passenger">
<!--
id指的是主键,
column是数据库中的列,可以是别名
property映射的是实体类中的属性
result是普通列(非主键)
-->
<id column="pid" property="id"/>
<result column="pname" property="name"/>
</collection>
</resultMap>
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341