Mybatis ResultMap

作者:範宗雲 来源:原创 发布时间:2015-04-27 归档:mybatis

环境 : JDK 7 Mybatis 3.2.7 Maven 3 Junit 4.11 Spring 4.1.5 Eclipse Luna
数据库表结构 :
实体类定义 :
            <select id="queryById" parameterType="int" resultType="Role">
              SELECT * FROM ROLE WHERE id = #{id}
            </select>
          
SQL 执行时返回的结果由 mybatis 静默创建一个 ResultMap 来映射列到 JavaBean 属性上。mybatis 会获取 SQL 返回的列名并在 JAVA 类中查找相同名字的属性 ( 忽略大小写 ), 然后将列的值赋给这些属性。这是自动映射的过程。如果表列名与实体类属性名称不匹配, 可以通过 SQL 别名 (AS) 来进行手工配置 :
            <select id="queryById" parameterType="int" resultType="Product">
              SELECT id, prod_name as name, prod_price as price FROM PRODUCT WHERE id = #{id}
            </select>
          
你也可以这样做 :
            <resultMap type="Product" id="productResultMap">
              <id property="id" column="id" />
              <result property="name" column="prod_name" />
              <result property="price" column="prod_price" />
            </resultMap>
          
或者可以这样做 :
            <resultMap type="Product" id="productResultMap">
              <result property="name" column="prod_name" />
              <result property="price" column="prod_price" />
            </resultMap>
          
在 <resultMap> 中, 你可以只对一些特殊的属性来进行列的映射, 那些没有手工设定的属性将会进行自动映射, 自动映射的前提是属性名称与查询结果列的名称相同。自动映射处理完成以后, 手工映射才会被处理。
像这样来引用它 :
            <select id="queryById" parameterType="int" resultMap="productResultMap">
              SELECT * FROM PRODUCT WHERE id = #{id}
            </select>
          
注意这里的 resultType 和 resultMap 用法的区别。resultType 表明返回的结果的数据类型, 是查询结果的列映射到的类型, 如我们的实体类、Map 等。resultMap 是外部 ResultMap 的引用, 使用的前提是必须先配备 <resultMap>, <resultMap> 定义了数据库表的列与 JavaBean 属性之间的映射关系。
另外, resultType 和 resultMap 不能共存, 两者只能选其一, 查询的结果要么是 resultType, 要么是 resultMap。