Loading

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 ,代表一对一关系</

posted @ 2020-08-18 16:11  文牧之  阅读(13)  评论(0)    收藏  举报  来源