resultMap和resultType的区别
MyBatis在查询时,返回类型可以用resultType,也可以用resultMap。
resultType 直接表示返回类型 ,而resultMap需要配置对应关系
resultType跟resultMap 不能同时存在 。
MyBatis在进行查询映射时,查询出的每个属性,其实都是放在一个Map里,其中键是数据库的字段名,值是其查询出的数据。
①当返回类型是resultType时,MyBatis会将Map里面的键值对取出来,赋给resultType所指定的对象对应的属性。(要保证 结果集的列名与java对象的属性名 完全相同)
但是有时候,数据库的字段名和对象的属性名 并不一致,这种情况下,使用 resultType是不能匹配成功的,比如:
数据库字段
user_id
和实体类User中的userId
是不能匹配的。
这种情况下,就需要 ResultMap
<resultMap type="User" id="userMap">
<id property="userId" column="user_id" />
<result property="userName" column="user_name" />
<result property="password" column="password" />
<result property="status" column="status" />
<result property="delFlag" column="del_flag" />
<result property="createTime" column="create_time" />
</resultMap>
<sql id="selectUserVo">
select u.user_id, u.user_name, u.password, u.status, u.del_flag, u.create_time from user u
</sql>
<select id="selectUserByUserName" parameterType="String" resultMap="userMap">
<include refid="selectUserVo"/>
where u.user_name = #{userName}
</select>
此时 resultMap="userMap"
是一个外部resultMap的id,表示将该查询语句的结果 映射到 userMap上。
这种情况无需关注 实体类的属性名和数据库的列名是否一致,因此非常的灵活,功能也更加强大
总结
- resultType
基本映射 :查询出来的 列名 和实体类中的 属性名 一致,该列才可以映射成功。
- resultMap
高级映射 :定义一个数据库 列名 和实体类中 属性名 间的映射关系。