前言
ibatis中查询一些语句时,会对返回值进行返回,此时返回的返回值选择有resultMap,resultClass这2种,但是它们的使用有一些区别。
实体类User如下:
table:user(id,user_name)
public class User implements Serializable {
private String id;
private String userName;
get/set .....
}
resultMap
resultMap可以随时定义,字段长度都是随便可以的。
<resultMap id="user" class="User">
<result property="id" column="id"/>
<result property="userName" column="user_name"/>
</resultMap>
ibatis建议采取这种方式,效率比resultClass高,同时返回的结果直接采取此映射文件映射返回的。
注:返回的字段不能缺少,必须包含resultMap定义的所有字段,否则报错。
resultClass
当定义返回值是resultClass时,他会直接找到对应的class进行映射。
注:返回的字段可以缺少,但是字段名必须和类属性名称一样才可以得到
例如如下:
<select id="User.getUserAll" resultClass="User" >
SELECT id , user_name from user
</select>
此种方式返回的是resultClass的user但是属性的匹配只能匹配到id,user_name和user类中的userName不一致,没法匹配到的,最后只能返回id。可采取以下方式处理。
<select id="User.getUserAll" resultClass="User" >
SELECT id as id, user_name as userName from user
</select>
采取别名可以处理这种情况,达到正确映射的目的。
自定义字段长度
如果字段名称返回长度不一样,可以采取不定长的字段返回。如下:
<select id="User.getUserAll" resultClass="User" remapResults="true">
SELECT
<dynamic>
<isNotEmpty property="fields">
user_name as userName
</isNotEmpty>
<isEmpty property="fields">
id as id, user_name as userName
</isEmpty>
</dynamic>
from user
</select>
此时需要加上remapResults
属性,ibatis是返回列时会进行一些缓存,如果多次查询的列长度不一样,就需要此属性清除掉缓存。
当设置remapResults为”true”时: iBATIS会在每次查询的时候内省查询结果来设置元数据,来保证返回恰当的结果。这个属性会造成一定的性能损失,所以要谨慎使用,只在你需要的时候使用--查询列发生变化,直接的,或者隐含的,检索的表发生变化。