mybatis plus 多表查询_JAVA SE之 MyBatis实现多表查询

1ff60a440cf2b1c7c85b1579adf98ad9.png

二、 MyBatis实现多表查询

前面已经使用MyBatis完成了对Emp表的CRUD操作,不管是使用SqlSession直接操作,还是使用Mapper代理方式,都只是完成了对单个数据库表的操作。这肯定是远远不够的。

在实际开发中,经常会将来自多张表的数据在一个位置显示。比如查询并显示的员工信息中会有来自部门表、岗位表的数据,而后台一般是定义一个方法:

2.1关联查询

2.1.1手动处理映射关系resultMap

实体类

public 

映射文件

<

测试代码

SqlSession 

数据准备: 创建项目表和项目记录表

项目表

933dafb51e23e12230991839ede4ffb0.png

项目记录表

14eb3f6170303d2c28f89cc5b56ecf34.png

sql语句

CREATE 

一对一 学生和学生证 人和身份证

一对多 部门和员工 一个部门内有多个员工

多对多 员工和项目 一个员工参与了多个项目 一个项目可以由多个员工参与

926e9afd05effe0d545e16c9c81abfee.png

2.1.2一对一关联查询

需求:根据编号查询员工信息及所在的部门信息

实体类添加一个部门作为属性

public 

接口

public 

映射文件

<

测试代码

SqlSession 

2.1.3一对多关联查询

根据部门号查询部门信息及该部门的所有员工信息

实体类

public 

接口

public 

映射文件

<

测试代码

SqlSession 

2.1.4多对多关联查询

员工表 项目表

多 多

员工表 项目记录表 项目表

1>>>>>>多 多<<<<<<1

多对多转换成两个一对多

1根据编号查询员工做过哪些项目

实体类

public class Projects implements Serializable {private Integer pid;private String pname;private Integer money;

public 

接口

Emp 

映射文件

<

测试代码

SqlSession 

2924b9b7fb34545b4dea4ad53dd90549.png

2根据编号查询项目有哪些员工参与过

实体类

public 

接口

public 

映射文件

<

测试代码

SqlSession 

2.2级联查询

级联查询,顾名思义,就是利于数据库表间的外键关联关系进行自动的级联查询操作。使用MyBatis实现级联查询,除了实体类增加关联属性外,还需要在映射文件中进行配置。

2.2.1积极加载

功能1:查询10号部门及其该部门员工信息。一对多

将一个多表关联查询转换成多个单表查询

第一步:查询N号部门信息 部门表

第二部:查询部门号为N的员工信息 员工表

实体类

public 

接口

接口1

public 

mapper映射文件

EmpMapper映射文件

测试代码

SqlSession 

2.2.2延迟加载

延迟加载,又称按需加载。延迟加载的内容等到真正使用时才去进行加载(查询)。多用在关联对象或集合中。

延迟加载的好处:先从单表查询、需要时再从关联表去关联查询,大大降低数据库在单位时间内的查询工作量,将工作在时间上的分配更加均匀,而且单表要比关联查询多张表速度要快。

延迟加载的设置

第一步:全局开关:在mybatis.xml中打开延迟加载的开关。配置完成后所有的association和collection元素都生效

<

lazyLoadingEnabled:是否开启延迟加载。是Mybatis是否启用懒加载的全局开关。当开启时,所有关联对象都会延迟加载。特定关联关系中可通过设置fetchType属性来覆盖该项的开关状态

aggressiveLazyLoading:当开启时,任何方法的调用都会懒加载对象的所有属性。否则,每个属性会按需加载,

第二步:分开关:指定的association和collection元素中配置fetchType属性。eager:表示立刻加载;lazy:表示延迟加载。将覆盖全局延迟设置

优点:

延迟加载可以根据用户的需要动态的决定查询数据的时机. 可以将查询的工作量在时间上分散. 减少单位时间内对于数据库的查询次数.进而减少了数据库单位时间内的运算压力,提高数据库的相应速度.级联查询将一个多表关联查询转换成多个单边查询,sql语句变得简单了,单次单表查询比单次表查询效率更高,相应速度更快

级联查询缺点:

关联查询转换成级联查询,由原来的一次查询,转换成多次查询,查询次数增多,工作总量是增加的. 延迟加载可以简单理解为是级联查询的一种优化策略

2.2.3多表查询总结与扩展

resultMap中的常见属性

d528d52196a2f98620707b6fdef735c0.png

级联查询和多表查询的比较及其选择

fd8b6cd749f978fb4485ef1ed5cb6a87.png

ResultType和ResultMap使用场景

1) 如果你做的是单表的查询并且封装的实体和数据库的字段一一对应 resultType

2) 如果实体封装的属性和数据库的字段不一致 resultMap

3) 使用N+1级联查询的时候 resultMap

4) 使用的是多表的连接查询 resultMap

一对一关联映射的实现

1) 实例:学生和学生证、雇员和工牌

2) 数据库层次:主键关联或者外键关联(参看之前内容)

3) MyBatis层次:在映射文件的设置双方均使用association即可,用法相同

多对多映射的实现

1) 实例:学生和课程、用户和角色

2) 数据库层次:引入一个中间表将一个多对多转为两个一对多

3) MyBatis层次

方法1:在映射文件的设置双方均使用collection即可,不用引入中间类

方法2:引入中间类和中间类的映射文件,按照两个一对多处理

自关联映射

1) 实例:Emp表中的员工和上级。一般是一对多关联

2) 数据库层次:外键参考当前表的主键(比如mgr参考empno)

3) MyBatis层次:按照一对多处理,但是增加的属性都写到一个实体类中,增加的映射也都写到一个映射文件中

作业

1. 多对多关联映射查询

预备:创建数据库表用户表、角色表、用户角色表并添加测试数据

功能1:查询所有学生及其选课信息(Student中含所选择的Course信息)

功能2:查询某一门课程及其选课的学生(Course中含选这门课的Student信息)

使用级联查询和多表连接查询分别完成

2. 自关联映射查询

以Emp为例完成功能

查询7839的所有直接下级员工

查询员工scott及其上级的姓名、岗位

使用级联查询和多表连接查询分别完成

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值