查询Emp的同时,查出emp对应的部门Department

方法1:联合查询,使用级联属性封装结果集

<!--

联合查询,使用级联属性封装结果集

type:要自定义规则的javaBean类型

id:唯一标识,方便引用

column:指的是数据库表中的列名

property:列名对应的javaBean中的属性名称

-->

<resultMap type="cn.bdqn.mybatis.been.Emp" id="myDifemp">

<id column="id" property="id" />

<result column="last_name" property="last_name" />

<result column="gender" property="gender" />

<result column="did_id" property="dept.id" />

<result column="dept_name" property="dept.departmentName" />

</resultMap>

<!--public Emp getEmpAndDept(Integer id); -->

<select id="getEmpAndDept" resultMap="myDifEmp2">

SELECT e.id AS id,e.last_name AS last_name,e.gender AS gender,e.email AS

email,d.id AS d_id,d.`dept_name` AS dept_name

FROM emp e,dept d WHERE e.`d_id`=d.id and e.id=#{id}

</select>

方法2:association来实现多表查询

<!--

association来实现多表查询

association标签的property属性来指定javaBean中的哪个属性是我们自定义的(即:哪个属性是联合的对象),

javaType是用来指定这个属性的类型(不能省略)

association标签中继续使用id和result标签来封装相应的封装规则

-->

<resultMap type="cn.bdqn.mybatis.been.Emp" id="myDifEmp2">

<id column="id" property="id" />

<result column="last_name" property="last_name" />

<result column="gender" property="gender" />

<result column="email" property="email"/>

<association property="dept"  javaType="cn.bdqn.mybatis.been.Department">

<id column="did_id"  property="id"/>

<result column="dept_name" property="departmentName"/>

</association>

</resultMap>

方法3:association进行分步式多表查询

01.先按照员工id查询员工信息

02.根据查出员工信息中的d_id值去部门表查询部门信息

03.把查出的部门设置到员工中;

创建Department的javaBean,编写对应的映射文件,

DepartmentMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE mapper

PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!--namespace与接口进行绑定 -->

<mapper namespace="cn.bdqn.mybatis.dao.DeptMapper">

<!--public Department getDepartmentById(Integer id); -->

<select id= "getDepartmentById" resultType="cn.bdqn.mybatis.been.Department">

<!--我们数据表中部门名称的字段的名字是dept_name 而我们javaBean中对应的 名字是departmentName,不一致,所以我们要将查询的列一一写出,并且将名称不相同的,起别名 -->

select id,dept_name as departmentName from dept where id=#{id}

</select>

</mapper>

编写emp对应的映射文件

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE mapper

PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!--namespace:名称空间 -->

<mapper namespace="cn.bdqn.mybatis.dao.EmpMapperPlus">

<!-- association来实现多表查询 association标签的property属性来指定javaBean中的哪个属性是我们自定义的(即:哪个属性是联合的对象),

javaType是用来指定这个属性的类型(不能省略) association标签中继续使用id和result标签来封装相应的封装规则 -->

<resultMap type="cn.bdqn.mybatis.been.Emp" id="myDifEmp2">

<id column="id" property="id" />

<result column="last_name" property="last_name" />

<result column="gender" property="gender" />

<result column="email" property="email" />

<association property="dept" javaType="cn.bdqn.mybatis.been.Department">

<id column="did_id" property="id" />

<result column="dept_name" property="departmentName" />

</association>

</resultMap>

<!--

使用association进行分步式查询

1.先按照员工id查询员工信息

2.根据查出员工信息中的d_id值去部门表查询部门信息

3.把查出的部门设置到员工中;

-->

<resultMap type="cn.bdqn.mybatis.been.Emp" id="myEmpBy">

<id column="id" property="id" />

<result column="last_name" property="last_name" />

<result column="gender" property="gender" />

<result column="email" property="email" />

<!--association定义关联对象的封装规则 select:select的属性值是部门的映射文件的名称空间+对应的方法名称 表明当前属性是调用select指定的方法查出来的结果

column:指定将哪一列的值传给这个方法 流程:使用select指定的方法(传入column指定的这列参数的值)查出对象,并封装给property指定的属性 -->

<association property="dept"

select="cn.bdqn.mybatis.dao.DeptMapper.getDepartmentById" column="d_id">

</association>

</resultMap>

<!-- public Emp getEmpByIdStep(Integer id); -->

<select id="getEmpByIdStep" resultMap="myEmpBy">

select * from emp where

id=#{id}

</select>

</mapper>

注意:这两个映射文件写好后,必须都要在全局配置文件mybatis-config.xml中进行注册

<mappers>

<mapper resource="EmpMapperPlus.xml" />

<mapper resource="DepartmentMapper.xml"/>

</mappers>

分步查询,可以使用延迟加载(懒加载/按需加载)

emp==>Dept

使用联合查询和其他复杂查询时,emp的信息和Dept的信息都会同时查出,这样很浪费资源

而我们希望部门信息在我们使用的时候再去查询,这样就很节省数据库了

只需要在分段查询的基础之上加上两个配置:

只需要在全局配置文件中开启懒加载模式

<setting name="lazyLoadingEnabled" value="true"/>

和按需加载

<setting name="aggressiveLazyLoading" value="false"/>

便可以实现

MyBatis联合查询和使用association 进行分步式查询的更多相关文章

  1. MyBatis(10)使用association进行分步查询

    (1)接口中编写方法 public Emp getEmpByStep(Integer id); public Dept getDeptById(Integer id); (2)Mapper文件 < ...

  2. 大数据量查询容易OOM?试试MySQL流式查询

    一.前言 程序访问 MySQL 数据库时,当查询出来的数据量特别大时,数据库驱动把加载到的数据全部加载到内存里,就有可能会导致内存溢出(OOM). 其实在 MySQL 数据库中提供了流式查询,允许把符 ...

  3. OpenHarmony 3.1 Beta版本关键特性解析——探秘隐式查询

    ​(以下内容来自开发者分享,不代表 OpenHarmony 项目群工作委员会观点)​ 徐浩 隐式查询是 OpenAtom OpenHarmony(以下简称"OpenHarmony" ...

  4. MyBatis联合查询association使用

    1.需求 两张表 channels(频道表)  member(会员表) 频道表里面有会员id,查询频道列表的时候需要关联查询出会员的名称,头像等信息 . 2.channels.xml定义,配置主要在这 ...

  5. MyBatis从入门到精通(十):使用association标签实现嵌套查询

    最近在读刘增辉老师所著的<MyBatis从入门到精通>一书,很有收获,于是将自己学习的过程以博客形式输出,如有错误,欢迎指正,如帮助到你,不胜荣幸! 本篇博客主要讲解使用associati ...

  6. mybatis联合查询

    1.有学生实体 @Component @Scope("prototype") public class StudentInfo { private Integer studentI ...

  7. Mybatis 高级结果映射 ResultMap Association Collection

    在阅读本文章时,先说几个mybatis中容易混淆的地方: 1. mybatis中的列不是数据库里的列而是查询里的列,可以是别名(如 select user_name as userName,这时col ...

  8. Mybatis中的collection、association来处理结果映射

    前不久的项目时间紧张,为了尽快完成原型开发,写了一段效率相当低的代码. 最近几天闲下来,主动把之前的代码优化了一下:)   标签:Java.Mybatis.MySQL 概况:本地系统从另外一个系统得到 ...

  9. MyBatis学习总结(5)——实现关联表查询

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

随机推荐

  1. ERP开源框架 + 二次开发平台 介绍

    经历了多年软件开发,深受网络大侠们的资源共享才得以有所成绩, 本人主要是做企业ERP软件,一直有个感受,开发具体某个功能不难,但随着需求的增加,管理庞大的代码却成了最大的问题 而为企业管理所做的开发, ...

  2. Django model 表与表的关系

    一对多:models.ForeignKey(其他表) 多对多:models.ManyToManyField(其他表) 一对一:models.OneToOneField(其他表) 应用场景: 一对多:当 ...

  3. BZOJ2794[Poi2012]Cloakroom——离线+背包

    题目描述 有n件物品,每件物品有三个属性a[i], b[i], c[i] (a[i]<b[i]).再给出q个询问,每个询问由非负整数m, k, s组成,问是否能够选出某些物品使得:1. 对于每个 ...

  4. day28 classmethod 装饰器

    类方法装饰类方法 把一个方法变成类中的方法 之后调用此方法不需要对类实例化后在调用 直接通过类.方法即可调用 class Goods: __discount = 0.5 def __init__(se ...

  5. MT【34】正余弦的正整数幂次快速表示成正余弦的线性组合

    问题:如何快速把$cos^4xsin^3x$表示成正弦,余弦的线性组合? 分析:利用牛顿二项式展开以下表达式: 再利用欧拉公式$e^{i\theta}=cos\theta+isin\theta$ 比如 ...

  6. 【BZOJ2281】[SDOI2011]黑白棋(博弈论,动态规划)

    [BZOJ2281][SDOI2011]黑白棋(博弈论,动态规划) 题面 BZOJ 洛谷 题解 先看懂这题目在干什么. 首先BZOJ上面的题面没有图,换到洛谷看题就有图了. 不难发现都相邻的两个异色棋 ...

  7. 洛谷 P1069 细胞分裂 解题报告

    P1069 细胞分裂 题目描述 \(Hanks\)博士是\(BT\) (\(Bio-Tech\),生物技术) 领域的知名专家.现在,他正在为一个细胞实验做准备工作:培养细胞样本. \(Hanks\) ...

  8. suoi21 高能显示屏 (cdq分治)

    可以把翻倍的操作看作是一个查询和修改(增加刚查询得来的值)的符合操作,然后做cdq就行了 #include<bits/stdc++.h> #define pa pair<int,in ...

  9. UVALive - 6442 (思维题)

    题目链接:https://vjudge.net/contest/241341#problem/I 题目大意:给你一个有N个点等距的环,编号[0,N-1],然后有些点上有一个或多个硬币,通过移动这些硬币 ...

  10. 省选模拟赛第四轮 B——O(n^4)->O(n^3)->O(n^2)

    一 稍微转化一下,就是找所有和原树差距不超过k的不同构树的个数 一个挺trick的想法是: 由于矩阵树定理的行列式的值是把邻接矩阵数值看做边权的图的所有生成树的边权乘积之和 那么如果把不存在于原树中的 ...