mybatis resultMap详解

简介

resultMap是Mybatis最强大的元素,它可以将查询到的复杂数据(比如查询到几个表中数据)映射到一个结果集当中。

属性描述
property需要映射到JavaBean 的属性名称。
column数据表的列名或者标签别名。
javaType一个完整的类名,或者是一个类型别名。如果你匹配的是一个JavaBean,那MyBatis 通常会自行检测到。然后,如果你是要映射到一个HashMap,那你需要指定javaType 要达到的目的。
jdbcType数据表支持的类型列表。这个属性只在insert,update 或delete 的时候针对允许空的列有用。JDBC 需要这项,但MyBatis 不需要。如果你是直接针对JDBC 编码,且有允许空的列,而你要指定这项。
typeHandler使用这个属性可以覆写类型处理器。这项值可以是一个完整的类名,也可以是一个类型别名。

resultMap 同名冲突

<resultMap type="Classes" id="classesMap">
	<id property="id" column="id" javaType="int"/>
	<result property="name" column="name" javaType="String"/>
	<association property="teacher" javaType="Teacher" >
		<id property="id" column="id" javaType="int"/>
		<result property="name" column="name" javaType="String"/>
		<result property="age" column="age" javaType="int"/>
	</association>	
</resultMap>

这样子由于Classes中有name/id属性,teacher也有name/id属性,通过select语句查询时,Classes的name/id属性会覆盖teacher的name/id属性。

解决方法,在sql语句中给相同的属性起别名:t.id as t_id,同时设置 resultMap 中 teacher的id column为t_id:

<resultMap type="Classes" id="classesMap">
	<id property="id" column="id" javaType="int"/>
	<result property="name" column="name" javaType="String"/>
	<association property="teacher" javaType="Teacher" >
		<id property="id" column="t_id" javaType="int"/>
		<result property="name" column="t_name" javaType="String"/>
		<result property="age" column="t_age" javaType="int"/>
	</association>	
</resultMap>

<sql id="selectAllClassesSql">
	<!-- 取别名可以和* 一起使用 -->
	SELECT c.id,c.name,teacher_id,t.id as t_id,t.name as t_name,t.age as t_age 
	FROM classes c,teacher t
</sql>

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×