前面章节介绍了什么是结果映射,本章节将介绍在 MyBatis 中定义了那些标签来实现结果映射。
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)
该标签用来调用我们 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字段,该标签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:指定我们自定义的类型处理器
该标签用来映射数据表格普通列和 JavaBean 属性,该标签DTD定义如下:
<!ELEMENT result EMPTY> <!ATTLIST result property CDATA #IMPLIED javaType CDATA #IMPLIED column CDATA #IMPLIED jdbcType CDATA #IMPLIED typeHandler CDATA #IMPLIED>
注意:该标签的属性和 id 标签的属性一致。
该标签用来实现一对一关联关系映射。例如:
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>
该标签的详细介绍将在后面章节仔细介绍。
该标签用来映射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>
该标签的详细介绍将在后面章节仔细介绍。
该标签使用结果值来决定使用哪个 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,该标签的详细介绍将在后面章节仔细介绍。