MyBatis-association的两种形式

1.嵌套的resultMap

只是把相关实体映射从association元素中提取出来,用一个resultMap元素表示。然后 association元素再引用这个resultMap元素。

<?xml version="1.0" encoding="utf8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.abc.mapper.StudentMapper">

	<select id="getById" parameterType="int" resultMap="studentResultMap">
	select s.id s_id,
	s.name s_name,
	s.gender s_gender,
	s.major s_major,
	s.grade s_grade,
	t.id t_id,
	t.name t_name,
	t.gender t_gender,
	t.title t_title,
	t.research_area t_research_area
	from student s left join teacher t
	on s.supervisor_id = t.id
	where s.id=#{id}
	</select>
	
	<resultMap id="studentResultMap" type="Student">
		<id property="id" column="s_id"/>
		<result property="name" column="s_name"/>
		<result property="gender" column="s_gender"/>
		<result property="major"  column="s_major"/>
		<result property="grade"  column="s_grade"/>
		<!--使用resultMap属性引用下面的教师实体映射-->
		<association property="supervisor" javaType="Teacher"
		resultMap="supervisorResultMap"/>
	</resultMap>
	
	<!--教师实体映射-->
	<resultMap id="supervisorResultMap" type="Teacher">
		<id property="id" column="t_id"/>
		<result property="name" column="t_name"/>
		<result property="gender" column="t_gender"/>
		<result property="researchArea" column="t_research_area"/>
		<result property="title" column="t_title"/>
	</resultMap>
</mapper>
</mapper>

 这种方式的好处是此resultMap元素可在其它地方被重用。

2.嵌套的select语句

这种方式是使用一条单独的select语句来加载关联的实体(在本例中就是教师实体),然后在association元素中引用此select语句。修改StudentMapper.xml如下:

<?xml version="1.0" encoding="utf8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.abc.mapper.StudentMapper">
	<select id="getById" parameterType="int" resultMap="studentResultMap">
	select id,name,gender,major,grade,supervisor_id from student where id=#{id}
	</select>
	<select id="selectSupervisor" parameterType="int" resultMap="supervisorResultMap">
	select id,name,gender,title,research_area
	from teacher where id=#{id}
	</select>
	<resultMap id="studentResultMap" type="Student">
		<id property="id" column="id"/>
		<result property="name" column="name"/>
		<result property="gender" column="gender"/>
		<result property="major"  column="major"/>
		<result property="grade"  column="grade"/>
		<!--column="supervisor_id"不能少。此列的值作为参数
		传递给要引用的select语句,用来查询相应学生的指导教师
		的信息。select属性指定要引用的select语句-->
		<association property="supervisor" javaType="Teacher"
		column="supervisor_id" select="selectSupervisor"/>
	</resultMap>
	<!--教师实体映射-->
	<resultMap id="supervisorResultMap" type="Teacher">
		<id property="id" column="id"/>
		<result property="name" column="name"/>
		<result property="gender" column="gender"/>
		<result property="researchArea" column="research_area"/>
		<result property="title" column="title"/>
	</resultMap>
</mapper>

association元素的属性javaType="Teacher"也可以不要,这大概也是因为引用的select语句中已经指明了要用到的resultMap。

猜你喜欢

转载自blog.csdn.net/u010277958/article/details/89220246