目录
1、resultMap元素
resultMap的作用:定义映射规则、级联的更新、定制类型转化器等。resultMap定义的主要是一个结果集的映射关系,也就是SQL到Java Bean的映射关系定义,它也支持级联等特性。只是MyBatis现有的版本只支持resultMap查询,不支持更新或者保存,更不必说级联的更新、删除和修改了。
1.1 resultMap元素的构成
resultMap元素的子元素:
<resultMap>
<constructor>
<idArg/>
<arg/>
</constructor>
<id/>
<result/>
<association/>
<collection/>
<discriminator>
<case/>
</discriminator>
</resultMap>
- constructor:用于配置构造方法。一个POJO可能不存在无参数的构造方法,可以使用constructor进行配置
一个栗子:角色类SysRole不存在没有参数的构造方法,那么需要配置结果集,这样MyBatis就会使用对应的构造方法来构造POJO了:
<resultMap ...>
<constructor>
<idArg column="id" javaType="int"/>
<arg column="roleName" javaType="String"/>
</constructor>
...
</resultMap>
- id:表示哪个列时主键,允许多主键,多个主键称为联合主键
- result是配置POJO到SQL列名的映射关系
- result元素和idArg元素的属性如下:
元素 | 描述 | 备注 |
property | 映射到列结果的字段或者属性。如果POJO的属性匹配的是存在的且与给定SQL列名(column元素)相同,那么MyBatis就会映射到POJO上 | 使用导航式的字段,比如访问一个学生证student对象需要访问学生selfcard的发证日期issueDate,那么可以写成selfcard.issueDate |
column | 对应的是SQL的列 | —— |
javaType | 配置Java的类型 | 可以是特定的类完全限定名或者MyBatis上写文别名 |
jdbcType | 配置数据库类型 | 这是一个JDBC的类型,MyBatis已经做了限定,支持大部分常用的数据库类型 |
typeHandler | 类型处理器 | 允许用特定的处理器来覆盖MyBatis默认的处理器。这就要指 定jdbcType和JavaType相互转化的规则 |
1.2 使用map存储结果集
一般而言,任何select语句都可以使用map存储。如下:
<select id="getRoleByNote" parameterType="String" resultType="sysRole">
select id, color, note
from sys_role
where note like concat('%', #{note}, '%')
</select>
使用map原则上是可以匹配所有结果集的,但是使用map接口就意味着可读性的下降,因为使用map时需要进一步了解map键值得构成和数据类型,所以这不是一种推荐的方式,更多的时候推荐使用POJO分布式。
1.3 使用POJO存储结果集
使用POJO存储结果集,可以使用自定映射,如同resultType属性一样,但是有时候需要更为复杂的映射或者缓存,这个时候还可以使用select语句的resultMap属性配置映射集合,只是使用前需要配置类似的resultMap。
<resultMap id="roleResultMap" type="sysRole">
<id property="id" column="id"/>
<result property="roleName" column="role_name"/>
<result property="note" column="note"/>
<resultMap/>
resultMap元素的属性id表示这个resultMap的标识,type标识需要映射的POJO,这里使用定义好的lei别名,也可使用自定义的类的全限定名。
在映射关系中,子元素id:表示resultMap的主键,而result表示其属性,id和result元素的属性property表示POJO类的属性名,而column表示SQL的字段名。把POJO的属性和SQL的列名做对应,就建立起了映射关系。
<select id="getRoleMap" paramterType="long" resultMap="roleResultMap">
select id, role_name, note
from sys_role
where id=#{id}
</select>
可知,SQL语句的列名和roleResultMap的column是一一对应的,使用XML配置的结果集,不能和resultType同时配置使用。