Mybatis中resultMap的基础配置

一、概述
resultMap 元素是 MyBatis 中最重要最强大的元素。它就是让你远离 90%的需要从结果集中取出数据的 JDBC 代码的那个东西,而且在一些情形下允许你做一些 JDBC 不支持的事情。事实上,编写相似于对复杂语句联合映射这些等同的代码,也许可以跨过上千行的代码。ResultMap 的设计就是简单语句不需要明确的结果映射,而很多复杂语句确实需要描述它们的关系。
resultType和resultMap的关系:
MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap,resultType是直接表示返回类型的,而resultMap则是对外部ResultMap的引用,但是resultType跟resultMap不能同时存在。在MyBatis进行查询映射的时候,其实查询出来的每一个属性都是放在一个对应的Map里面的,其中键是属性名,值则是其对应的值。当提供的返回类型属性是resultType的时候,MyBatis会将Map里面的键值对取出赋给resultType所指定的对象对应的属性。所以其实MyBatis的每一个查询映射的返回类型都是ResultMap,只是当我们提供的返回类型属性是resultType的时候,MyBatis对自动的给我们把对应的值赋给resultType所指定对象的属性,而当我们提供的返回类型是resultMap的时候,因为Map不能很好表示领域模型,我们就需要自己再进一步的把它转化为对应的对象,这常常在复杂查询中很有作用。

二、配置详解
1、可配置情况
<resultMap>
        <constructor>
            <idArg/>
            <arg/>
        </constructor>
        <id/>
        <result/>
        <association property=""/>
        <collection property=""/>
        <discriminator javaType="">
            <case value=""></case>
        </discriminator>
</resultMap>


节点简介:
constructor – 类在实例化时,用来注入参数值到构造方法中。
idArg – ID 参数;标记结果作为 ID 可以帮助提高整体效能。
arg – 注入到构造方法的一个普通参数。
id – 一个 ID 结果; 标记结果作为 ID 可以帮助提高整体效能。
result – 注入到字段或 JavaBean 属性的普通参数。
association – 一个复杂的类型关联;许多结果将包成这种类型。
collection – 复杂类型的集合。
discriminator – 使用参数值来决定使用哪个参数来进行映射。
case – 基于某些值的结果映射。


2、constructor
构造方法注入允许你在初始化时为类设置属性的值,而不用暴露出公有方法。 MyBatis 也支持私有属性和私有 JavaBeans 属性来达到这个目的,但是一些人更青睐构造方法注入。 Constructor( 构造方法)元素支持这个。默认情况下mybatis会调用实体类的无参构造方法创建一个实体类,然后再给各个属性赋值,但是有的时候我们可能为实体类生成了有参的构造方法,并且也没有给该实体类生成无参的构造方法,这个时候如果不做特殊配置,resultMap在生成实体类的时候就会报错,因为它没有找到无参构造方法。
使用示例:
假设User实体类的构造方法如下:
public User(Long id, String username, String password, String address) {
        this.id = id;
        this.username = username;
        this.password = password;
        this.address = address;
    }

在resultMap中配置constructor节点,如下:
<resultMap id="userResultMap" type="com.kang.pojo.User">
        <constructor>
            <idArg column="id" javaType="long"/>
            <arg column="username" javaType="string"/>
            <arg column="password" javaType="string"/>
            <arg column="address" javaType="string"/>
        </constructor>
</resultMap>
在constructor中指定相应的参数,这样resultMap在构造实体类的时候就会按照这里的指定的参数寻找相应的构造方法去完成了。


3、id, result
这两个属性是结果映射最基本内容。 id 和 result 都映射一个单独列的值到简单数据类型(字符
串,整型,双精度浮点数,日期等)的单独属性或字段。
这两者之间的唯一不同是 id 表示的结果将是当比较对象实例时用到的标识属性。这帮
助来改进整体表现,特别是缓存和嵌入结果映射(也就是联合映射)。
使用示例:
<id property="id" column="post_id"/>
<result property="subject" column="post_subject"/>
其中的property表示映射到列结果的字段或属性。如果匹配的是存在的,和给定名称相同的 JavaBeans的属性,那么就会使用。否则 MyBatis 将会寻找给定名称。的字段。这两种情形你可以使用通常点式的复杂属性导航。比如,你可以这样映射一些东西:“ username”,或者映射到一些复杂的东西:“ address.street.number”。
column表示从数据库中得到的列名,或者是列名的重命名标签。


4、association和collection
association是mybatis支持级联的一部分,我们知道在级联中有一对一、一对多、多对多等关系,association主要是用来解决一对一关系的,collection是用来解决一对多级联的。这里先不做详述,待梳理到关联查询时再详细叙述。


5、discriminator
discriminator既不是一对多也不是一对一,这个我们称之为鉴别器级联,使用它我们可以在不同的条件下执行不同的查询匹配不同的实体类。鉴别器非常容易理解,因为它的表现很像 Java 语言中的 switch 语句。
定义鉴别器需要指定了 column 和 javaType 属性。column表示用数据表的哪一个字段参与比较, JavaType是参与比较的字段类型。
比如:
<resultMap id="vehicleResult" type="Vehicle">
<id property=”id” column="id" />
<result property="vin" column="vin"/>
<result property="year" column="year"/>
<result property="make" column="make"/>
<result property="model" column="model"/>
<result property="color" column="color"/>
<discriminator javaType="int" column="vehicle_type">
<case value="1" resultMap="carResult"/>
<case value="2" resultMap="truckResult"/>
<case value="3" resultMap="vanResult"/>
<case value="4" resultMap="suvResult"/>
</discriminator>
</resultMap>

在这个示例中,MyBatis 会从结果集中得到每条记录,然后比较它的 vehicle 类型的值。如果它匹配任何一个鉴别器的实例,那么就使用这个实例指定的结果映射。 



posted on 2017-03-27 14:24  想作会飞的鱼  阅读(449)  评论(0编辑  收藏  举报

导航