ResultMap

  • association对象

  • collection集合

  • javaType用来指定实体类中属性的类型
  • ofType用来指定映射到List或者集合中的pojo类型

1. ResultMap和ResultType的区别

  1. 基本映射 :(resultType)使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。(数据库,实体,查询字段,这些全部都得一一对应)高级映射 :(resultMap) 如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系。(高级映射,字段名称可以不一致,通过映射来实现。

  2. resultType和resultMap功能类似 ,都是返回对象信息 ,但是resultMap要更强大一些 ,可自定义。因为resultMap要配置一下,表和类的一一对应关系,所以说就算你的字段名和你的实体类的属性名不一样也没关系,都会给你映射出来,但是,resultType就比较鸡肋了,必须字段名一样,比如说 cId和c_id 这种的都不能映射 。

  3. 如果使用resultMap作为映射应该附加映射条件。否则报错Result Maps collection does not contain value for....

resultType 和 resultMap 之间只能同时使用一个。

2. 用途

解决实体类中的属性名和数据库中的字段名不一致的问题。

一般来讲,解决这类问题有两个方法:

  1. 起别名

    <select id="getUserById" resultType="User">
      select id, name, pwd as password
      from user
      where id = #{id}
    </select>
    
  2. 使用ResultMap结果集映射

    只需要对不一致的字段名进行映射就行。

    <resultMap id="UserMap" type="User">
      <!--column数据库中的字段,property实体类中的属性-->
      <result column="pwd" property="password"/>
    </resultMap>
    
    <select id="getUserById" resultMap="UserMap">
      select *
      from mybatis.user
      where id = #{id}
    </select>
    
    <resultMap id="StudentAndTeacher" type="Student">
      <!--能自动映射的可以不配置-->
      <!--javaType指定子查询映射的pojo对象-->
      <!--property需要封装的对象变量名-->
      <!--column子查询调用的前面查询的参数的字段名-->
      <!--下面的select字段只能指定当前mapper的某个select块-->
      <association property="teacher" column="tid" javaType="Teacher" select="getTeacher"/>
    </resultMap>
    
    <select id="getStudents" resultMap="StudentAndTeacher">
      select *
      from student
    </select>
    
    <select id="getTeacher" resultType="Teacher">
      select *
      from teacher
      where id = #{id}
    </select>
    
    <resultMap id="StudentAndTeacher2" type="Student">
      <result property="id" column="sid"/>
      <result property="name" column="sname"/>
      <association property="teacher" javaType="teacher">
        <result property="id" column="tid"/>
        <result property="name" column="tname"/>
      </association>
    </resultMap>
    
    <select id="getStudents2" resultMap="StudentAndTeacher2">
      select s.id sid, s.name sname, t.id tid, t.name tname
      from student s,
      teacher t
      where s.tid = t.id
    </select>
    

resultMap元素是 MyBatis 中最重要最强大的元素。

ResultMap 的设计思想是,对于简单的语句根本不需要配置显式的结果映射,而对于复杂一点的语句只需要描述它们的关系就行了。

Copyright © rootwhois.cn 2021-2022 all right reserved,powered by GitbookFile Modify: 2023-03-05 10:55:52

results matching ""

    No results matching ""