详解Java的MyBatis框架中SQL语句映射部分的编写(3)

与上面同样的功能,查询班级,同时查询器班主任。需在association中添加resultMap(在teacher的xml文件中定义好的),新写sql(查询班级表left join教师表),不需要teacher的select。

修改ClassMapper.xml文件部分内容:

<resultMap type="ClassEntity">
<id property="classID" column="CLASS_ID" />
<result property="className" column="CLASS_NAME" />
<result property="classYear" column="CLASS_YEAR" />
<association property="teacherEntity" column="TEACHER_ID" resultMap="teacherResultMap"/>
</resultMap>
<select parameterType="String" resultMap="classResultMap">
SELECT *
FROM CLASS_TBL CT LEFT JOIN TEACHER_TBL TT ON CT.TEACHER_ID = TT.TEACHER_ID
WHERE CT.CLASS_ID = #{classID};
</select>

其中的teacherResultMap请见上面TeacherMapper.xml文件部分内容中。

1.1.4 collection聚集

聚集元素用来处理“一对多”的关系。需要指定映射的Java实体类的属性,属性的javaType(一般为ArrayList);列表中对象的类型ofType(Java实体类);对应的数据库表的列名称;

不同情况需要告诉MyBatis 如何加载一个聚集。MyBatis 可以用两种方式加载:

(1). select: 执行一个其它映射的SQL 语句返回一个Java实体类型。较灵活;

(2). resultsMap: 使用一个嵌套的结果映射来处理通过join查询结果集,映射成Java实体类型。

例如,一个班级有多个学生。

首先定义班级中的学生列表属性:

private List<StudentEntity> studentList;

1.1.4.1使用select实现聚集

用法和联合很类似,区别在于,这是一对多,所以一般映射过来的都是列表。所以这里需要定义javaType为ArrayList,还 需要定义列表中对象的类型ofType,以及必须设置的select的语句名称(需要注意的是,这里的查询student的select语句条件必须是外 键classID)。

ClassMapper.xml文件部分内容:

<resultMap type="ClassEntity">
<id property="classID" column="CLASS_ID" />
<result property="className" column="CLASS_NAME" />
<result property="classYear" column="CLASS_YEAR" />
<association property="teacherEntity" column="TEACHER_ID" select="getTeacher"/>
<collection property="studentList" column="CLASS_ID" javaType="ArrayList" ofType="StudentEntity" select="getStudentByClassID"/>
</resultMap>
<select parameterType="String" resultMap="classResultMap">
SELECT * FROM CLASS_TBL CT
WHERE CT.CLASS_ID = #{classID};
</select>

StudentMapper.xml文件部分内容:

<!-- java属性,数据库表字段之间的映射定义 -->

<resultMap type="StudentEntity">

<id property="studentID" column="STUDENT_ID" />

<result property="studentName" column="STUDENT_NAME" />

<result property="studentSex" column="STUDENT_SEX" />

<result property="studentBirthday" column="STUDENT_BIRTHDAY" />

</resultMap>

<!-- 查询学生list,根据班级id -->

<select parameterType="String" resultMap="studentResultMap">

<include refid="selectStudentAll" />

WHERE ST.CLASS_ID = #{classID}

</select>
 

1.1.4.2使用resultMap实现聚集
 使用resultMap,就需要重写一个sql,left join学生表。

<resultMap type="ClassEntity">

<id property="classID" column="CLASS_ID" />

<result property="className" column="CLASS_NAME" />

<result property="classYear" column="CLASS_YEAR" />

<association property="teacherEntity" column="TEACHER_ID" resultMap="teacherResultMap"/>

<collection property="studentList" column="CLASS_ID" javaType="ArrayList" ofType="StudentEntity" resultMap="studentResultMap"/>

</resultMap>

<select parameterType="String" resultMap="classResultMap">

SELECT *

FROM CLASS_TBL CT

LEFT JOIN STUDENT_TBL ST

ON CT.CLASS_ID = ST.CLASS_ID

LEFT JOIN TEACHER_TBL TT

ON CT.TEACHER_ID = TT.TEACHER_ID

WHERE CT.CLASS_ID = #{classID};

</select>
 

其中的teacherResultMap请见上面TeacherMapper.xml文件部分内容中。studentResultMap请见上面StudentMapper.xml文件部分内容中。
1.1.5discriminator鉴别器
 有时一个单独的数据库查询也许返回很多不同(但是希望有些关联)数据类型的结果集。鉴别器元素就是被设计来处理这个情况的,还有包括类的继承层次结构。鉴别器非常容易理解,因为它的表现很像Java语言中的switch语句。
 定义鉴别器指定了column和javaType属性。列是MyBatis查找比较值的地方。JavaType是需要被用来保证等价测试的合适类型(尽管字符串在很多情形下都会有用)。
 下面这个例子为,当classId为20000001时,才映射classId属性。

<resultMap type="liming.student.manager.data.model.StudentEntity">

<id property="studentId"    column="STUDENT_ID" javaType="String" jdbcType="VARCHAR"/>

<result property="studentName"    column="STUDENT_NAME" javaType="String" jdbcType="VARCHAR"/>

<result property="studentSex"    column="STUDENT_SEX" javaType="int" jdbcType="INTEGER"/>

<result property="studentBirthday"  column="STUDENT_BIRTHDAY" javaType="Date" jdbcType="DATE"/>

<result property="studentPhoto" column="STUDENT_PHOTO" javaType="byte[]" jdbcType="BLOB" typeHandler="org.apache.ibatis.type.BlobTypeHandler" />

<result property="placeId"      column="PLACE_ID" javaType="String" jdbcType="VARCHAR"/>

<discriminator column="CLASS_ID" javaType="String" jdbcType="VARCHAR">

<case value="20000001" resultType="liming.student.manager.data.model.StudentEntity" >

<result property="classId" column="CLASS_ID" javaType="String" jdbcType="VARCHAR"/>

</case>

</discriminator>

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/f351fe2df817a72409de323bb87a45ca.html