Mybatis关联映射

Mybatis关联映射的用途:

在实际的开发过程中,对于数据库的操作除了单表外往往会涉及到多张表,这些操作在面向对象中就涉及到了对象与对象之间的关联关系。针对多表之间的操作,MyBatis提供了关联映射,通过关联映射就可以很好的处理对象与对象之间的关联关系。

关联关系的种类:

在关系型数据库中,多表之间存在着三种关联关系,分别为一对一(1:1)、一对多(1:N)和多对多(M:N)。

一对一(1:1):在任意一方引入对方主键作为外键。

一对多(1:N):在“多”的一方,添加“一”的一方的主键作为外键。

多对多(M:N):产生中间关系表,引入两张表的主键作为外键,两个主键成为联合主键或使用新的字段作为主键。

在java中也可以通过对象进行关联关系的描述

一对一(1:1):在本类中定义对方类型的对象

一对多(1:N):一个A类类型对应多个B类类型的情况,需要在A类中以集合的方式引入B类类型的对象,在B类中定义A类类型的属性a

多对多(M:N):在A类中定义B类类型的集合,在B类中定义A类类型的集合

一对一的关联关系:

<resultMap> 元素表示的是结果映射集,是 MyBatis 中最重要也是最强大的元素,主要是用来定义映射规则、级联的更新以及定义类型转化器等。

而在<resultMap>元素中,包含了一个<association>子元素,MyBatis就是通过该元素来处理一对一关联关系的。

在<association>子元素中可以配置以下属性:

Property:指定映射到的实体类对象属性,与表字段一一对应

Column:指定表中对应的字段

javaType:指定映射到实体对象属性的类型

Select:指定引入嵌套查询的子SQL语句,该属性用于关联映射中的嵌套查询

fetchType:指定在关联查询时是否启用延迟加载。

MyBatis加载关联关系对象的两种方式:

嵌套查询:嵌套查询是通过执行另外一条SQL映射语句来返回预期的复杂类型

嵌套结果:嵌套结果是使用嵌套结果映射来处理重复的联合结果的子集

二者的区别:

嵌套查询

嵌套结果

嵌套查询是在查询 SQL 后再进行一个(子)查询

嵌套结果是一个多表查询的 SQL 语句

会执行多条 SQL 语句

只有一条复杂的 SQL 语句(多表连接)

SQL语句编写较为简单

SQL语句编写较为复杂

嵌套查询的方式比较简单,但嵌套查询的方式要执行多条SQL语句,这种方式对于大型数据集合和列可能会导致成百上千条关联的SQL语句被执行,极大的消耗数据库性能并降低查询效率。

解决方法:MyBatis的延迟加载在一定程度上可以降低运行消耗并提高查询效率。因为在MyBatis默认没有开启延迟加载所以需要在核心配置文件中添加一些配置。如下图:

使用<association>元素进行一对一关联映射配置

嵌套查询:

<association property="card" column="card_id"

javaType="com.itheima.po.IdCard"                 ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        select="com.itheima.mapper.IdCardMapper.findCodeById" />

嵌套结果:

<association property="card" javaType="com.itheima.po.IdCard">

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

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

</association>

一对多的关联关系:

同样在<resultMap>元素中,包含了一个<collection>子元素,MyBatis通过该元素来处理一对多关联关系。

<collection>子元素的属性与<association>元素大致相同,但<collection>包含一个特殊属性ofType,它用于指定实体对象中集合类属性所包含的元素类型。

配置:

嵌套查询:

<collection property="ordersList" column="id" ofType="com.itheima.po.Orders"

select=" com.itheima.mapper.OrdersMapper.selectOrders" />

嵌套结果:

<collection property="ordersList" ofType="com.itheima.po.Orders">

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

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

</collection>

Mybatis注解

MyBatis的注解方式就是将SQL语句直接写在接口上。

MyBatis注解SQL中,最基本的是@Select、@Insert、@Update、@Delete这四种。

MyBatis注解

优点:对于需求比较简单的系统,效率高。

缺点:当SQL有变化时都需要重新编译代码

@Select注解:实现查询功能

@Select("Select * from user")

@Results({

@Result(id = true, column = "id", property = "id"),

@Result(column = "name", property = "name"),

@Result(column = "sex", property = "sex"),

@Result(column = "age", property = "age")

})

List<User> queryAllUser();

@Insert注解:实现插入功能

@Insert("insert into user(name,sex,age) values(#{name},#{sex},#{age}")

int saveUser(User user);

@Update注解:实现更新功能

@Update("update user set name= #{name},sex = #{sex},age =#{age} where id = #{id}")

void updateUserById(User user);

@Delete注解:实现删除功能

@Delete("delete from  user  where id =#{id}")

void deleteById(Integer id);

Mybatis关联映射;Mybatis注解相关推荐

  1. MyBatis关联映射例题

    在确保可运行项目能够正确无误地运行之后,再严格照着教程的步骤,对代码模仿一遍.模仿过程难免代码有出入,导致无法得到期望的运行结果,此时此刻通过比较正确答案 ( 可运行项目 ) 和自己的代码,来定位问题 ...

  2. MyBatis 关联映射

    在实际的开发中,对数据库的操作常常会涉及到多张表,这在面向对象中就涉及到了对象与对象之间的关联关系.针对多表之间的操作,MyBatis提供了关联映射,通过关联映射就可以很好的处理对象与对象之间的关联关 ...

  3. 三分钟带你了解mybatis关联映射(案例分析一对一,多对多)

    ------------------------------------------------原创不易,如若喜欢,请点一点赞吧!----------------------------------- ...

  4. MyBatis关联映射:一对一、一对多

    一.一对一 场景:生活中每一个人都有一个身份证,这是最简单的一对一的关系. (1)用户表 (2)身份证表 (3)用户实体对象,com.xuliugen.mybatis.demo.bean.User ( ...

  5. MyBatis 3(4)关联映射:一对一,一对多

    MyBatis 关联映射 MyBatis 中对一对一,一对多的关联映射关系的配置方式是比较简单的,只需要在 XML 实体映射文件中进行相应的简单配置即可: 以下完整示例代码地址:https://git ...

  6. MyBatis的关联映射之 一对一(嵌套查询/嵌套结果)

    关联映射概述 在实际的开发中,对数据库的操作常常会涉及多张表,这在面向对象中就涉及了对象与对象之间的关联关系 针对多表之间的操作, MyBatis 提供了关联映射,通过关联映射就可以很好地处理对象与对 ...

  7. 第4章 MyBatis的关联映射和缓存机制

    目录/Contents 第4章 MyBatis的关联映射和缓存机制 学习目标 了解数据表之间的三种关联关系 了解对象之间的三种关系 熟悉关联关系中的嵌套查询和嵌套结果 掌握一对一关联映射 掌握一对多关 ...

  8. Mybatis注解实现一对多关联映射(@Many)

    mybatis注解实现一对多关联映射 @Select("<script> \n" +"\t\tselect a.*,p.punishment_money, p ...

  9. MyBatis使用resultMap自定义映射规则与关联映射

    一.写在前面 在MyBatis 的全局配置文件中我们可以通过在settings标签中设置 <setting name="mapUnderscoreToCamelCase" v ...

最新文章

  1. linux mysql 1045 错误_Linux 下,mysql数据库报无法登陆错误:ERROR 1045 (28000): Access denied for use...
  2. Java 8系列之重构和定制收集器
  3. 牛客 - 点对最大值(树的直径)
  4. sprintboot 配置文件上传大小(默认是1MB)
  5. 查询链接服务器信息,如何通过 SQL Server 链接服务器和分布式查询使用 Excel
  6. 数据结构之树与二叉树的应用:哈夫曼树(最优二叉树)
  7. 配图做设计、找图找灵感交给素材路SUCAI63
  8. java单例模式 三种_三种java单例模式概述
  9. 【路径规划】基于matlab改进的遗传算法栅格地图路径规划【含Matlab源码 525期】
  10. IDM下载器插件 让浏览器不在限速
  11. graphx项目实战 — 航班飞行网图分析
  12. 20212022最新Web前端经典面试试题及答案-史上最全前端面试题(含答案)、前端面试题大全、前端进阶必知必会知识点1
  13. Docker进阶实战
  14. OpenStack资源整理(转自陈沙克)
  15. Holt-Winters 季节方法
  16. 2021-10-11 今日总结
  17. Git 每次提交都需要输入密码
  18. Kaprekar constant(卡普雷卡尔黑洞)
  19. 【STM32存储器映射-寄存器基地址-偏移】
  20. COGS1487 麻球繁衍

热门文章

  1. 小米/红米手机,给软件设置root权限(红米5 plus为例)
  2. 分层图池化:Hierarchical Graph Representation Learning with Differentiable Pooling
  3. FPC加孔背胶平刀模切工艺介绍
  4. 让你学会之后就能上手做项目的70个python小项目
  5. 记OPNsense防火墙的安装过程 - 安全
  6. 电脑换IP工具派克斯和PPTP区别
  7. Layer-msg图标
  8. matplotlib 设置坐标轴显示内容
  9. 拾人牙慧 在C#中如何解决SQL注入攻击
  10. linux大于3T硬盘多个分区,linux如何分大于2T的磁盘分区