Mybatis(四) 高级映射,一对一,一对多,多对多映射
天气甚好,怎能不学习?
一、单向和双向
包括一对一,一对多,多对多这三种情况,但是每一种又分为单向和双向,在hibernate中我们就详细解析过这单向和双向是啥意思,在这里,在重复一遍,就拿一对多这种关系来讲,比如有员工和部门,一个部门中有多个员工,从部门方看,是一对多关系,而多名员工属于一个部门,是多对一关系,那么如果我们的业务需求只需要通过部门查找到所有的员工,那么我们就只需要进行单向一对多的映射,如果我们需要通过员工来查询出对应的部门,那么我们就需要进行单向多对一的映射,而如果我们这两个业务需求都需要实现,也就是不管从哪一方进行查找,都需要能够找到对方,那么此时就应该编写双向一对多或者双向多对一(双向一对多和双向多对一是一样的意思)。所以,不管是编写哪一种,都是根据业务需求来进行决策的。这就是单向和双向的意思。
什么是多对多?
多对多就是不管从哪一方看,都是一对多,那么该关系就是多对多。比如学生跟选修课之间,从学生方看,一个学生能选多门选修课,一对多关系,从选修课之间,一门选修课可以被多个学生选择,也是一对多关系,那么学生跟选修课就是多对多关系。多对多关系之间都会由第三张表来表示这种关系。而不会相互设置外键。
二、测试环境
三、一对一映射
有了上面这个关系图,那我们测试就好做多了,就拿orders 和user来测试,从orders方看向user方,就是一对一映射。也就是单向一对一,只需要根据orders能找出user即可。
两种方案,映射文件中输出映射使用resultType和resultMap。这里只关注映射文件,全局配置文件就不多说了,还是老样子的配置
3.1、使用resultType
UserMapper.xml
UserExt.java
因为需要在查询orders时,将对应的user也查询出来,那么使用resultType的话,就需要创建一个OrdersExt,将user和orders中的属性合并在一起,形成一个新的pojo。这样就能够将查询出来的记录都映射到该pojo上了
3.2、使用resultMap
usermapper.xml
resultMap
使用resultMap的话就不需要构造一个新的pojo,只需要将查询出来的记录的值通过resultMap帮我们映射到指定到哪个pojo的哪个属性上即可。
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE mapper 3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 5 <mapper namespace="com.wuhao.onetoone.resultMap.UserMapper"> 6 <!-- 7 resultMap 8 type:返回对象类型。全限定名,如果使用了typeAliases设置别名,则可以使用别名 9 id:唯一标识,供下面使用 10 id标签:唯一标识位,也就是主键。 11 column:从数据库中查询出来的列名。有时候会使用别名,主要看sql语句返回的列名是什么 12 property:对应返回对象中属性名 13 result标签:映射普通属性 14 column和property跟上面一样的功能 15 --> 16 <resultMap type="com.wuhao.onetoone.resultMap.Orders" id="findOrdersAndUserReM"> 17 <id column="oid" property="id"/> 18 <result column="number" property="number"/> 19 <result column="user_id" property="userId"/> 20 <result column="createtime" property="createtime"/> 21 <!-- 用户信息, 22 association:一对一映射 23 property:把关联查询的一对一的信息封装到哪个对象属性上 24 javaType:property属性的类型 25 其他的什么id,result标签都跟上面的一样。 26 --> 27 <association property="user" javaType="com.wuhao.onetoone.resultMap.User"> 28 <id column="uid" property="id"/> 29 <result column="username" property="username"/> 30 <result column="sex" property="sex"/> 31 </association> 32 </resultMap> 33 34 <!-- 35 使用resultMap就能够解决这种麻烦,因为resultMap能进行高级映射,说是高级映射,其实就是可以将查询出来的列表映射到特定 36 的属性上去。 37 使用resultMap之后,就会知道resultType的区别在哪里了 38 resultType:简单一些,是一种平铺式的映射,不用层级式映射用这个比较好。需要什么查什么 39 resultMap:比较繁琐,是一种层级式的映射,在企业中如果没有特殊要求,建议使用resultType来完成一对一映射, 40 --> 41 <select id="findOrdersAndUserByOid" parameterType="int" resultMap="findOrdersAndUserReM"> 42 SELECT 43 orders.id oid, 44 orders.number, 45 orders.user_id, 46 orders.createtime, 47 user.id uid, 48 user.username, 49 user.sex 50 FROM orders,user WHERE orders.id = #{id} AND orders.user_id = user.id 51 </select> 52 53 54 </mapper>
View Code
3.3、小总结
现在应该认识到了resultMap和resultType的区别,需要知道resultMap中一对一映射时是怎么编写这种映射关系的。
上面所侧重的重点在映射文件statement的编写,
四、一对多映射
查询订单信息,关联查询它的订单明细信息,orders --》 ordersdetail。 单向一对多关系,一个订单有多个订单项。
4.1、使用resultType
使用resultType也可以,按照前面的学习,需要构建一个新的pojo,其中包含了订单项属性和orders属性。这个很简单,而且都会做,就不多说了,主要说说使用resultMap的用法。
4.2、使用resultMap
其中注意resultMap中的extends的用法,继承一个resultMap,就把其中的所有配置都继承过来了,所以这里只需要编写一个collection,映射ordersdetail集合。
pojo类中应该多了一个这个东西
这里主要是关注,一对多时,resultMap中是如何实现的。使用collection。
五、多对多映射
查询用户信息,以及它所购买的商品信息 user --》 items
主表:user
从表:orders、orderdetail、items
也就是通过查询某个user,查找到orders,通过orders查找到orderdetail,通过orderdetail查找到items。
pojo
一个用户拥有多个订单
一个订单可以拥有多个订单明细
一个订单明细对应一个商品
usermapper.xml
通过上面pojo和sql语句,可以知道,我们写的resultMap看起来好像需要很复杂,其实不然,一步步一层层进行编写,也不难。
如果是一对多关系,那么就使用collection,如果是一对一,那么就使用association,先写user到orders,然后在写orders中的orderdetail,等等,这样一层层嵌套进去,也很明了。不难懂。
六、总结
6.1、resultType和resultMap都可以完成高级结果映射
如果没有特殊要求,使用resultType方便
6.2、resultType和resultMap 的一个主要区别就是要应用场景不同
resultType主要是查询明细使用
resultMap主要是层级查询使用,比如查询用户信息,如何点击查询订单,再去查询订单信息
resultMap可以实现延迟加载,而resultType没有该功能
6.3、延迟加载就是我们下一章节要说的东西,这里就需要注意,resultMap菜可以实现延迟加载,那么什么是延迟加载呢?比如上面一对一关系中,通过orders查询到对应的user,当没有使用到user时,那么orders是不会查询出user的,等当使用user时,才会进行查询加载,这就是延迟加载,也称为懒加载,具体下一节讲解。下一节还会讲解一级缓存,二级缓存的问题。
Mybatis(四) 高级映射,一对一,一对多,多对多映射相关推荐
- 7. MyBatis多表查询 - 一对一 - 一对多 - 多对多
7. MyBatis多表查询 - 一对一 - 一对多 - 多对多 前言 在前面的篇章,我们已经熟悉了单表查询,下面我们来看看如何进行 多表查询. 数据准备 create database if not ...
- Mybatis中的关系映射(一对一,一对多,多对多)
在网上寻了很久,大多数讲关系性的文章都是大篇幅的去将表照搬上来,本来就很生硬,此文就不在讲述关系性映射的具体实现,转而从浅层来讲讲其概念性. 1.1 关联关系概述 在关系型数据库中,多表之间存在着三种 ...
- Hibernate关联关系映射-----双向一对多/多对一映射配置
转自:http://blog.csdn.net/yifei12315/article/details/6985194 /// Hibernate: /// 双向关联就是有"一对多" ...
- 【Mybatis高级映射】一对一映射、一对多映射、多对多映射
前言 当我们学习heribnate的时候,也就是SSH框架的网上商城的时候,我们就学习过它对应的高级映射,一对一映射,一对多映射,多对多映射.对于SSM的Mybatis来说,肯定也是差不多的.既然开了 ...
- mybatis的一对一 一对多 多对多
mybatis的一对一 一对多 多对多 1.表 2.建表语句 order_t表 CREATE TABLE `order_t` ( `id` int(11) NOT NULL, `user_id` in ...
- SQLAlchemy_定义(一对一/一对多/多对多)关系
SQLAlchemy_定义(一对一/一对多/多对多)关系 目录 Basic Relationship Patterns One To Many One To One Many To Many Basi ...
- Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作
Python进阶----表与表之间的关系(一对一,一对多,多对多),增删改查操作,单表查询,多表查询 一丶表与表之间的关系 背景: 由于如果只使用一张表存储所有的数据,就会操作数 ...
- Mybatis - 一对多/多对一映射
文章目录 前言 项目结构 一.数据库表 1. 员工表 t_emp 2. 部门表 t_dept 二.实体类 1. Emp 员工实体类(添加多对一属性) 2. dept 部门实体类(添加一对多属性) 三. ...
- 高级MyBatis -- resultMap实现联表(一对多,多对一)
前言: 结合实际生活来看联表,拿一个习以为常的例子来说,学生和老师: 多个学生对应一个老师 -- 多对一 (当然是在一个课堂上,嘻嘻) 一个老师对应多个学生 -- 一对多 (同上) 在实际操作时,我们 ...
最新文章
- pip 升级之后提示 bash: /usr/bin/pip3: No such file or directory
- POJ 1038 Bugs Integrated Inc (复杂的状压DP)
- 如何用git命令行上传本地代码到github
- Snapchat - give sum target listInteger first who hits target wins
- Python程序练习题6.2
- python编程软件开发_Python编程对软件开发人员很重要?
- SAP alv 去掉标准按钮
- 常用的HTTP请求头与响应头
- data.frame 转化为数值型_DataFrame(3):DataFrame的创建方式
- Pytorch中model.eval()的作用分析
- DedeCMS自定义表单制作和调用办法
- mui框架 页面无法滚动解决方法
- python基础知识5——赋值与深浅拷贝——整数和字符串,列表元组字典
- php脚本判断页面刷新,javascript判断网页是关闭还是刷新
- 贪心/思维题 UVA 11292 The Dragon of Loowater
- html5游戏技术指标,2019上半年手游指标报告:Day 1留存率低于30%不及格?
- fw300r 虚拟服务器,迅捷FW300R无线宽带路由器怎么开启UPnP
- 计算机断电无法启动不了系统,电脑停电后无法开机怎么办?|电脑停电无法启动的解决方法...
- QML_虚拟键盘使用
- javafx 制作 24点游戏 24点计算器 24点算法
热门文章
- Mac笔记本查看端口
- linux下 添加一个新账户tom,linux 账户管理命令 useradd、groupadd使用方法
- java中调用数组参数_java中如何调用带有数组类型参数的存储过程
- origin和python有什么不同_python爬虫之git的使用(origin说明)
- matlab 删除cell 中的 0 元素
- 安装oracle12c之前,centos7安装oracle12c数据库的坑
- maven打包忽略注解_Maven打包时遇到的一些坑和解决方案
- pwm逆变器matlab仿真,PWM逆变器的Matlab仿真分析.doc
- 【java】方法中参数列表的应用
- redhat rpm 卸载mysql_Linux下卸载MySQL rpm包出现error: specifies multiple packages 解决