您的位置:

MyBatis中的ResultMapCollection详解

一、ResultMapCollection概述

在MyBatis中,查询结果集通常会转化为Java对象,而ResultMapCollection就是用于映射查询结果集中每个记录的Java对象集合。一个ResultMapCollection可以包含多个ResultMap,并且每个ResultMap定义了如何将一条查询结果转换为一个Java对象。一个ResultMap可以定义一个复杂对象或嵌套多个ResultMap来定义一个复杂对象图。

二、定义ResultMapCollection

定义ResultMapCollection通常可以通过iBatis的Mapper XML实现,定义时常用的两个标签是

1、使用 定义

<resultMap id="UserMap" type="User">    
    <id property="id" column="id" />    
    <result property="name" column="name" />    
    <result property="age" column="age" />
</resultMap>

像上面这样使用 定义一个简单的ResultMap。其中id属性为该ResultMap的ID,type属性为该ResultMap解析出的Java对象类型。

2、使用 定义

在使用 定义ResultMapCollection时,需要为每个ResultMap指定一个ID和一个返回类型,每个ResultMap都有唯一一个ID,这个ID被用于关联查询语句和Java对象属性。下面是一个简单的使用 定义的例子:

<resultMapCollection id="allUser" type="java.util.ArrayList">   
    <resultMap id="UserMap" type="User">    
        <id property="id" column="id" />    
        <result property="name" column="name" />    
        <result property="age" column="age" />
    </resultMap>    
</resultMapCollection>

三、使用ResultMapCollection实现嵌套查询

ResultMapCollection可以用于嵌套查询,通过在ResultMap中嵌套其他ResultMap(通过 标签),可以构建出具有复杂类型的Java对象。

<resultMap id="UserMap" type="User">    
    <id property="id" column="id" />    
    <result property="name" column="name" />    
    <result property="age" column="age" />
    <association property="department" javaType="Department" resultMap="DepartmentMap"/>
</resultMap>

<resultMap id="DepartmentMap" type="Department">    
    <id property="id" column="id" />    
    <result property="name" column="name" />    
</resultMap>

四、使用ResultMapCollection实现动态查询

ResultMapCollection可以被用于动态查询,使用SQL选择将不同的ResultMapAnnotation集合作为ResultMapCollection返回。

<resultMapCollection id="allUser" type="java.util.ArrayList">    
    <resultMap id="UserMap1" type="User">    
        <id result="id" column="id" />    
        <result property="name" column="name" />    
    </resultMap>

    <resultMap id="UserMap2" type="User">    
        <id result="id" column="id" />    
        <result property="address" column="address" />    
        <result property="tel" column="tel" />    
    </resultMap>    
</resultMapCollection>

五、使用ResultMapCollection实现属性合并

ResultMapCollection可以用于属性合并,即将多个ResultMapAnnotation组合成一个复合对象。

<resultMapCollection id="allUser" type="java.util.ArrayList">    
    <resultMap id="EmpMap" type="Emp">    
        <id result="id" column="id" />    
        <association property="detail" javaType="Detail" resultMap="DetailMap" />    
        <association property="education" javaType="Education" resultMap="EducationMap" />    
    </resultMap>

    <resultMap id="DetailMap" type="Detail">    
        <result property="salary" column="salary" />    
        <result property="joinDate" column="join_date" />    
    </resultMap>

    <resultMap id="EducationMap" type="Education">     
        <result property="degree" column="degree" />    
        <result property="school" column="school" />    
    </resultMap>    
</resultMapCollection>