前言

ibatis中查询一些语句时,会对返回值进行返回,此时返回的返回值选择有resultMap,resultClass这2种,但是它们的使用有一些区别。

实体类User如下:

  1. table:user(id,user_name)
  2. public class User implements Serializable {
  3. private String id;
  4. private String userName;
  5. get/set .....
  6. }

resultMap

resultMap可以随时定义,字段长度都是随便可以的。

  1. <resultMap id="user" class="User">
  2. <result property="id" column="id"/>
  3. <result property="userName" column="user_name"/>
  4. </resultMap>

ibatis建议采取这种方式,效率比resultClass高,同时返回的结果直接采取此映射文件映射返回的。
注:返回的字段不能缺少,必须包含resultMap定义的所有字段,否则报错。

resultClass

当定义返回值是resultClass时,他会直接找到对应的class进行映射。
注:返回的字段可以缺少,但是字段名必须和类属性名称一样才可以得到
例如如下:

  1. <select id="User.getUserAll" resultClass="User" >
  2. SELECT id , user_name from user
  3. </select>

此种方式返回的是resultClass的user但是属性的匹配只能匹配到id,user_name和user类中的userName不一致,没法匹配到的,最后只能返回id。可采取以下方式处理。

  1. <select id="User.getUserAll" resultClass="User" >
  2. SELECT id as id, user_name as userName from user
  3. </select>

采取别名可以处理这种情况,达到正确映射的目的。

自定义字段长度

如果字段名称返回长度不一样,可以采取不定长的字段返回。如下:

  1. <select id="User.getUserAll" resultClass="User" remapResults="true">
  2. SELECT
  3. <dynamic>
  4. <isNotEmpty property="fields">
  5. user_name as userName
  6. </isNotEmpty>
  7. <isEmpty property="fields">
  8. id as id, user_name as userName
  9. </isEmpty>
  10. </dynamic>
  11. from user
  12. </select>

此时需要加上remapResults属性,ibatis是返回列时会进行一些缓存,如果多次查询的列长度不一样,就需要此属性清除掉缓存。

当设置remapResults为”true”时: iBATIS会在每次查询的时候内省查询结果来设置元数据,来保证返回恰当的结果。这个属性会造成一定的性能损失,所以要谨慎使用,只在你需要的时候使用--查询列发生变化,直接的,或者隐含的,检索的表发生变化。

参考

合理运用remapResults属性