Mybatis resultType和resultMap

首先插入一段引用,我觉得写得很好

  • MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap,resultType是直接表示返回类型的,而resultMap则是对外部ResultMap的引用,但是resultType跟resultMap不能同时存在。
  • 在MyBatis进行查询映射的时候,其实查询出来的每一个属性都是放在一个对应的Map里面的,其中键是属性名,值则是其对应的值。
  • 当提供的返回类型属性是resultType的时候,MyBatis会将Map里面的键值对取出赋给resultType所指定的对象对应的属性。所以其实MyBatis的每一个查询映射的返回类型都是ResultMap,只是当我们提供的返回类型属性是resultType的时候,MyBatis对自动的给我们把对应的值赋给resultType所指定对象的属性,而当我们提供的返回类型是resultMap的时候,因为Map不能很好表示领域模型,我们就需要自己再进一步的把它转化为对应的对象,这常常在复杂查询中很有作用。

对这一段总结如下:
- 不论用resultType还是resultMap,用myBatis查询的时候都把结果放到一个Map中,所以本质上每一个查询映射的返回类型都是resultMap
- 当使用resultType时,myBatis会自动把Map中的value赋给resultType所指定对象的属性。但是resultType有个缺点,由于查询结果Map中的key-value对应的是数据库中表的名称和值,而resultType所指定对象的的名称并不一定和数据库的名称相同(用generator自动生成的除外),例如数据库中的user表中是type字段而项目中user类的是userType字段。
- resultMap就是解决resultType的上述缺点,将Map中的key值(即数据库的字段值)和领域模型(model实体类)的属性值形成对应关系,从而可以把Map中的value值赋给领域模型的属性值。

对于数据库字段和领域模型属性(model实体类字段)不一致

除了resultMap解决方法外还有一个解决方法,现将两种方案归纳如下:
- 方法一(仍然使用resultType):
用as填充(此方法需要每个select都进行as,比较累赘),如:select parent_id as parentId from user;
+ 这种写法仍然是用reslutType,在xml中写作resultType=map
+ 相当于数据库中字段是parent_id,myBatis返回结果Map中对应parent_id的value值赋值给parentId

  • 方法二(使用resultMap)
    使用resultMap,需要首先在xml中声明resultMap,例如:
    xml
    <resultMap type="Product" id="result_product">
    <result property="productTypeId" column="product_type_id"/>
    <result property="discountId" column="discount_id"/>
    <result property="entryDate" column="entry_date"/>
    </resultMap>

    其中column为数据库的列名,property为领域模型属性名称。
    resultMap非常好用的地方还在于:
    1. 假如查询的结果集Map比上述xml中写的resultMap多时,不会报错,只映射resultMap中写过的
    2. 反之比resultMap少时,也不会报错,只映射结果集Map中有的列

你可能感兴趣的:(mybatis)