【Mybatis高级映射】一对一映射、一对多映射、多对多映射
前言
当我们学习heribnate的时候,也就是SSH框架的网上商城的时候,我们就学习过它对应的高级映射,一对一映射,一对多映射,多对多映射。对于SSM的Mybatis来说,肯定也是差不多的。既然开了头了,我们就也来简单说一些Mybatis的高级映射。当然说到这些东西的时候,最简单也最常用的就是级联查询,所以我们就以几个简单的级联查询为例,分别说一下Mybatis的一对一、一对多、多对多查询。
一、一对一映射
1、需求:
电商类做买卖,用户提交订单后,某宝根据订单信息和客户的姓名、地址派送,现在查询所有的订单信息,关联查询下但用户信息。
(1)首先确定执行的sql语句为:
SELECT orders.*,user.username,userss.address FROM orders,user WHEREorders.user_id = user.id
resultType方式解决这个问题:
(1)定义po类:
public class OrdersCustom extends Orders { //OrdersCustom类继承Orders类后OrdersCustom类包括了Orders类的所有字
段,只需要定义用户的信息字段即可。private String username;// 用户名称private String address;// 用户地址public String getUsername(){return username;}public String setUsername(String username){this.username=username;}…… }
(2)Mapper映射文件:
<!-- 查询所有订单信息 --><select id="findOrdersList" resultType="cn.itcast.mybatis.po.OrdersCustom">SELECTorders.*,user.username,user.addressFROMorders, userWHERE orders.user_id = user.id</select>
(3)定义mapper接口:
public List<OrdersCustom> findOrdersList() throws Exception;
(4)测试:
Public void testfindOrdersList()throws Exception{//获取sessionSqlSession session = sqlSessionFactory.openSession();//获限mapper接口实例UserMapper userMapper = session.getMapper(UserMapper.class);//查询订单信息List<OrdersCustom> list =userMapper.findOrdersList();System.out.println(list);//关闭sessionsession.close();}
使用resultMap解决问题:
(1)定义resultMap:
<!-- 订单信息resultmap___需要关联查询映射的是用户信息,使用association将用户信息映射到订单对象的用户属性中 --> <resultMap type="cn.itcast.mybatis.po.Orders"id="userordermap"> <!-- 这里的id,是mybatis在进行一对一查询时将user字段映射为user对象时要使用,必须写 --> <id property="id" column="id"/> <resultproperty="user_id" column="user_id"/> <resultproperty="number" column="number"/> <associationproperty="user" javaType="cn.itcast.mybatis.po.User"> <!-- 这里的id为user的id,如果写上表示给user的id属性赋值 --> <id property="id" column="user_id"/> <resultproperty="username" column="username"/> <resultproperty="address" column="address"/> </association> </resultMap>
(2)调用resultMap:
<select id="findOrdersListResultMap" resultMap="userordermap">SELECTorders.*,user.username,user.addressFROMorders, userWHERE orders.user_id = user.id </select>
(3)定义mapper接口
一对一查询总结:
个人认为啊,这种情况下使用resultType定义输出映射相对简单,因为这样只需要去添加一个po类就行了,按需求添加额外需要的属性,就可以完成映射。而相对于resultType来说,resultMap就显得稍微麻烦一些了,他需要特别定义resultMap来映射相关联表的实体属性。
二、一对多查询:
1、需求:
继上面的需求,查询所有订单信息及订单下的订单明细信息(一个订单信息下面或有很多商品,这个女生买护肤品的时候应该很有感触吧。所以订单信息与订单明细是一对多的关系)
(1)确定在数据库执行的sql语句:
Select orders.*, user.username, user.address,orderdetail.idorderdetail_id,orderdetail.items_id, orderdetail.items_num FROM orders,user,orderdetail WHERE orders.user_id = user.id AND orders.id = orderdetail.orders_id
执行结果:(2)定义po类:
public class Orders{private Integer id;private Integer userId;private String number;private Date createtime;private String note;private User user;private List<OrderDetial> orderDetails;//getter、setter }
(3)定义resultMap
<!-- 订单信息resultmap --> <resultMaptype="cn.itcast.mybatis.po.Orders"id="userorderdetailmap"> <id property="id"column="id"/> <result property="user_id" column="user_id"/> <result property="number" column="number"/> <association property="user" javaType="cn.itcast.mybatis.po.User"> <id property="id" column="user_id"/> <result property="username" column="username"/> <result property="address" column="address"/> </association> <collectionproperty="orderdetails" ofType="cn.itcast.mybatis.po.Orderdetail"><id property="id" column="orderdetail_id"/><result property="items_id" column="items_id"/><result property="items_num" column="items_num"/> </collection> </resultMap>
大家可以跟上面对比一下,这两个resultMap除了对订单详细的映射定义外,其他的是完全一样的,现在问题来了,我们需要重新定义上面重复的映射信息吗?答案是不用,resultMap具有可继承特性,我们只需要继承上面的resultMap(userordermap),然后只定义别的就可以了,如下:
<resultMaptype="cn.itcast.mybatis.po.Orders" id="userorderdetailmap" extends="userordermap"> <collection property="orderdetails" ofType="cn.itcast.mybatis.po.Orderdetail"><id property="id" column="orderdetail_id"/><result property="items_id" column="items_id"/><result property="items_num" column="items_num"/> </collection> </resultMap>
使用extends来继承订单信息resultmap:userordermap
(4)实现调用:
<selectid="findOrdersDetailList" resultMap="userorderdetailmap">SELECTorders.*,user.username,user.address,orderdetail.id orderdetail_id,orderdetail.items_id,orderdetail.items_numFROM orders,user,orderdetailWHERE orders.user_id = user.idAND orders.id =orderdetail.orders_id </select>
(5)定义mapper接口:
publicList<Orders>findOrdersDetailList () throws Exception;
(6)来测试一下:
Public void testfindOrdersDetailList()throws Exception{//获取sessionSqlSession session = sqlSessionFactory.openSession();//获限mapper接口实例UserMapper userMapper =session.getMapper(UserMapper.class);//查询订单信息List<Orders> list =userMapper.findOrdersDetailList();System.out.println(list);//关闭sessionsession.close();}
这个吧,图没有了,可是可以给大家形容一下,就是返回结果只有四个订单信息,然后每个订单信息里面有两个商品信息list压到这里面。就这样,我们就实现了一对多的查询,为什么这个例子我们不用resultType来执行,其实结果早就给大家了,上面执行sql的结果图,就是返回的信息列表,实际上只有四个订单信息,但是使用resultType会返回8条信息,也就是没有完成去重,还需要我们去手动去重,了然了吗?不是很方便
三、多对多查询
(1)需求:
查询用户购买的商品信息(一个用户可以有N个订单信息,每个订单信息可以有M个商品信息,所以我们需要查询所有的用户信息,关联查询订单及订单明细信息,订单名信息中关联查询商品信息)
(2)确定要执行的sql:
SELECTorders.*,USER.username,USER.address,orderdetail.idorderdetail_id,orderdetail.items_id,orderdetail.items_num,items.nameitems_name,items.detailitems_detail FROMorders,USER,orderdetail,items WHEREorders.user_id= USER .id AND orders.id = orderdetail.orders_id ANDorderdetail.items_id = items.id
(3)po类变化:
在User中添加List<Orders>orders 属性;在Orders类中加入List<Orderdetail> orderdetails属性;Items类,不用动
(4)定义resultMap:
<resultMap type="cn.itcast.mybatis.po.User"id="userOrderListResultMap"><id column="user_id"property="id"/><result column="username"property="username"/><collection property="orders"ofType="cn.itcast.mybatis.po.Orders"><id column="id"property="id"/><result property="number" column="number"/><collection property="orderdetails"ofType="cn.itcast.mybatis.po.Orderdetail"><id column="orderdetail_id" property="id"/><result property="ordersId"column="id"/><result property="itemsId"column="items_id"/><result property="itemsNum"column="items_num"/><association property="items"javaType="cn.itcast.mybatis.po.Items"><id column="items_id" property="id"/><result column="items_name" property="name"/><result column="items_detail" property="detail"/></association></collection></collection> </resultMap>
(5)调用resultMap:
<select id="findUserItemResultMap" resultMap="UserItemResultMap" > select orders.*,user.username,user.sex,user.address,orderdetail.id,orderdetail_id,orderdetail.items_id,orderdetail.items_num,orderdetail.orders_id,item.id item_id,item.name item_name,item.detail item_detail,item.price item_price from orders,user,orderdetail,item where orders.user_id=user.id and orders.id=orderdetail.orders_id and orderdetail.items_id=item.id </select>
到这里,相信大家能看出点端倪来了吧,我们一直都是用<collection></collection>和<association></association>分别对集合和实体进行关联映射,而且它们层层嵌套的方式就跟实体之间层层嵌套的方式一样:user中包含orders,orders中包含orderdetail,orderdetail中包含item。
(6)然后定义mapper接口:
public interface UserMapper { List<User> findUserItemResultMap() throws Exception;}
结果,就请大家自己去动手实验一下吧!
到此,我们的Mybatis高级映射之一对一,一对多,多对多映射就分享完了,期间自己又有点收获,总结一下:
1、resultType:将查询结果按照sql列名pojo属性名一致性映射到pojo中。常见一些明细记录的展示,比如用户购买商品明细,将关联查询信息全部展示在页面时,此时可直接使用resultType将每一条记录映射到pojo中,在前端页面遍历list(list中是pojo)即可。
2、resultMap:使用association和collection完成一对一和一对多高级映射(对结果有特殊的映射要求)。其中association见关联查询信息映射到一个pojo对象中,collection将关联查询信息映射到一个list集合中然而,使用resultType无法将查询结果映射到pojo对象的pojo属性中,根据对结果集查询遍历的需要选择使用resultType还是resultMap。那就要看我们自己的判断力了。
【Mybatis高级映射】一对一映射、一对多映射、多对多映射相关推荐
- Mybatis中的关系映射(一对一,一对多,多对多)
在网上寻了很久,大多数讲关系性的文章都是大篇幅的去将表照搬上来,本来就很生硬,此文就不在讲述关系性映射的具体实现,转而从浅层来讲讲其概念性. 1.1 关联关系概述 在关系型数据库中,多表之间存在着三种 ...
- Hibernate关联关系映射-----双向一对多/多对一映射配置
转自:http://blog.csdn.net/yifei12315/article/details/6985194 /// Hibernate: /// 双向关联就是有"一对多" ...
- hibernate 映射表_Hibernate多对多映射-连接表
hibernate 映射表 Today we will look into Hibernate Many to Many Mapping using XML and annotation config ...
- Hibernate多对多映射 - 连接表
Hibernate多对多映射 - 连接表 今天我们将使用XML和注释配置来研究Hibernate多对多映射.之前我们看过如何在Hibernate中实现One To One和One To Many映射. ...
- Mybatis(四) 高级映射,一对一,一对多,多对多映射
天气甚好,怎能不学习? 一.单向和双向 包括一对一,一对多,多对多这三种情况,但是每一种又分为单向和双向,在hibernate中我们就详细解析过这单向和双向是啥意思,在这里,在重复一遍,就拿一对多这种 ...
- mybatis高级映射(一对一,一对多,多对多)
http://www.cnblogs.com/selene/p/4627446.html 阿赫瓦里 生命对于某些人来说,一直都是美丽的,因为这些人的一生都在为某个梦想而奋斗!!! 博客园 首页 新随笔 ...
- mysql中建立一对多映射_Mybatis中的高级映射一对一、一对多、多对多
学习hibernate的时候,小编已经接触多各种映射,mybatis中映射有到底是如何运转的,今天这篇博文,小编主要来简单的介绍一下mybatis中的高级映射,包括一对一.一对多.多对多,希望多有需要 ...
- 2.4.3 Mybatis 高级查询, 复杂映射, 返回主键, 动态SQL if, set, foreach, 核心配置文件深入,plugins标签, 多表查询, 嵌套查询
目录 Mybatis 复杂映射&配置文件深入 一 Mybatis高级查询 1.1 ResutlMap属性 1.2 多条件查询(三种) 1.3 模糊查询 二 Mybatis映射文件深入 2.1 ...
- Mybatis 高级结果映射 ResultMap Association Collection
来源:http://www.verydemo.com/demo_c152_i1880.html MyBatis的创建基于这样一个思想:数据库并不是您想怎样就怎样的.虽然我们希望所有的数据库遵守第三范式 ...
最新文章
- 【c++】重载操作符
- linux七个运行级如何设置,RHEL7 运行级别简介及切换操作
- localStorage和sessionStorage的简单使用
- 智能家居产品持续发烧 增值应用功能多样化发展
- 知乎人均985?Python爬50W数据,BI做出可视化后,我有了答案
- n维椭球体积公式_加速度计 椭球校准 (最小二乘法 椭球拟合)
- mvn package 报Failed to execute goal
- linux在多核处理器上的负载均衡原理(2)
- 寻找春天nbsp;九宫格日记-2014.03.08
- Dreamweaver CS6的基本使用教程
- 基于simulink的风能/光伏发电系统仿真
- 大学生网课答案查询公众号搭建教程
- C++左值,右值例子理解
- 高通平台android 8.1基线某款usb camera打开dev/video1出错
- proteus 0.96OLED IIC仿真 SSD1306 UG-2864HSWEG01
- python朱庇特_新的朱庇特书
- Bluetooth SIG定义的标准Characteristics UUID
- 通信原理笔记—模拟信号的数字编码
- 銀織の雷使い(プレメア) / 银雷(异时层机娘)
- 百度云svip高速下载