使用mybatis的resultMap进行复杂查询

Posted 知识需要日复一日的积累和坚持

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用mybatis的resultMap进行复杂查询相关的知识,希望对你有一定的参考价值。

本来写了一份,临时有事忘保存,丢了,现在重新写一份

使用mybatis的resultMap进行复杂查询

首先来了解一下数据表的结构。

 

 现在共有两张表,paper_template和paper_template_question_setting,其中paper_template是主表,setting是从表,主要负责记录模板中的一些设置,两表是一对多的关系

现在我想查询模板列表,并且附带模板的设置信息

select t.id,t.name,s.* from paper_template as t
left join paper_template_question_setting as s on t.id= s.template_id
where t.id=104

 对应的resultmap应该这么写

<resultMap id="testResultMap" type="com.xkw.its.homework.papertemplate.PaperTemplateDto">
        <id column="id" jdbcType="INTEGER" property="id"/>
        <result column="name" jdbcType="VARCHAR" property="name"/>
        <result column="organization_id" jdbcType="VARCHAR" property="organizationId"/>
        <result column="stage_id" jdbcType="VARCHAR" property="stageId"/>
        <result column="subject_id" jdbcType="INTEGER" property="subjectId"/>
        <result column="grade_id" jdbcType="INTEGER" property="gradeId"/>
        <result column="semester" jdbcType="TINYINT" property="semester"/>
        <result column="year" jdbcType="INTEGER" property="year"/>
        <result column="create_user_id" jdbcType="VARCHAR" property="createUserId"/>
        <result column="create_time" jdbcType="TIMESTAMP" property="createTime"/>
        <result column="update_time" jdbcType="TIMESTAMP" property="updateTime"/>
        <result column="update_user_id" jdbcType="VARCHAR" property="updateUserId"/>
        <result column="explain_info" jdbcType="VARCHAR" property="explainInfo"/>
        <result column="difficulty_degree" jdbcType="VARCHAR" property="difficultyDegree"/>
        <result column="student_info" jdbcType="VARCHAR" property="studentInfo"/>
        <result column="sealing_line_text" jdbcType="VARCHAR" property="sealingLineText"/>
        <result column="is_deleted" jdbcType="BIT" property="isDeleted"/>
        <result column="source" jdbcType="TINYINT" property="source"/>
        <collection property="paperTemplateQuestionSettingDtoList"
                    ofType="com.xkw.its.homework.papertemplatequestionsetting.PaperTemplateQuestionSetting">
            <id column="id" jdbcType="INTEGER" property="id"/>
            <result column="start" jdbcType="INTEGER" property="start"/>
            <result column="end" jdbcType="INTEGER" property="end"/>
            <result column="question_count" jdbcType="INTEGER" property="questionCount" />
            <result column="is_composite" jdbcType="BIT" property="isComposite" />
            <result column="qcourse_id" jdbcType="INTEGER" property="courseId" />
            <result column="qsubject_id" jdbcType="INTEGER" property="subjectId"/>
            <result column="question_type_id" jdbcType="VARCHAR" property="questionTypeId"/>
            <result column="score" jdbcType="DOUBLE" property="score"/>
            <result column="template_id" jdbcType="INTEGER" property="templateId"/>
            <result column="difficulty_id" jdbcType="INTEGER" property="difficultyId" />
        </collection>
    </resultMap>

 

 此处做一个说明

property 对应的类中的字段名
collection 对应一个集合
ofType  是集合对应的类名
将子类的各个字段放在
collection 中即可

接口的查询结果如下图所示

 

 

  对比从数据库的直接查询结果,和从接口获取的结果发现:

paperTemplateQuestionSettingDtoList接口中只返回一条,并且id和template表中的id一样。这是因为本次查询中出现了两个id,查询映射自动默认第一个。解决方法就是在查询语句中为setting表中的id重命名,代码如下:
select *,q.id as q_id
    from paper_template t
    left join paper_template_catalog c on t.id=c.template_id
    left join paper_template_question_setting q on t.id=q.template_id
    where t.id=104

 

 

 今天只测试了带集合的用法,带对象的用法还没有测试,改天再来补充

 

以上是关于使用mybatis的resultMap进行复杂查询的主要内容,如果未能解决你的问题,请参考以下文章

mybatis框架,使用foreach实现复杂结果的查询--循环集合数组

查询复杂对象用respsbody转换成json串时,mybatis的延迟加载报错的解决方法

mybatis之旅第六篇-关联查询

Mybatis 的嵌套查询与嵌套结果的区别

Mybatis 的嵌套查询与嵌套结果的区别

MyBatis注解开发之一对多查询