resultMap
resultMap 标签是结果映射的根标签,标签 DTD 定义如下,以为着resultMap 标签拥有两个可选的 constructor、discriminator 标签,零个或多个 id、result、association、collection 标签
<!ELEMENT resultMap (constructor?,id*,result*,association*,collection*, discriminator?)>
<!ATTLIST resultMap
id CDATA #REQUIRED
type CDATA #REQUIRED
extends CDATA #IMPLIED
autoMapping (true|false) #IMPLIED>
- id:当前命名空间中的一个唯一标识,用于标识一个结果映射。
- type:类的完全限定名, 或者一个类型别名。
- extends:用来继承其他 resultMap 定义的内容
- autoMapping:如果设置这个属性,MyBatis 将会为本结果映射开启或者关闭自动映射。 这个属性会覆盖全局的属性 autoMappingBehavior。默认值:未设置(unset)
constructor
该标签用来调用JavaBean 的指定构造方法,在没有使用 constructor 标签的情况下,MyBatis 默认使用默认构造器
public UserBean(Integer userId, String name) {
this.userId = userId;
this.name = name;
}
调用构造函数完成映射
<resultMap id="RESULT_MAP" type="com.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字段,具体说明如下:
- property:要映射的 JavaBean 属性名
- javaType:映射属性的 Java 类型
- column:要映射的数据表列名
- jdbcType:映射属性的数据库 JDBC 数据类型
- typeHandler:指定我们自定义的类型处理器
result
该标签用来映射数据表格普通列和 JavaBean 属性,具体属性与id标签一致
association
该标签用来实现一对一关联关系映射。一个复杂类型的关联;许多结果将包装成这种类型
- 嵌套结果映射 – 关联可以是
resultMap
元素,或是对其它结果映射的引用
<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>
collection
该标签用来映射SQL查询中的一对多,即一个 JavaBean 中定义了一个 List 成员变量。collection 标签下允许使用 constructor、id、result、association、collection 和 discriminator 标签。该标签也定义了很多属性,每个属性含义如下
- property:映射到列结果的字段或属性。如果 JavaBean 有这个名字的属性(property),会先使用该属性。否则 MyBatis 将会寻找给定名称的字段(field)。 无论是哪一种情形,你都可以使用常见的点式分隔形式进行复杂属性导航。 比如,你可以这样映射一些简单的东西:“username”,或者映射到一些复杂的东西上:“address.street.number”。
- column:数据库中的列名,或者是列的别名。一般情况下,这和传递给 resultSet.getString(columnName) 方法的参数一样。
- javaType:一个 Java 类的全限定名,或一个类型别名(关于内置的类型别名,可以参考上面的表格)。 如果你映射到一个 JavaBean,MyBatis 通常可以推断类型。然而,如果你映射到的是 HashMap,那么你应该明确地指定 javaType 来保证行为与期望的相一致。
- ofType:完整java类名或别名(集合所包括的类型)
- jdbcType:JDBC 类型,所支持的 JDBC 类型参见这个表格之后的“支持的 JDBC 类型”。 只需要在可能执行插入、更新和删除的且允许空值的列上指定 JDBC 类型。这是 JDBC 的要求而非 MyBatis 的要求。如果你直接面向 JDBC 编程,你需要对可以为空值的列指定这个类型。
- select:用于加载复杂类型属性的映射语句的 ID,它会从 column 属性中指定的列检索数据,作为参数传递给此 select 语句。具体请参考关联元素。
- resultMap:结果映射的 ID,可以将此关联的嵌套结果集映射到一个合适的对象树中。 它可以作为使用额外 select 语句的替代方案。它可以将多表连接操作的结果映射成一个单一的 ResultSet。这样的 ResultSet 有部分数据是重复的。 为了将结果集正确地映射到嵌套的对象树中, MyBatis 允许你“串联”结果映射,以便解决嵌套结果集的问题。使用嵌套结果映射的一个例子在表格以后。
- typeHandler:指定自定义类型处理器
- notNullColumn:默认情况下,在至少一个被映射到属性的列不为空时,子对象才会被创建。 你可以在这个属性上指定非空的列来改变默认行为,指定后,Mybatis 将只在这些列非空时才创建一个子对象。可以使用逗号分隔来指定多个列。默认值:未设置(unset)。
- columnPrefix:当连接多个表时,你可能会不得不使用列别名来避免在 ResultSet 中产生重复的列名。指定 columnPrefix 列名前缀允许你将带有这些前缀的列映射到一个外部的结果映射中。 详细说明请参考后面的例子。
- resultSet:这个设置仅适用于多结果集的情况。它将列出语句执行后返回的结果集并赋予每个结果集一个名称,多个名称之间以逗号分隔。
- foreignColumn:指定外键对应的列名,指定的列将与父类型中 column 的给出的列进行匹配。
- autoMapping:如果设置这个属性,MyBatis 将会为本结果映射开启或者关闭自动映射。 这个属性会覆盖全局的属性 autoMappingBehavior。默认值:未设置(unset)。
<resultMap id="ormUser" type="com.hxstrive.mybatis.orm.demo1.ORMUser">
<id column="user_id" jdbcType="INTEGER" property="userId" />
<result column="name" jdbcType="VARCHAR" property="name" />
<result column="sex" jdbcType="VARCHAR" property="sex" />
<result column="age" jdbcType="INTEGER" property="age" />
<result column="salary" jdbcType="DOUBLE" property="salary" />
<result column="borthday" jdbcType="DATE" property="borthday" />
<!-- 映射关联的List -->
<collection column="user_id" property="contactList"
ofType="com.hxstrive.mybatis.orm.demo1.ORMContact">
<id column="id" jdbcType="INTEGER" property="id" />
<result column="user_id" jdbcType="INTEGER" property="userId" />
<result column="usage" jdbcType="VARCHAR" property="usage" />
<result column="number" jdbcType="VARCHAR" property="number" />
</collection>
</resultMap>
discriminator
该标签使用结果值来决定使用哪个 resultMap
<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>