ResultMap
association对象
collection集合
- javaType用来指定实体类中属性的类型
- ofType用来指定映射到List或者集合中的pojo类型
1. ResultMap和ResultType的区别
基本映射 :(resultType)使用resultType进行输出映射,只有查询出来的列名和pojo中的属性名一致,该列才可以映射成功。(数据库,实体,查询字段,这些全部都得一一对应)高级映射 :(resultMap) 如果查询出来的列名和pojo的属性名不一致,通过定义一个resultMap对列名和pojo属性名之间作一个映射关系。(高级映射,字段名称可以不一致,通过映射来实现。
resultType和resultMap功能类似 ,都是返回对象信息 ,但是resultMap要更强大一些 ,可自定义。因为resultMap要配置一下,表和类的一一对应关系,所以说就算你的字段名和你的实体类的属性名不一样也没关系,都会给你映射出来,但是,resultType就比较鸡肋了,必须字段名一样,比如说 cId和c_id 这种的都不能映射 。
- 如果使用resultMap作为映射应该附加映射条件。否则报错
Result Maps collection does not contain value for....
resultType 和 resultMap 之间只能同时使用一个。
2. 用途
解决实体类中的属性名和数据库中的字段名不一致的问题。
一般来讲,解决这类问题有两个方法:
起别名
<select id="getUserById" resultType="User"> select id, name, pwd as password from user where id = #{id} </select>
使用ResultMap结果集映射
只需要对不一致的字段名进行映射就行。
<resultMap id="UserMap" type="User"> <!--column数据库中的字段,property实体类中的属性--> <result column="pwd" property="password"/> </resultMap> <select id="getUserById" resultMap="UserMap"> select * from mybatis.user where id = #{id} </select>
<resultMap id="StudentAndTeacher" type="Student"> <!--能自动映射的可以不配置--> <!--javaType指定子查询映射的pojo对象--> <!--property需要封装的对象变量名--> <!--column子查询调用的前面查询的参数的字段名--> <!--下面的select字段只能指定当前mapper的某个select块--> <association property="teacher" column="tid" javaType="Teacher" select="getTeacher"/> </resultMap> <select id="getStudents" resultMap="StudentAndTeacher"> select * from student </select> <select id="getTeacher" resultType="Teacher"> select * from teacher where id = #{id} </select>
<resultMap id="StudentAndTeacher2" type="Student"> <result property="id" column="sid"/> <result property="name" column="sname"/> <association property="teacher" javaType="teacher"> <result property="id" column="tid"/> <result property="name" column="tname"/> </association> </resultMap> <select id="getStudents2" resultMap="StudentAndTeacher2"> select s.id sid, s.name sname, t.id tid, t.name tname from student s, teacher t where s.tid = t.id </select>
resultMap元素是 MyBatis 中最重要最强大的元素。
ResultMap 的设计思想是,对于简单的语句根本不需要配置显式的结果映射,而对于复杂一点的语句只需要描述它们的关系就行了。