【Mybatis映射】-一对多查询

一对多有两种方法

方法一: 使用嵌套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>

实现结果如下

这里写图片描述

猜你喜欢

转载自blog.csdn.net/ldb987/article/details/80470606