一对多有两种方法
方法一: 使用嵌套ResultMap + collection关键字
<resultMap type="Course" id="CourseResult">
<id column="course_id" property="courseId"/>
<result column="name" property="name"/>
<result column="description" property="description"/>
<result column="start_date" property="startDate"/>
<result column="end_date" property="endDate"/>
</resultMap>
<resultMap type="Tutor" id="TutorResult">
<id column="tutor_id" property="tutorId"/>
<result column="tutor_name" property="name"/>
<result column="email" property="email"/>
<collection property="courses" resultMap="CourseResult"/>
</resultMap>
<select id="findTutorById" parameterType="int" resultMap="TutorResult">
SELECT T.TUTOR_ID, T.NAME AS TUTOR_NAME, EMAIL, C.COURSE_ID,
C.NAME, DESCRIPTION, START_DATE, END_DATE
FROM TUTORS T LEFT OUTER JOIN ADDRESSES A ON T.ADDR_ID=A.ADDR_ID
LEFT OUTER JOIN COURSES C ON T.TUTOR_ID=C.TUTOR_ID
WHERE T.TUTOR_ID=#{tutorId}
</select>
方法二: 使用嵌套collection + select
<resultMap type="Course" id="CourseResult">
<id column="course_id" property="courseId"/>
<result column="name" property="name"/>
<result column="description" property="description"/>
<result column="start_date" property="startDate"/>
<result column="end_date" property="endDate"/>
</resultMap>
<resultMap type="Tutor" id="TutorResult">
<id column="tutor_id" property="tutorId"/>
<result column="tutor_name" property="name"/>
<result column="email" property="email"/>
<association property="address" resultMap="AddressResult"/>
<collection property="courses" column="tutor_id" select="findCoursesByTutor"/>
</resultMap>
<select id="findTutorById" parameterType="int" resultMap="TutorResult">
SELECT T.TUTOR_ID, T.NAME AS TUTOR_NAME, EMAIL
FROM TUTORS T
WHERE T.TUTOR_ID=#{tutorId}
</select>
<select id="findCoursesByTutor" parameterType="int" resultMap="CourseResult">
SELECT * FROM COURSES WHERE TUTOR_ID=#{tutorId}
</select>
需求
模版管理模块数据回显的时候需要查询试卷模版的详情,在模版表中存放着模版id,在模版明细表和题库类型表存放着试题类型详情,现在需要查询模版表ID,然后关联模版明细表和题库类型表以及另一张表。由下图可知我们的查寻是一对多的关系。
sql语句
明确了关系以及索要查询的信息,下面就是sql语句。
<!--根据模版ID查询模版详情-2018.05.25-吕德彪-->
<select id="findTemplateDetails" parameterType="String" resultMap="templateDetailsMap">
SELECT
pt.question_type_order AS questionTypeOrder,
pt.question_type_score AS questionTypeScore,
pt.question_type_num AS questionTypeNum,
qd.chapter As chapter,
qd.is_extract AS isExtract,
qd.small_question_count AS smallQuestionCount,
qd.degree As degree,
qd.small_question_score AS smallQuestionScore,
qt.question_code AS questionTypeCode,
qt.question_name AS questionTypeName
FROM
te_template_paper p
INNER JOIN te_template_paper_questiontype pt ON p.id = pt.templateOrpaper_id
INNER JOIN te_template_detail qd ON qd.template_questiontype_id = pt.id
INNER JOIN te_question_type qt ON qt.id = pt.question_type_id
WHERE
p.id = #{templateId}
ORDER BY
pt.question_type_order
</select>
如果上边的sql语句,不加映射的话,查询出来的信息,都在一张一张表中,然后返回到前端,还得将模版信息和题型详细信息分别放入不同的list。那么有没有一种可能就是,在后端就可以实现list套list呢?答案当然是可以滴。那就是用MyBatis映射。
定义实体
/**
* Created by shuo on 2017/12/5.
*/
public class TemplateQuestionTypeModel extends TemplatePaperQuestiontypeEntity implements Serializable {
//题型code
private String questionTypeCode;
//题型名称
private String questionTypeName;
//题型描述
private String questionTypeDesc;
//题型下的多条小题
List<TemplateDetailEntity> templateDetailEntityList;
public List<TemplateDetailEntity> getTemplateDetailEntityList() {
return templateDetailEntityList;
}
public void setTemplateDetailEntityList(List<TemplateDetailEntity> templateDetailEntityList) {
this.templateDetailEntityList = templateDetailEntityList;
}
public String getQuestionTypeName() {
return questionTypeName;
}
public void setQuestionTypeName(String questionTypeName) {
this.questionTypeName = questionTypeName;
}
public String getQuestionTypeCode() {
return questionTypeCode;
}
public void setQuestionTypeCode(String questionTypeCode) {
this.questionTypeCode = questionTypeCode;
}
public String getQuestionTypeDesc() {
return questionTypeDesc;
}
public void setQuestionTypeDesc(String questionTypeDesc) {
this.questionTypeDesc = questionTypeDesc;
}
}
通过上边的实体就可以发现,实体是由外层的TemplateQuestionTypeModel嵌着里边的templateDetailEntityList的。
映射
有了sql语句和modal后,我们就可以写映射了,映射采用的是第一种方法:使用嵌套ResultMap + collection关键字。
<!--为根据模版ID查询模版详情提供映射-2018.05.26-吕德彪-->
<resultMap id="templateDetailsMap" type="com.dmsdbj.itoo.examinationEvaluation.entity.ext.TemplateQuestionTypeModel">
<id column="id" property="id"/>
<result column="questionTypeOrder" property="questionTypeOrder"/>
<result column="questionTypeScore" property="questionTypeScore"/>
<result column="questionTypeNum" property="questionTypeNum"/>
<result column="questionTypeCode" property="questionTypeCode"/>
<result column="questionTypeName" property="questionTypeName"/>
<collection property="templateDetailEntityList"
ofType="com.dmsdbj.itoo.examinationEvaluation.entity.TemplateDetailEntity">
<id column="templateDetailId" property="id"/>
<result column="chapter" property="chapter"/>
<result column="isExtract" property="isExtract"/>
<result column="smallQuestionCount" property="smallQuestionCount"/>
<result column="degree" property="degree"/>
<result column="smallQuestionScore" property="smallQuestionScore"/>
</collection>
</resultMap>