• MyBatis association的两种形式——MyBatis学习笔记之四


    一、嵌套的resultMap

          这 种方法本质上就是上篇博文介绍的方法,只是把教师实体映射从association元素中提取出来,用一个resultMap元素表示。然后 association元素再引用这个resultMap元素。修改上篇博文示例的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 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>

         在 这里,为了让select语句更加清晰可读,每个字段都使用了别名。association元素的属性javaType="Teacher"可以不要,不 像上篇博文示例那样,没有此属性即报错。这大概是因为引用的resultMap元素已经指明了映射的类型为“Teacher”。另外,今天偶然发现,把 StudentMapper.xml的encoding属性由“UTF-8”改为“utf8”即可添加中文注释。

          运行结果如下:

          这种方式的好处是此resultMap元素可在其它地方被重用(可在博文下方附件下载处下载示例源码)。

    二、嵌套的select语句

          这种方式是使用一条单独的select语句来加载关联的实体(在本例中就是教师实体),然后在association元素中引用此select语句(注:此方法会产生N+1问题,关于这个问题可参考本系列博客中的“MyBatis中的N+1问题”)。修改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。

           执行结果如下(可在博文下方附件下载处下载示例源码):


  • 相关阅读:
    如何抓住用户痛点做产品?
    分析需求场景对产品设计的意义
    【用户分析-用户场景】这TM才是产品思维!
    WebUploader实现浏览器端大文件分块上传
    npm 安装包报错 rollbackFailedOptional
    PAT 甲级 1074 Reversing Linked List (25 分)(链表部分逆置,结合使用双端队列和栈,其实使用vector更简单呐)...
    PAT 甲级 1071 Speech Patterns (25 分)(map)
    P3370 【模板】字符串哈希
    PageRank算法原理与Python实现
    PAT-2019年冬季考试-甲级 7-4 Cartesian Tree (30分)(最小堆的中序遍历求层序遍历,递归建树bfs层序)...
  • 原文地址:https://www.cnblogs.com/duanxz/p/3830509.html
Copyright © 2020-2023  润新知