新西兰服务器

resultMap中的collection标签怎么用


resultMap中的collection标签怎么用

发布时间:2022-02-07 11:04:45 来源:高防服务器网 阅读:92 作者:iii 栏目:开发技术

这篇文章主要介绍“resultMap中的collection标签怎么用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“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>

    关于“resultMap中的collection标签怎么用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注高防服务器网行业资讯频道,小编每天都会为大家更新不同的知识点。

    [微信提示:高防服务器能助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。

    [图文来源于网络,不代表本站立场,如有侵权,请联系高防服务器网删除]
    [