Mybatis中级联有关联(association)、集合(collection)、鉴别器(discriminator)三种。其中,association对应一对一关系、collection对应一对多关系、discriminator可以根据情况选择采用哪个类作为实例,关联不同的结果集。

一、关联

Mybatis的关联有两种方式:

  • 嵌套查询:通过执行另外一个 sql映射语句来返回预期的复杂类型
  • 嵌套结果:使用嵌套结果映射来处理重复了联合结果的子集

场景一:一个部门Department有一个部门经理Leader

<!--    嵌套查询 (N+1查询问题)    -->
<resultMap type="Department" id="deptResult">
  <id property="id" column="d_id"/>
  <result property="name" column="d_name"/>
  <association property="leader" column="leader_id" select="getLeader" javaType="Leader"/>
</resultMap>
<select id="getDept" parameterType="int" resultMap="deptResult">
  select * from department where d_id=#{id}
</select> <select id="getLeader" parameterType="int" resultType="Leader">
  select * from leader where l_id=#{id}
</select> <!-- 嵌套结果 -->
<resultMap type="task.Department" id="deptResult">
  <id property="id" column="d_id"/>
  <result property="name" column="d_name"/>
  <association property="leader" javaType="Leader">
    <id property="id" column="l_id"/>
    <result property="name" column="l_name"/>
  </association>
</resultMap>
<select id="getDept" parameterType="int" resultMap="deptResult">
  select * from department d, leader l where d.leader_id = l.l_id and d.d_id=#{id}
</select>

场景二:获取指定部门的所有上级部门(获取子结点的所有父结点,一个结点最多只有一个直接父结点)

<resultMap type="Department" id="deptResult">
  <id column='id' property='id'/>
  <result column='name' property='name'/>
  <association property='parent' javaType='Department' select='getPDept' column='p_id'/>
</resultMap>
<select id="getDept" resultMap="deptResult">
  select id,name,p_id from department where id =#{id}
</select>

二、集合

和关联一样,集合也有嵌套查询和嵌套结果两种方式,只是多了个关键字ofType,用来区分JavaBean属性类型和集合包含的类型。

场景:一个部门Department有多个员工Worker

<!--    嵌套查询    -->
<resultMap type="Department" id="deptResult">
<id property="id" column="id"/>
<result property="name" column="d_name"/>
<!-- javaType属性不是必需的 -->
<collection property="workers" javaType="ArrayList" column="id" ofType="Worker" select="getWorkers"/>
</resultMap>
<resultMap type="Worker" id="workerResult" >
<id property="id" column="w_id"/>
<result property="name" column="w_name"/>
<result property="age" column="age"/>
</resultMap>
<select id="getDept" parameterType="int" resultMap="deptResult">
select id,d_name from department where id=#{id}
</select>
<select id="getWorkers" parameterType="int" resultMap="workerResult">
select w_id,w_name,age from worker where d_id=#{id}
</select> <!-- 嵌套结果 -->
<resultMap type="Department" id="deptResult">
<id property="id" column="id"/>
<result property="name" column="d_name"/>
<collection property="workers" ofType="Worker">
<id property="id" column="w_id"/>
<result property="name" column="w_name"/>
<result property="age" column="age"/>
</collection>
</resultMap>
<select id="getDept" parameterType="int" resultMap="deptResult">
select id,d_name,w_id,w_name,age from department,worker where id=d_id and id=#{id}
</select>

三、鉴别器

有时一个数据库查询语句会返回很多不同数据类型的结果集。鉴别器用于处理这种情况,还包括类的继承层次结构,其表现相当于Java中的switch语句。

场景:交通工具Vehicle,有子类小汽车Car,卡车Truck两种类型,根据vehicle表中type字段区别数据,将查询出的数据自动封装成不同类型的对象

<resultMap type="Vehicle" id="vehicleResult">
<id property="id" column="id"/>
<result property="color" column="color"/>
<discriminator javaType="int" column="type">
<case value="1" resultType="Car">
<result property="doorCount" column="door_count"></result>
</case>
<case value="2" resultType="Truck">
<result property="boxSize1" column="box_size1"></result>
<result property="boxSize2" column="box_size2"></result>
</case>
</discriminator>
</resultMap>
<select id="getVehicle" resultMap="vehicleResult">
select * from vehicle
</select>

Mybatis级联:关联、集合和鉴别器的使用的更多相关文章

  1. mybatis映射文件select_resultMap_关联查询_collection定义关联集合

    知识点:查询一个实体类,并查出这个类下面的集合 Employee.java实体类 package com.hand.mybatis.bean;public class Employee {    pr ...

  2. mybatis 级联

    级联是一个数据库实体的概念.一对多的级联,一对多的级联,在MyBatis中还有一种被称为鉴别器的级联,它是一种可以选择具体实现类的级联. 级联不是必须的,级联的好处是获取关联数据十分便捷,但是级联过多 ...

  3. 04—mybatis的关联映射

    mybatis的关联映射一对一一对多多对多 一.一对一(一个人只能有一个身份证号) 1.创建表创建表tb_card CREATE TABLE `tb_card` ( `id` int(11) NOT ...

  4. MyBatis实现关联表查询

    一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关 ...

  5. Mybatis之关联查询

    一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关 ...

  6. MyBatis——实现关联表查询

    原文:http://www.cnblogs.com/xdp-gacl/p/4264440.html 一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创 ...

  7. Mybatis系列(三):Mybatis实现关联表查询

    原文链接:http://www.cnblogs.com/xdp-gacl/p/4264440.html 一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 ...

  8. Mybatis表关联多对一

    在上章的 一对多 中,我们已经学习如何在 Mybatis 中关联多表,但在实际项目中也是经常使用 多对一 的情况,这些查询是如何处理的呢,在这一节中我们来学习它.多表映射的多对一关系要用到 mybit ...

  9. MyBatis.4关联

    关联.多对一关联查询 package org.mybatis.example.dao; import java.util.Date; //雇员类 public class Emp { private ...

随机推荐

  1. DevExpress GridControl控件行内新增、编辑、删除添加选择框

    以下为内容以图片居多1234表示点击顺序 先新增一行 操作和新增数据行一样 打开ColumnEdit  选择new ButtenEdit  new上方会出现一个系统命名的button 命名可以更改必须 ...

  2. 左耳听风-ARTS-第2周(2019/3/31-2019/4/6)

    Algorithm 验证括号题(https://leetcode.com/problems/valid-parentheses/).这道题在极客时间上覃超的<算法面试通关40讲>(http ...

  3. MySQL表介绍

    MySQL InnoDB表介绍 一.索引组织表 在InnoDB引擎中,表都是根据主键顺序存放的.这种存储方式称为索引组织表,在InnoDB引擎中,每张表都有逐渐.如果没有显示定义主键,则引擎会按照以下 ...

  4. 基于MATLAB搭建的DDS模型

    基于MATLAB搭建的DDS模型 说明: 累加器输出ufix_16_6数据,通过cast切除小数部分,在累加的过程中,带小数进行运算最后对结果进行处理,这样提高了计算精度. 关于ROM的使用: 直接设 ...

  5. 黄聪:Windows2012-IIS8安装SSL证书

    开始菜单->右上角搜索按钮-> mmc 弹出窗口 关闭控制台会提示保存 打开iis新建站点,为了兼容不支持sni的浏览器,绑定默认https

  6. mac下常用命令

    常用命令 ls 查看当前目录下的文件 cd 进入某目录 . cd - 跳转回前一目录 . cd ~ 进入当前用户个人目录 pwd 输出当前所在路径 mkdir 新建文件夹. touch 新建文件 fi ...

  7. 设计stark组件

    设计stark组件 作者:Eric 微信:loveoracle11g 新建Django项目crm_1随便起名 然后再创建一个App manage.py@crm_1 > startapp star ...

  8. Hadoop 2.8集群安装及配置记录

    第一部分:环境配置(含操作系统.防火墙.SSH.JAVA安装等) Hadoop 2.8集群安装模拟环境为: 主机:Hostname:Hadoop-host,IP:10.10.11.225 节点1:Ho ...

  9. sql脚本过大,无法打开的解决方法

    打开cmd命令窗口,输入如下命令: sqlcmd -S ipaddress -U user -P password -d dbname -i file 其中,ipaddress是数据库服务器ip,us ...

  10. Python的内置函数

    python的内置函数一共有68个,下面将简单介绍各个函数的功能. abs() dict() help() min() setattr() all() dir() hex() next() slice ...