Mybatis级联:关联、集合和鉴别器的使用
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级联:关联、集合和鉴别器的使用的更多相关文章
- mybatis映射文件select_resultMap_关联查询_collection定义关联集合
知识点:查询一个实体类,并查出这个类下面的集合 Employee.java实体类 package com.hand.mybatis.bean;public class Employee { pr ...
- mybatis 级联
级联是一个数据库实体的概念.一对多的级联,一对多的级联,在MyBatis中还有一种被称为鉴别器的级联,它是一种可以选择具体实现类的级联. 级联不是必须的,级联的好处是获取关联数据十分便捷,但是级联过多 ...
- 04—mybatis的关联映射
mybatis的关联映射一对一一对多多对多 一.一对一(一个人只能有一个身份证号) 1.创建表创建表tb_card CREATE TABLE `tb_card` ( `id` int(11) NOT ...
- MyBatis实现关联表查询
一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关 ...
- Mybatis之关联查询
一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关 ...
- MyBatis——实现关联表查询
原文:http://www.cnblogs.com/xdp-gacl/p/4264440.html 一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创 ...
- Mybatis系列(三):Mybatis实现关联表查询
原文链接:http://www.cnblogs.com/xdp-gacl/p/4264440.html 一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 ...
- Mybatis表关联多对一
在上章的 一对多 中,我们已经学习如何在 Mybatis 中关联多表,但在实际项目中也是经常使用 多对一 的情况,这些查询是如何处理的呢,在这一节中我们来学习它.多表映射的多对一关系要用到 mybit ...
- MyBatis.4关联
关联.多对一关联查询 package org.mybatis.example.dao; import java.util.Date; //雇员类 public class Emp { private ...
随机推荐
- 获取【请求体】数据的3种方式(精)(文末代码) request.getInputStream() request.getInputStream() request.getReader()
application/x- www-form-urlencoded是Post请求默认的请求体内容类型,也是form表单默认的类型.Servlet API规范中对该类型的请求内容提供了request. ...
- 使用python调用其他脚本
cmd = '<command line string>' print(cmd) p = subprocess.Popen(args=cmd, shell=True, stdout=sub ...
- JSON数据、PHP数组 转换 Excel表格
//excel输出 header("Content-type:application/vnd.ms-excel"); header("Content-Dispositio ...
- OTB数据库上各tracker评测结果
后面两张success plot分别是按照threshold和auc排序 各tracker说明: Year2015: [CF2] 实验结果比论文中的结果好,原因是我运行的是作者后期又更新过的代码,作者 ...
- 【SQLServer】附加数据库失败
一个参考:https://blog.csdn.net/zjx86320/article/details/25562361 如果类似Administrator.Everyone等都依照网上的权限改过之后 ...
- docker systemctl无法使用
Dockerfile for systemd base image FROM centos:7 ENV container docker RUN (cd /lib/systemd/system/sys ...
- Android Studio Gradle依赖冲突
版本冲突 Gradle提供了两种解决版本冲突的策略:Newest和Fail.默认策略是Newest,配置Fail模式: configurations.all { resolutionStrategy. ...
- iOS安全系列之一:HTTPS
如何打造一个安全的App?这是每一个移动开发者必须面对的问题.在移动App开发领域,开发工程师对于安全方面的考虑普遍比较欠缺,而由于iOS平台的封闭性,遭遇到的安全问题相比于Android来说要少得多 ...
- VUE开发
待完善... Node.js 参考文档:http://nodejs.cn/ Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境. Node.js 使用了一个 ...
- Web API的接口访问安全性
使用签名获取Token 首先我们自定义appkey.appSecret.可用GUID随机生成,AppSecret要不定期更换.然后放到配置文件中. Appkey=1AF62C68-B970-46E7- ...