Mybatis的关联映射
实际的开发中,对数据库的操作常常会涉及到多张表,这在面向对象中就涉及到了对象与对象之间的关联关系。针对多表之间的操作,MyBatis提供了关联映射,
通过关联映射就可以很好的处理对象与对象之间的关联关系。
1.1 关联关系概述
在关系型数据库中,多表之间存在着三种关联关系,分别为一对一、一对多和多对多,如下图所示:
三种关系如下:
一对一:在任意一方引入对方主键作为外键。
一对多:在“多”的一方,添加“一”的一方的主键作为外键。
多对多:产生中间关系表,引入两张表的主键作为外键,两个主键成为联合主键或使用新的字段作为主键。
在Java中,通过对象也可以进行关联关系描述,如图下图所示:
一对一的关系:就是在本类中定义对方类型的对象,如A类中定义B类类型的属性b,B类中定义A类类型的属性a。
一对多的关系:就是一个A类类型对应多个B类类型的情况,需要在A类中以集合的方式引入B类类型的对象,在B类中定义A类类型的属性a。
多对多的关系:在A类中定义B类类型的集合,在B类中定义A类类型的集合。
1.2 一对一
在现实生活中,一对一关联关系是十分常见的。例如,一个人只能有一个身份证,同时一个身份证也只会对应一个人
<resultMap>元素中,包含了一个<association>子元素,MyBatis就是通过该元素来处理一对一关联关系的。
在<association>元素中,通常可以配置以下属性:
property:指定映射到的实体类对象属性,与表字段一一对应;
column:指定表中对应的字段;
javaType:指定映射到实体对象属性的类型;
select:指定引入嵌套查询的子SQL语句,该属性用于关联映射中的嵌套查询;
fetchType:指定在关联查询时是否启用延迟加载。该属性有lazy和eager两个属性值,默认值为lazy(即默认关联映射延迟加载)。
MyBatis加载关联关系对象主要通过两种方式:嵌套查询和嵌套结果。
嵌套查询:嵌套查询是通过执行另外一条SQL映射语句来返回预期的复杂类型。
嵌套查询是在查询SQL中嵌入一个子查询SQL; 嵌套查询会执行多条SQL语句; 嵌套查询SQL语句编写较为简单;
嵌套结果:嵌套结果是使用嵌套结果映射来处理重复的联合结果的子集。
嵌套结果是一个嵌套的多表查询SQL; 嵌套结果只会执行一条复杂的SQL语句; 嵌套结果SQL语句编写比较复杂;
虽然使用嵌套查询的方式比较简单,但是嵌套查询的方式要执行多条SQL语句,这对于大型数据集合和列表展示不是很好,
因为这样可能会导致成百上千条关联的SQL语句被执行,从而极大的消耗数据库性能并且会降低查询效率。
使用<association>元素进行一对一关联映射非常简单,只需要参考如下两种示例配置即可。
- 嵌套查询,property指的是类属性,column指的是表字段,select表示嵌套的子查询,javaType表示关联属性类型。
<association property="card" column="card_id"
javaType="com.itheima.po.IdCard" select="com.itheima.mapper.IdCardMapper.findCodeById" />
- 嵌套结果,property指的是类属性,column指的是表字段,javaType表示关联属性类型。
<association property="card" javaType="com.itheima.po.IdCard">
<id property="id" column="card_id" />
<result property="code" column="code" />
</association>
1.3 一对多
开发人员接触更多的关联关系是一对多(或多对一)。例如,一个用户可以有多个订单,同时多个订单归一个用户所有。
<resultMap>元素中,包含了一个<collection>子元素,MyBatis就是通过该元素来处理一对多关联关系的。
<collection>子元素的属性大部分与<association>元素相同,但其还包含一个特殊属性--ofType 。
- ofType:ofType属性与javaType属性对应,它用于指定实体对象中集合类属性所包含的元素类型。
<collection>元素的使用也非常简单,同样可以参考如下两种示例进行配置,具体代码如下:
- 嵌套查询,property指的是类属性,column指的是表字段,select表示嵌套的子查询,ofType表示关联的集合类属性类型。
<collection property="ordersList" column="id" ofType="com.itheima.po.Orders"
select=" com.itheima.mapper.OrdersMapper.selectOrders" />
- 嵌套结果,property指的是类属性,column指的是表字段,ofType表示关联的集合类属性类型。
<collection property="ordersList" ofType="com.itheima.po.Orders">
<id property="id" column="orders_id" />
<result property="number" column="number" />
</collection>
1.3 多对多
在实际项目开发中,多对多的关联关系也是非常常见的。以订单和商品为例,一个订单可以包含多种商品,而一种商品又可以属于多个订单
在数据库中,多对多的关联关系通常使用一个中间表来维护,中间表中的订单id作为外键参照订单表的id,商品id作为外键参照商品表的id。
在MyBatis中,多对多的关联关系查询,同样可以使用前面介绍的 <collection>元素进行处理(其用法和一对多关联关系查询语句用法基本相同)。
小结
主要学习了MyBatis中的数据表之间以及对象之间的关联关系,以及MyBatis框架中对关联关系的处理。
以上内容是根据Java EE企业级应用开发教程(Spring+Spring MVC+MyBatis)做的一些笔记和总结。
最新文章
- cf515d
- 关于window.showModalDialog的一些配置
- 预定义指令之debug
- 2016北京PHP39期 ThinkPHP Discuz Dedecms 微信开发视频教程
- FMDB数据库中的一些操作
- 北大ACM(POJ1003-Hangover)
- BZOJ2293: 【POJ Challenge】吉他英雄
- iOS获取网络时间与转换格式
- matlab错误:Subscript indices must either be real positive integers or logicals.
- LOJ #6050. 「雅礼集训 2017 Day11」TRI
- VMware Workstation Pro下载密钥
- asp.net core系列 26 EF模型配置(实体关系)
- Xaml引用图片路径的方式
- 剑指offer编程题Java实现——面试题7相关题用两个队列实现一个栈
- windows 自动移动maven jar包到jmeter 文件夹下面
- iptables相关操作以及简单理解端口和服务之间关系
- Python.__getattr__Vs__getattribute__
- 《剑指offer》— JavaScript(23)二叉搜索树的后序遍历序列
- JDK常用命令
- Cardboard Talk02 Accelerometer
热门文章
- 安装svn测试环境
- Android开发-eclipse+phonegap(Cordova)环境搭建
- NYOJ--69
- Codeforces Round #546 (Div. 2) ABCDE 题解
- 前端PHP入门-020-重点日期函数之获取时期时间信息函数
- [线索二叉树] [LeetCode] 不需要栈或者别的辅助空间,完成二叉树的中序遍历。题:Recover Binary Search Tree,Binary Tree Inorder Traversal
- struts2验证规则validation配置文件命名方式总结
- 多例模式,保证实例的唯一性,仅适用于form窗体
- IO流-文件的写入和读取
- 51nod 1073 约瑟夫环