zoukankan      html  css  js  c++  java
  • 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。

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


  • 相关阅读:
    Unity《ATD》塔防RPG类3D游戏架构设计(一)
    计算机网络基础笔记 运输层协议UDP/TCP
    空间划分的数据结构(四叉树/八叉树/BVH树/BSP树/k-d树)
    游戏设计模式——内存池管理
    Unity 用ml-agents机器学习造个游戏AI吧(2) (深度强化学习入门DEMO)
    博客部署设计和构建
    教你如何把浏览器变为浏览“神器”
    珍藏多年的学习资料300G+,赶紧免费领取,从此离大神更进一步(文末有彩蛋)
    图解一致性哈希算法,全网(小区局域网)最通俗易懂
    SpringBoot整合Mail发送邮件&发送模板邮件
  • 原文地址:https://www.cnblogs.com/duanxz/p/3830509.html
Copyright © 2011-2022 走看看