外键查询

1、回忆外键约束

注意要在tbl_dept中添加外键

#添加外键约束
# 此处Employee为外键表,dept为主键表
# 删除Employee的数据不会影响dapt,而删除dept一定会影响employee,这是为了保证数据的一致性
alter table tbl_employee add constraint fk_emp_dept
foreign key (d_id) references tbl_dept(id);

2、sql的关联查询

SELECT e.`id` id,e.gender gender,e.`last_name` last_name,e.`email` email, e.`d_id` d_id ,d.`dept_name`
FROM tbl_employee e,tbl_dept d
WHERE e.d_id = d.id
AND e.id = 4;

3、resultMap关联查询

== 一定要注意的是:association使用的是javaType,collection使用的是ofType,如果他们使用的是分步查询,那么这两个属性都不需要写 ==

使用assocition映射封装(多对一)javaType

(不使用外键情况下)

<resultMap id="EmployeeMap" type="Employee">
<id column="id" property="id"/>
<result column="last_name" property="lastName"/>
<result column="gender" property="gender"/>
<result column="email" property="email"/>
<!--property为联级类的名字,javaType为联级类的类别-->
<association property="department" javaType="Department">
<id column="did" property="id"/>
<result column="dept_name" property="departmentName"/>
</association>
</resultMap> <select id="getEmployeeList" resultMap="EmployeeMap">
select e.id,e.last_name,e.gender,e.email,d.id did,d.dept_name
from tbl_employee e,tbl_dept d
where e.d_id = d.id;
</select>

使用assocition分步查询(多对一)

查询员工时把员工的部门也查询出来

主要使用在数据查询很大的时候:

  • 分布查询可以做到使用现有接口方法来达到实现封装的目的
  • 分布查询可以实现延时加载,节省资源
<!--使用resultMap分步查询-->
<!--1、先按照员工id查询员工信息
2、根据员工信息中的d_id值去查出部门信息
3、部门设置到员工中
-->
<resultMap id="EmployeeMapStep" type="Employee">
<id column="id" property="id"/>
<result column="last_name" property="lastName"/>
<result column="gender" property="gender"/>
<result column="email" property="email"/>
<!--association定义关联对象的封装规则、
select:指明当前属性是调用哪个方法查出的结果
column:指定将哪一列的值传给方法 流程:使用select指定的方法(传入column指定的值)查除对象,把地址赋值给原来封装对象的相关属性
-->
<association property="department"
select="com.wang.Dao.DepartmentMapper.getDepartmentById"
column="d_id"/>
</resultMap>
<!-- Employee getEmployeeById(Integer id);-->
<select id="getEmployeeById" resultMap="EmployeeMapStep">
select * from tbl_employee where id =#{id};
</select>

使用collection实现映射封装(一对多)ofType

查询部门的时候把部门内包含的员工也查询出来

接口:

public interface DepartmentMapper {

    Department getDepartmentById(Integer id);

}

bean类

private int id;
private String departmentName;
private List<Employee> employeeList;

Mapper配置文件中

<resultMap id="DepartmentMap" type="Department">
<id column="did" property="id"/>
<result column="dept_name" property="departmentName"/>
<!--collection定义关联集合类型的封装规则-->
<!--我们需要把用did查询到的数据封装成Lst对像-->
<!--
property:属性名称
ofType:指定集合里面的元素
-->
<collection property="employeeList" ofType="Employee">
<!--定义这个集合元素中的封装规则-->
<id column="eid" property="id"/>
<result column="gender" property="gender"/>
<result column="last_name" property="lastName"/>
<result column="email" property="email"/>
</collection>
</resultMap>
<select id="getDepartmentById" resultMap="DepartmentMap">
select d.id did,d.dept_name,e.id eid,e.last_name,e.gender,e.email
from tbl_dept d
left join tbl_employee e
on d.id = e.d_id
where d.id = #{id};
</select>

在分布查询基础上实现延时加载

之前我们在查询Employee对象时,内部的属性都将被查询出来

单这样将占用大量内存

我们需要做到:部门信息在我们需要的时候再起查询

这个时候我们只需要在分步查询的基础在全局配置上加上两个配置

<!--开启懒加载,在需要的时候才会读取数据 -->
<setting name="lazyLoadingEncoding" value="true"/>
<!--关闭强制加载,即关闭在加载实例的时候就读取全部数据-->
<setting name="aggressiveLazyLoading" value="false"/>

或者:在collection和association标签上加上fetch属性即可

<association property="department"  //不需要oftype属性
select="com.wang.Dao.DepartmentMapper.getDepartmentById"
column="{id = d_id}"
fetchType="lazy"/>
<!--fetchType表示获取数据的方式
lazy:懒加载
eager:立即加载
-->

分步查询拓展-传入多个参数

有时候需要把多个字段值传入调用的方法

做法:将多个字段的值封装成Map传递

注意点:键一定要是传入方法的参数名

column="{id = d_id,name = dept_name}"

4、discriminator鉴别器使用(进行简单的判断操作)

鉴别器:mybatis可以使用discriminator判断某列的值,然后根据某列的值改变封装的行为

现在有这样的需求:

如果查出来是女生,就把部门信息查询出来,否则不查询

如果查出来是男生,就把last_name这一字段的值赋值给email

注意点:case里的javatype或者说javaMap不可或缺,如果加入javaMap则表示在这个case情况下我们调用另外一种sql映射规则

<mapper namespace="com.wang.Dao.EmployeeMapper">
<!-- //获取全部员工的信息-->
<!-- Employee getEmployeeById(int id);-->
<resultMap id="EmployeeMap" type="Employee"> <!--column:指定判定的列名
javaType:列名对应的java类型,注意开头因为经过转换所以为小写-->
<discriminator javaType="string" column="gender">
<!--1是男生-->
<case value="男" resultType="com.wang.Pojo.Employee">
<id column="id" property="id"/>
<result column="email" property="lastName"/>
<result column="gender" property="gender"/>
<result column="last_name" property="email"/>
<!-- <association property="department"
select="com.wang.Dao.DepartmentMapper.getDepartmentByDid"
column="d_id"/>-->
</case>
<!--0是女生-->
<case value="女" resultType="com.wang.Pojo.Employee">
<id column="id" property="id"/>
<result column="last_name" property="lastName"/>
<result column="gender" property="gender"/>
<result column="email" property="email"/>
<association property="department"
select="com.wang.Dao.DepartmentMapper.getDepartmentByDid"
column="d_id"/>
</case>
</discriminator>
</resultMap>

mybatis-5-关联查询的更多相关文章

  1. Mybatis之关联查询

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

  2. SpringBoot+Mybatis实现关联查询

    SpringBoot+Mybatis实现关联查询 今天学习了下Mybatis的动态查询,然后接着上次的Demo改造了下实现表的关联查询. 话不多说,开始今天的小Demo 首先接着上次的项目 https ...

  3. Mybatis之关联查询及动态SQL

    前言 实际开发项目中,很少是针对单表操作,基本都会联查多表进行操作,尤其是出一些报表的内容.此时,就可以使用Mybatis的关联查询还有动态SQL.前几篇文章已经介绍过了怎么调用及相关内容,因此这里只 ...

  4. JavaWeb_(Mybatis框架)关联查询_六

    系列博文: JavaWeb_(Mybatis框架)JDBC操作数据库和Mybatis框架操作数据库区别_一 传送门 JavaWeb_(Mybatis框架)使用Mybatis对表进行增.删.改.查操作_ ...

  5. mybatis一对一关联查询——(八)

    1.需求 查询所有订单信息,关联查询下单用户信息. 注意: 因为一个订单信息只会是一个人下的订单,所以从查询订单信息出发关联查询用户信息为一对一查询.如果从用户信息出发查询用户下的订单信息则为一对多查 ...

  6. Mybatis一对一关联查询

    有两张表,老师表teacher和班级表class,一个class班级对应一个teacher,一个teacher对应一个class 需求是根据班级id查询班级信息(带老师的信息) 创建teacher和c ...

  7. MyBatis学习(四)MyBatis一对一关联查询

    一对一关联查询即.两张表通过外键进行关联.从而达到查询外键直接获得两张表的信息.本文基于业务拓展类的方式实现. 项目骨架 配置文件conf.xml和db.properties前几节讲过.这里就不细说了 ...

  8. SSM-MyBatis-15:Mybatis中关联查询(多表操作)

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 先简单提及一下关联查询的分类 1.一对多 1.1单条SQL操作的 1.2多条SQL操作的 2.多对一 2.1单 ...

  9. Mybatis的关联查询(一)

    一对一的关联查询 一.使用resultType进行输出映射   1. 创建一个新的PO类,由于要将查询出来的属性映射到新的PO类.所有该PO类中应该有查询出来的所有列对应的属性. //定义新的PO类, ...

  10. MyBatis的关联查询

    关联映射的一对多 //查询经理角色 以及 该角色下对应的员工集合 public SmbmsRole getRoleAndUser(Integer id); <resultMap id=" ...

随机推荐

  1. Python分析离散心率信号(下)

    Python分析离散心率信号(下) 如何使用动态阈值,信号过滤和离群值检测来改善峰值检测. 一些理论和背景 到目前为止,一直在研究如何分析心率信号并从中提取最广泛使用的时域和频域度量.但是,使用的信号 ...

  2. 实验7、Django VS Flask VS Node:如何选择

    实验介绍 1. 实验内容 在本教程中,我们将详细介绍Django和Flask之间的比较.Flask和Django是基于Python的Web开发框架.许多正在朝着轻型微框架发展.这些框架敏捷,灵活,小巧 ...

  3. SpringCloud、Nginx高并发核心编程 【2020年11月新书 】

    文章太长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典极品 : 三大本< Java 高并发 三部曲 > 面试 + 大厂 + 涨薪必备 疯狂创客圈 经 ...

  4. Mybatis中9种经典的设计模式!你知道几个?

    虽然我们都知道有23个设计模式,但是大多停留在概念层面,真实开发中很少遇到.Mybatis源码中使用了大量的设计模式,阅读源码并观察设计模式在其中的应用,能够更深入的理解设计模式. Mybatis至少 ...

  5. Mybatis学习01:利用mybatis查询数据库

    通过mybatis来操作mysql数据库的步骤大致可分为以下几步: 在这里,我们以对下面这个这个表格进行操作为例: 表名:ssm 1 配置依赖 在pom.xml中添加所需要的的依赖 <!-- m ...

  6. CMD批处理(1)——批处理常用命令总结

    echo 打开回显或关闭回显功能,或显示消息.如果没有任何参数,echo命令将显示当前的回显设置. 命令格式1:echo [{on|off}] 命令格式2:echo [message]   例.在命令 ...

  7. JavaScript的核心语法

    1.JavaScript同其他程序设计语言一样,有着独特的语法结构,主要包含:变量.数据类型.运算符号.控制语句和注释等. 2.变量是存储数据的基本单位,JavaScript通常利用变量来参与j各种运 ...

  8. 用vue ui创建的项目怎么关闭eslint校验

    在Vue Cli的控制面板找到配置-ESLint configuration,然后关闭保存时检查就可以了

  9. NoSql非关系型数据库之MongoDB应用(三):MongoDB在项目中的初步应用

    业精于勤,荒于嬉:行成于思,毁于随. 我们可以结合相关的IDE做一个简单的增删改查了,实现MongoDB在项目中的初步应用. 前提是安装了MongoDB服务和MongoDB可视化工具,没有安装的可以点 ...

  10. redis-list实现

    Redis 数据结构---链表 Redis的list底层实现使用的不是数组而是链表的数据结构 叫listnode  是一个双向链表 ListNode{ Struct listNode *prev  / ...