欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

resultMap标签中里的collection标签详解

程序员文章站 2022-03-09 11:50:31
目录resultmap标签中的collection标签collection(一对多)collection标签中各属性的说明resultmap标签中的collection标签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);
            }
        }
    }

运行结果: 

resultMap标签中里的collection标签详解

查询成功,但是我们的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>

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。