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. java web(五):java web三大组件之另外两个和八大监听器

    java的三大组件指Servlet.Filter.Listener.八大监听器指八个接口.前面介绍了Servlet,现在介绍一下Filter拦截器以及拦截地址的设置, Listener监听那些事件. ...

  2. gcc的调试调研——gdb

    首先来介绍一下gcc的选项: 其他选项都为常用编译选项,在这里介绍一下优化功能: 优化编译时使用选项: -O:可以告诉gcc同时减小代码的长度和执行时间,其效果等价于-O1,在这一级别上能够进行的优化 ...

  3. Linux ①

    目录 一.计算机简单认识 二.linux初始 三.安装虚拟机 四.安装Linux系统 五. 使用xshell 6 进行远程控制 六.linux文档与目录结构 七.常用命令 一.计算机简单认识 1.服务 ...

  4. Docker系列(一)CentOS 6.5 离线安装、不升级内核

    本特安装教程特点 1.由于是离线下载,需要提前下载好需要的依赖包 2.使用的版本为Centos6.5 3.不升级内核 4.提供异常解决方案. 安装过程 一.下载依赖包(使用能联网的节点) 依赖包可以自 ...

  5. HTML5 video 播放视频黑屏

    <video width="320" height="240" controls>        <source src="movi ...

  6. python 学习第一天

    第一天接触python,首先感谢老男孩的授课老师!!!! 今天的知识点: 1.首先接触到python的第一个模块getpass(这边有点迷茫,不能确定的是这个getpasss是一个库还是一个模块)ge ...

  7. 二叉搜索树(BST)学习笔记

    BST调了一天,最后遍历参数错了,没药救了-- 本文所有代码均使用数组+结构体,不使用指针! 前言--BFS是啥 BST 二叉搜索树是基于二叉树的一种树,一种特殊的二叉树. 二叉搜索树要么是一颗空树, ...

  8. js obj对象转formdata格式代码

    import isArray from "lodash/isArray" export function objToFormData(config) { //对象转formdata ...

  9. vector用法

    转:http://www.cnblogs.com/wang7/archive/2012/04/27/2474138.html 在c++中,vector是一个十分有用的容器,下面对这个容器做一下总结. ...

  10. C#中获取文件信息的代码

    如下的内容内容是关于C#中获取文件信息的内容,应该对大伙有一些好处. FileInfo fi = new FileInfo(@"C:file.txt"); if(fi.Exists ...