MyBatis映射器学习四
一.resultMap结果映射集
resultMap是MyBatis里面最复杂的元素,它的作用是:
定义映射规则,级联的更新,定制类型转化器等等。 resultMap定义的主要是一个结果集的映射关系。
1.resultMap元素的构成
resultMap元素里面还有以下元素,如下:
<resultMap>
<constructor>
<idArg/>
<arg/>
</constructor>
<id />
<result />
<association/>
<collection/>
<discriminator>
<case/>
</discriminator>
</resultMap>
我们先简单的了解下其中的:
constructor元素用于配置构造方法。一个POJO可能不存在没有参数的构造方法,这个时候我们就可以使用constructor进行配置。
假设角色类RoleBean不存在没有参数的构造方法,它的构造方法声明为public RoleBean(Integer id,String roleName),那么我们需要配置这个结果集,如下:
<resultMap ......>
<constructor>
<idArg column="id" javaType="int" />
<arg column="role_name" javaType="string" />
</constructor>
......
</resultMap>
如此MyBatis就知道要用这个构造方法来构造POJO了。
id元素是表示哪个列是主键,允许多个主键,多个主键则称为联合主键。result是配置POJO到SQL列名的映射关系。这里的id和result两个元素都有下面表的属性:
2.使用map存储结果集
一般而言,任何的select语句都可以使用map存储结果集。
例如:
<select id="findColorByNote" parameterType="string" resultType="map">
select id ,color,note from t_color where note like concat('%',#{note},'%')
</select>
使用map原则上是可以匹配所有结果集的,但是使用map的方式我们的可读性就会下降,更多的时候使用POJO的方式。
3.使用POJO存储结果集
POJO的方式很方便,一方面我们可以使用自动映射,我们可以使用select语句的属性resultMap配置映射集合,只是使用前需要配置类似的resultMap。
例如:
<resultMap id="roleResultMap" type="com.learn.chapter4.pojo.Role">
<id property="id" column="id" />
<result property="roleName" column="role_name" />
<result property="note" column="note" />
</resultMap>
然后我们就可以使用它了:
<select parameterType="long" id="getRole" resultMap="roleResultMap">
select id,role_name,note from t_role where id =#{id}
</select>
我们可以发现SQL语句的列名和roleResultMap的column是一一对应的。
4.级联
在数据库中包含着一对多,一对一的关系,比方说一个角色可以分配给多个用户,也可以只分配给一个用户。有时候我们希望角色信息和用户信息一起显示出来,这是很常见的场景,所以会经常遇到下面的SQL:
select r.*,u.* from t_role r inner join t_user_role ur
on r.id = ur.id inner join t_user u on ur.user_id = u.id
where r.id = #{id}
上面的查询是把角色和用户的信息都查询出来,我们希望的是在角色的信息中多一个属性,即List userList 这样取出Role的同时也可以访问到它下面的用户了,
这样的情况叫做级联,在级联中存在三种对应关系:一对多,一对一,多对多。在实际情况中,多对多的关系应用不多,因为比较复杂,会增加理解和关联的复杂度,在这里我们推荐的是用一对多的关系把它分解为双向关系,以降低关系的复杂度,简化程序。
在MyBatis中级联分为三种:association,collection和discriminator ,下面分别介绍下:
1.association ,代表一对一关系</