MyBatis 教程

结果映射标签定义

前面章节介绍了什么是结果映射,本章节将介绍在 MyBatis 中定义了那些标签来实现结果映射。

<resultMap> 标签

resultMap 标签是结果映射的根标签,标签 DTD 定义如下:

<!ELEMENT resultMap (constructor?,id*,result*,association*,collection*, discriminator?)>
<!ATTLIST resultMap
    id CDATA #REQUIRED
    type CDATA #REQUIRED
    extends CDATA #IMPLIED
    autoMapping (true|false) #IMPLIED>

上面 DTD 定义中,resultMap 标签拥有两个可选的 constructor、discriminator 标签,零个或多个 id、result、association、collection 标签。其中,id 和 result 标签是最常用的标签。

resultMap 标签定义了 id、type、extends 和 autoMapping 属性,如下:

  • id:当前命名空间中的一个唯一标识,用于标识一个结果映射。

  • type:类的完全限定名, 或者一个类型别名(关于内置的类型别名,可以参考上面的表格)。

  • extends:用来继承其他 resultMap 定义的内容

  • autoMapping:如果设置这个属性,MyBatis 将会为本结果映射开启或者关闭自动映射。 这个属性会覆盖全局的属性 autoMappingBehavior。默认值:未设置(unset)

<constructor> 标签

该标签用来调用我们 JavaBean 的指定构造方法,在没有使用 constructor 标签的情况下,MyBatis 默认使用默认构造器。constructor 标签DTD定义如下:

<!ELEMENT constructor (idArg*,arg*)>

<!-- ID 参数 -->
<!ELEMENT idArg EMPTY>
<!ATTLIST idArg
    javaType CDATA #IMPLIED
    column CDATA #IMPLIED
    jdbcType CDATA #IMPLIED
    typeHandler CDATA #IMPLIED
    select CDATA #IMPLIED
    resultMap CDATA #IMPLIED>

<!-- 普通参数 -->
<!ELEMENT arg EMPTY>
<!ATTLIST arg
    javaType CDATA #IMPLIED
    column CDATA #IMPLIED
    jdbcType CDATA #IMPLIED
    typeHandler CDATA #IMPLIED
    select CDATA #IMPLIED
    resultMap CDATA #IMPLIED>

如果我们有如下 UserBean 构造器:

public UserBean(Integer userId, String name) {
    this.userId = userId;
    this.name = name;
}

则需要这样去使用 constructor 标签:

<resultMap id="RESULT_MAP" type="com.hxstrive.mybatis.resultmap.demo6.UserBean">
    <constructor>
        <idArg column="user_id" javaType="int" />
        <arg column="name" javaType="String" />
    </constructor>
    <result column="sex" jdbcType="VARCHAR" property="sex" />
    <result column="age" jdbcType="INTEGER" property="age" />
</resultMap>

<id> 标签

该标签用来映射数据表的ID字段,该标签DTD定义如下:

<!ELEMENT id EMPTY>
<!ATTLIST id
    property CDATA #IMPLIED
    javaType CDATA #IMPLIED
    column CDATA #IMPLIED
    jdbcType CDATA #IMPLIED
    typeHandler CDATA #IMPLIED>

属性说明:

  • property:要映射的 JavaBean 属性名

  • javaType:映射属性的 Java 类型

  • column:要映射的数据表列名

  • jdbcType:映射属性的数据库 JDBC 数据类型

  • typeHandler:指定我们自定义的类型处理器

<result> 标签

该标签用来映射数据表格普通列和 JavaBean 属性,该标签DTD定义如下:

<!ELEMENT result EMPTY>
<!ATTLIST result
    property CDATA #IMPLIED
    javaType CDATA #IMPLIED
    column CDATA #IMPLIED
    jdbcType CDATA #IMPLIED
    typeHandler CDATA #IMPLIED>

注意:该标签的属性和 id 标签的属性一致。

<association> 标签

该标签用来实现一对一关联关系映射。例如:

select u.`user_id`, u.`name`, u.`sex`, u.`age`,
    b.book_id, b.book_name, b.price, b.content
from `user` u
join `user_book` ub on u.user_id=ub.user_id
join `book` b on b.book_id=ub.book_id

对应的 Mapper XML 文件定义如下:

<resultMap id="RESULT_MAP" type="com.hxstrive.mybatis.resultmap.demo6.UserBean">
    <constructor>
        <idArg column="user_id" javaType="int" />
        <arg column="name" javaType="String" />
    </constructor>
    <result column="sex" jdbcType="VARCHAR" property="sex" />
    <result column="age" jdbcType="INTEGER" property="age" />
    <association property="bookBean" javaType="com.hxstrive.mybatis.resultmap.demo6.BookBean">
        <id column="book_id" jdbcType="INTEGER" property="bookId" />
        <result column="book_name" jdbcType="VARCHAR" property="bookName" />
        <result column="price" jdbcType="FLOAT" property="price" />
        <result column="content" jdbcType="VARCHAR" property="content" />
    </association>
</resultMap>

该标签 DTD 定义如下:

<!ELEMENT association (constructor?,id*,result*,association*,collection*, discriminator?)>
<!ATTLIST association
    property CDATA #REQUIRED
    column CDATA #IMPLIED
    javaType CDATA #IMPLIED
    jdbcType CDATA #IMPLIED
    select CDATA #IMPLIED
    resultMap CDATA #IMPLIED
    typeHandler CDATA #IMPLIED
    notNullColumn CDATA #IMPLIED
    columnPrefix CDATA #IMPLIED
    resultSet CDATA #IMPLIED
    foreignColumn CDATA #IMPLIED
    autoMapping (true|false) #IMPLIED
    fetchType (lazy|eager) #IMPLIED>

该标签的详细介绍将在后面章节仔细介绍。

<collection>标签

该标签用来映射SQL查询中的一对多,即一个 JavaBean 中定义了一个 List 成员变量。该标签 DTD 定义如下:

<!ELEMENT collection (constructor?,id*,result*,association*,collection*, discriminator?)>
<!ATTLIST collection
    property CDATA #REQUIRED
    column CDATA #IMPLIED
    javaType CDATA #IMPLIED
    ofType CDATA #IMPLIED
    jdbcType CDATA #IMPLIED
    select CDATA #IMPLIED
    resultMap CDATA #IMPLIED
    typeHandler CDATA #IMPLIED
    notNullColumn CDATA #IMPLIED
    columnPrefix CDATA #IMPLIED
    resultSet CDATA #IMPLIED
    foreignColumn CDATA #IMPLIED
    autoMapping (true|false) #IMPLIED
    fetchType (lazy|eager) #IMPLIED>

该标签的详细介绍将在后面章节仔细介绍。

<discriminator>标签

该标签使用结果值来决定使用哪个 resultMap,标签 DTD 定义如下:

<!ELEMENT discriminator (case+)>
<!ATTLIST discriminator
    column CDATA #IMPLIED
    javaType CDATA #REQUIRED
    jdbcType CDATA #IMPLIED
    typeHandler CDATA #IMPLIED>

使用示例:

<resultMap id="vehicleResult" type="Vehicle">
    <id property="id" column="id" />
    <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>

上例中,将根据 vehicle_type 列的值动态决定使用 carResult、truckResult、vanResult 和 suvResult 中的哪一个 resultMap,该标签的详细介绍将在后面章节仔细介绍。

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号