mybatis一对多多对多
转:http://www.cnblogs.com/selene/p/4627446.html
一:订单商品数据模型
1.数据库执行脚本
创建数据库表代码:
测试数据代码:
2.数据模型分析思路
(1).每张表记录的数据内容:分模块对每张表记录的内容进行熟悉,相当 于你学习系统 需求(功能)的过程;
(2).每张表重要的字段设置:非空字段、外键字段;
(3).数据库级别表与表之间的关系:外键关系;
(4).表与表之间的业务关系:在分析表与表之间的业务关系时一定要建立在某个业务意义基础上去分析。
3.针对订单商品模型的数据库思路分析:
用户表:t_user-->记录了购买商品的用户信息
订单表:orders-->记录了用户所创建的订单(购买商品的订单)
订单明细表:orderdetail-->记录了订单的详细信息即购买商品的信息
商品表:items-->记录了商品信息
表与表之间的业务关系:
在分析表与表之间的业务关系时需要建立 在某个业务意义基础上去分析。
先分析数据级别之间有关系的表之间的业务关系:
t_user和orders:
t_user---->orders:一个用户可以创建多个订单,一对多
orders--->t_user:一个订单只由一个用户创建,一对一
orders和orderdetail:
orders--->orderdetail:一个订单可以包括多个订单明细,因为一个订单可以购买多个商品,每个商品的购买信息在orderdetail记录,一对多关系
orderdetail--> orders:一个订单明细只能包括在一个订单中,一对一
orderdetail和itesm:
orderdetail--->itesms:一个订单明细只对应一个商品信息,一对一
items--> orderdetail:一个商品可以包括在多个订单明细 ,一对多
再分析数据库级别没有关系的表之间是否有业务关系:
orders和items:
orders和items之间可以通过orderdetail表建立 关系。
4.分析之后画出对应的图,方便直观的了解业务关系
二、一对一查询
2.1.需求:查询订单信息,关联查询用户信息;
2.2.resultType实现
2.2.1.sql语句
确定查询的主表:订单表,确定查询的关联表:用户表。
1 SELECT t1.*, 2 t2.username, 3 t2.sex, 4 t2.address 5 FROM 6 orders t1, 7 t_user t2 8 WHERE t1.user_id=t2.id
2.2.2.创建entity实体
用户实体:User.java
package com.mybatis.entity; import java.util.Date; import java.util.List; /** * @ClassName: User* @Description: TODO(用户实体)* @author 阿赫瓦里*/ public class User {private Integer id;// 姓名private String username;// 性别private String sex;// 地址private String address;// 生日private Date birthday;// 用户创建的订单列表private List<Orders> ordersList;// getter and setter ...... }
订单实体:orders.java
package com.mybatis.entity; import java.util.Date; import java.util.List; /*** @ClassName: Orders* @Description: TODO(订单实体)* @author 阿赫瓦里*/ public class Orders {/** 主键订单Id */private Integer id;/** 下单用户id */private Integer userid;/** 订单号 */private String number;/** 创建订单时间 */private Date createTime;/** 备注 */private String note;// 用户信息private User user;// 订单明细private List<OrderDetail> orderdetails;// getter and setter ...... }
商品实体:Items.java
package com.mybatis.entity; import java.util.Date; /*** @ClassName: Items* @Description: TODO(商品实体类)* @author 阿赫瓦里*/ public class Items {/** 商品表主键Id */private Integer id;/** 商品名称 */private String itemsName;/** 商品定价 */private float price;/** 商品描述 */private String detail;/** 商品图片 */private String picture;/** 生产日期 */private Date createTime; // getter and setter ...... }
订单明细实体:OrderDetail.java
package com.mybatis.entity; /*** @ClassName: OrderDetail* @Description: TODO(订单明细实体)* @author 阿赫瓦里*/ public class OrderDetail {/** 主鍵,訂單明细表Id */private Integer id;/** 訂單Id */private Integer ordersId;/** 商品id */private Integer itemsId;/** 商品购买数量 */private Integer itemsNum;// 明细对应的商品信息private Items items;// getter and setter ...... }
创建一个包装类,将查询到的信息可以全部映射到此类:OrdersCustom.java
/*** @ClassName: OrdersCustom* @Description: TODO(订单的扩展类,通过此类映射订单和用户的查询结果,让此类继承字段较多的实体类)* @author: 阿赫瓦里*/ public class OrdersCustom extends Orders {// 添加用户的属性private String username;private String sex;private String address;// getter and setter...... }
2.2.3.创建OrdersCustomMapper.java
package com.mybatis.Mapper; import java.util.List; import com.mybatis.entity.OrdersCustom;/*** @ClassName: OrdersMapperCustom* @Description: TODO(OrdersMapperCustom的mapper)* @author 阿赫瓦里*/ public interface OrdersCustomMapper {/** 查询订单,关联查询用户信息 */public List<OrdersCustom> findOrdersUser(); }
2.2.4.创建OrdersCustomMapper.xml和上面对应的接口名称一致,以便通过mapper接口加载配置文件
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!-- namespace命名空间,作用就是对sql进行分类化的管理,理解为sql隔离注意:使用mapper代理开发时,namespace有特殊作用,namespace等于mapper接口地址--> <mapper namespace="com.mybatis.mapper.OrdersCustomMapper"><!-- 查询订单,关联查询用户信息 --><select id="findOrdersUser" resultType="com.mybatis.entity.OrdersCustom">SELECT t1.*,t2.username,t2.sex,t2.addressFROMorders t1,t_user t2WHERE t1.user_id=t2.id</select> </mapper>
2.3.resultMap实现
2.3.1. sql语句同上
2.3.2. resultMap映射思路:
使用resultMap将查询结果中的订单信息映射到Orders对象中,在orders类中添加User属性,将关联查询出来的用户信息映射到orders对象中的user属性中(上面orders实体中已经添加)。
2.3.3 ordersCustomMapper.xml
1. 定义resultMap
1 <!-- 定义查询订单关联用户的 resultMap,将整个的查询结果映射到com.mybatis.entity.Orders中 --> 2 <resultMap type="com.mybatis.entity.Orders" id="OrdersUserResultMap"> 3 <!-- 配置映射的订单信息 --> 4 5 <!-- id:查询列中的唯一标识,订单信息中的唯一标识,如果多列组成唯一标识(如:一般数据库设计中的字典表 使用联合主键),就需要配置多个id 6 column:订单信息的唯一标识 列 7 property:订单信息的唯一标识列所映射到orders中的那个属性(假如:数据库中orders表中的主键为orders_id,而实体属性名称为ordersId, 8 则这个配置应为<id column="orders_id" property="ordersId"/>,类似hibernate实体映射文件配置)。 9 --> 10 <id column="id" property="id"/> 11 <result column="user_id" property="userid"/> 12 <result column="number" property="number"/> 13 <result column="createtime" property="createTime"/> 14 <result column="note" property="note"/> 15 16 <!-- 配置映射的关联用户信息 --> 17 18 <!--association:用于映射关联查询单个对象的信息 19 property:要将关联查询的用户信息映射到Orders中那个属性 20 --> 21 <association property="user" javaType="com.mybatis.entity.User"> 22 <!-- id:关联查询用户的唯一标识 23 column:指定唯一标识用户信息的列 24 property:映射到user的那个属性 25 --> 26 <id column="user_id" property="id"/> 27 <result column="username" property="username"/> 28 <result column="sex" property="sex"/> 29 <result column="address" property="address"/> 30 </association> 31 32 </resultMap>
2. statement定义
1 <!-- 查询订单,关联查询用户信息,使用resultMap实现 --> 2 <select id="findOrdersUserResultMap" resultMap="OrdersUserResultMap"> 3 SELECT t1.*, 4 t2.username, 5 t2.sex, 6 t2.address 7 FROM 8 orders t1, 9 t_user t2 10 WHERE t1.user_id=t2.id 11 </select>
3.OrderCustomMapper.java接口中添加下面的方法
/** 查询订单关联查询用户信息,使用reslutMap实现*/ public List<Orders>findOrdersUserResultMap();
4.对是resultType和resultMap实现的Junit测试
5.resultType和resultMap实现一对一查询小结
实现一对一查询:
a.resultType:使用resultType实现较为简单,如果pojo中没有包括查询出来的列名,需要增加列名对应的属性,即可完成映射。
b.如果没有查询结果的特殊要求建议使用resultType。
c.resultMap:需要单独定义resultMap,实现有点麻烦,如果对查询结果有特殊的要求,使用resultMap可以完成将关联查询映射pojo的属性中。
d.resultMap可以实现延迟加载,resultType无法实现延迟加载。
三、一对多查询
3.1. 需求:查询订单(关联用户)及订单明细;
3.2. 在orders.java类中添加List<orderDetail> orderDetails属性(上面实体已添加)。
最终会将订单信息映射到orders中,订单所对应的订单明细映射到orders中的orderDetails属性中.
3.3.在ordersCustomMapper.xml中添加如下代码
<!-- 查询订单关联查询用户及订单明细 --><select id="findOrdersAndOrderDetailResultMap" resultMap="ordersAndOrderDetailResultMap">SELECT t1.*,t2.username,t2.sex,t2.address,t3.id orderdetail_id,t3.items_id,t3.items_num,t3.orders_idFROMorders t1,t_user t2,orderdetail t3WHERE t1.user_id = t2.id AND t3.orders_id=t1.id</select>
resultMap的定义同样添加到ordersCustomMapper.xml
<!-- 查询订单(关联用户)及订单明细的resultMap --><resultMap type="com.mybatis.entity.Orders" id="ordersAndOrderDetailResultMap" extends="OrdersUserResultMap"><!-- 订单信息 --><!-- 关联用户信息 --><!-- 使用extends继承,不用在中配置订单信息和用户信息的映射--><!-- 关联订单明细信息 一个订单关联查询出了多条订单明细,要使用collection映射collection:对关联查询到的多条记录映射到集合中property:将关联查询到的多条记录映射到orders类的那个属性ofType:指定映射的集合属性中pojo的类型--><collection property="orderdetails" ofType="com.mybatis.entity.OrderDetail"><!-- id:唯一标识property:要将订单明细的唯一标识映射到com.mybatis.entity.OrderDetail的那个属性--><id column="orderdetail_id" property="id"/><result column="items_id" property="itemsId"/><result column="items_num" property="itemsNum"/><result column="orders_id" property="ordersId"/></collection></resultMap>
3.4. 在OrderCustomMapper.java接口类中添加一个方法
/**查询订单(关联用户)以及订单明细*/public List<OrderDetail>findOrdersAndOrderDetailResultMap();
3.5.在Junit测试类中添加测试方法
// 查询订单(关联用户)以及订单明细的测试 @Testpublic void TestFindOrdersAndOrderDetailResultMap() {SqlSession sqlSession = sqlSessionFactory.openSession();// 创建代理对象OrdersCustomMapper oc = sqlSession.getMapper(OrdersCustomMapper.class);// 调用mapper的方法List<OrderDetail> list = oc.findOrdersAndOrderDetailResultMap();System.out.println(list);sqlSession.close(); }
3.6. 小结
mybatis使用resultMap的collection对关联查询的多条记录映射到一个list集合属性中。
使用resultType实现:将订单明细映射到orders中的orderdetails中,需要自己处理,使用双重循环遍历,去掉重复记录,将订单明细放在orderdetails中。
四、多对多查询
4.1.需求:查询用户以及用户购买的商品信息
4.2.映射思路
将用户信息映射到user中。
在user类中添加订单列表属性List<Orders> orderslist,将用户创建的订单映射到orderslist;
在Orders中添加订单明细列表属性List<OrderDetail>orderdetials,将订单的明细映射到orderdetials;
在OrderDetail中添加Items属性,将订单明细所对应的商品映射到Item;
4.3.OrdersCustomMapper.xml添加如下代码
<!-- 查询用户即购买的商品信息的ResultMap --><resultMap type="com.mybatis.entity.User" id="userAndItemsResultMap"><!-- 用户信息 --><id column="user_id" property="id"/><result column="username" property="username"/><result column="sex" property="sex"/><result column="address" property="address"/><!-- 订单信息一个用户对应多个订单,使用collection映射 --><collection property="ordersList" ofType="com.mybatis.entity.Orders"><id column="id" property="id"/><result column="user_id" property="userid"/><result column="number" property="number"/><result column="createtime" property="createTime"/><result column="note" property="note"/><!-- 订单明细一个订单包括 多个明细--><collection property="orderdetails" ofType="com.mybatis.entity.OrderDetail"><id column="orderdetail_id" property="id"/><result column="items_id" property="itemsId"/><result column="items_num" property="itemsNum"/><result column="orders_id" property="ordersId"/><!-- 商品信息一个订单明细对应一个商品--><association property="items" javaType="com.mybatis.entity.Items"><id column="items_id" property="id"/><result column="items_name" property="itemsName"/><result column="items_detail" property="detail"/><result column="items_price" property="price"/></association></collection></collection></resultMap><!-- 查询用户及用户购买的商品信息,使用resulaMap--><select id="findUserAndItemsResultMap" resultMap="userAndItemsResultMap">SELECT t1.*,t2.username,t2.sex,t2.address,t3.id orderdetail_id,t3.items_id,t3.items_num,t3.orders_id,t4.itemsname items_name,t4.detail items_detail,t4.price items_priceFROMorders t1,t_user t2,orderdetail t3,items t4WHERE t1.user_id = t2.id AND t3.orders_id=t1.id AND t3.items_id = t4.id</select>
4.4. 在OrderCustomMapper.java添加如下方法
/** 查询用户及用户所购买的商品信息 */public List<User> findUserAndItemsResultMap();
4.5.在Junit测试类中添加测试方法
// 查询用户及用户购买的商品的信息 @Testpublic void TestFindUserAndItemsResultMap() {SqlSession sqlSession = sqlSessionFactory.openSession();// 创建代理对象OrdersCustomMapper oc = sqlSession.getMapper(OrdersCustomMapper.class);// 调用mapper的方法List<User> list = oc.findUserAndItemsResultMap();System.out.println(list);sqlSession.close();}
4.6.resultMap总结
resultType:
作用:将查询结果按照sql列名pojo属性名一致性映射到pojo中。
场合:
常见一些明细记录的展示,比如用户购买商品明细,将关联查询信息全部展示在页面时,此时可直接使用resultType将每一条记录映射到pojo中,在前端页面遍历list(list中是pojo)即可。
resultMap:
使用association和collection完成一对一和一对多高级映射(对结果有特殊的映射要求)。
association:
作用:将关联查询信息映射到一个pojo对象中。
场合:
为了方便查询关联信息可以使用association将关联订单信息映射为用户对象的pojo属性中,比如:查询订单及关联用户信息。
使用resultType无法将查询结果映射到pojo对象的pojo属性中,根据对结果集查询遍历的需要选择使用resultType还是resultMap。
collection:
作用:将关联查询信息映射到一个list集合中。
场合:
为了方便查询遍历关联信息可以使用collection将关联信息映射到list集合中,比如:查询用户权限范围模块及模块下的菜单,可使用collection将模块映射到模块list中,将菜单列表映射到模块对象的菜单list属性中,这样的作的目的也是方便对查询结果集进行遍历查询。
如果使用resultType无法将查询结果映射到list集合中。
关注 - 23
粉丝 - 590
» 下一篇:mybatis入门基础(七)----延迟加载
订单详细表再加个数量
没问题,交流互助,共同进步。
谢谢支持!
3.4中的这个返回类型错了哦,应该是
public List<Orders> findOrdersAndOrderDetailResultMap();
【活动】2050 大会 - 年青人因科技而团聚(5.26-27杭州·云栖小镇)
【活动】华为云全新一代云服务器·限时特惠5.6折
【推荐】腾讯云多款高规格服务器,免费申请试用6个月
· 中兴员工:华为仅部分芯片自己设计 谁被美制裁都得死
· 华为、海康,必有一战
· 乐播足球获近千万Pre-A轮融资,解说员董路的内容创业路
· 美团王兴:数字经济进入新阶段 与实体经济深度融合
· 任天堂Labo开箱测评:70美元的硬纸板,好玩在哪儿?
» 更多新闻...
· 写给自学者的入门指南
· 和程序员谈恋爱
· 学会学习
· 优秀技术人的管理陷阱
» 更多知识库文章...
公告
园龄:3年3个月
粉丝:590
关注:23
|
|||||||||
日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
---|---|---|---|---|---|---|---|---|---|
25 | 26 | 27 | 28 | 29 | 30 | 31 | |||
1 | 2 | 3 | 4 | 5 | 6 | 7 | |||
8 | 9 | 10 | 11 | 12 | 13 | 14 | |||
15 | 16 | 17 | 18 | 19 | 20 | 21 | |||
22 | 23 | 24 | 25 | 26 | 27 | 28 | |||
29 | 30 | 1 | 2 | 3 | 4 | 5 |
搜索
常用链接
- 我的随笔
- 我的评论
- 我的参与
- 最新评论
- 我的标签
我的标签
- mybatis(5)
- 集合(4)
- mybatis mapper(3)
- mvc(2)
- springmvc(2)
- 异常(2)
- mybatis配置文件(2)
- 反射(2)
- 泛型 协变 逆变(1)
- 泛型 反射(1)
- 更多
随笔分类(56)
- JAVA
- JAVA面试(2)
- mybatis(9)
- SpringMVC(2)
- Sql Server(12)
- 编写高质量代码 改善java程序的151个建议(28)
- 程序人生(2)
- 技术分享(1)
随笔档案(56)
- 2016年10月 (8)
- 2016年9月 (20)
- 2015年8月 (1)
- 2015年7月 (9)
- 2015年6月 (3)
- 2015年5月 (8)
- 2015年4月 (6)
- 2015年2月 (1)
相册(1)
- hobby(1)
积分与排名
- 积分 - 117276
- 排名 - 2622
最新评论
- 1. Re:mybatis入门基础(二)----原始dao的开发和mapper代理开发
- 不好意思 博主 请原谅 原来是我之前写DAO实现类时在update的方法中没有将commit()方法写出来 忘了 哈哈哈 不好意思 博主
- --Farggle
- 2. Re:mybatis入门基础(二)----原始dao的开发和mapper代理开发
- 好像updateUser有点问题啊 博主 按照您写的代码来的 更新id为1的信息 好像在数据库中没改过来
- --Farggle
- 3. Re:mybatis入门基础(六)----高级映射(一对一,一对多,多对多)
- 多个订单就有多个明细,哈哈
- --jjly
- 4. Re:SQL Server基础之存储过程
- 赞,楼主加油
- --考察费
- 5. Re:SQL Server基础之索引
- 请问 为什么非聚集索引改变了表中行的物理顺序? 还是说 在没有聚集索引的情况下非聚集索引会改变行的物理顺序?
- --Kulle
阅读排行榜
- 1. mybatis入门基础(六)----高级映射(一对一,一对多,多对多)(40110)
- 2. SQL Server基础之存储过程(24788)
- 3. MyBatis入门基础(一)(22748)
- 4. JAVA常见面试题之Forward和Redirect的区别(20985)
- 5. 为什么我不推荐大家去外包公司(15913)
评论排行榜
- 1. 为什么我不推荐大家去外包公司(108)
- 2. 客观评价下软件培训机构(41)
- 3. MyBatis入门基础(一)(30)
- 4. SQL Server基础之存储过程(23)
- 5. 编写高质量代码:改善Java程序的151个建议(第2章:基本类型___建议21~25)(17)
推荐排行榜
- 1. MyBatis入门基础(一)(132)
- 2. 为什么我不推荐大家去外包公司(99)
- 3. 编写高质量代码:改善Java程序的151个建议(第1章:JAVA开发中通用的方法和准则___建议1~5)(55)
- 4. springMVC学习笔记(一)-----springMVC原理(52)
- 5. SQL Server基础之存储过程(45)
mybatis一对多多对多相关推荐
- mybatis一对多 多对一
一.一对多: 实体类 package com.ming.entity;import java.util.List;public class Station {private String Sname; ...
- Mybatis - 一对多/多对一映射
文章目录 前言 项目结构 一.数据库表 1. 员工表 t_emp 2. 部门表 t_dept 二.实体类 1. Emp 员工实体类(添加多对一属性) 2. dept 部门实体类(添加一对多属性) 三. ...
- mybatis的一对一 一对多 多对多
mybatis的一对一 一对多 多对多 1.表 2.建表语句 order_t表 CREATE TABLE `order_t` ( `id` int(11) NOT NULL, `user_id` in ...
- mybatis一对多关联 创建_MyBatis多对多关联查询(级联查询)
其实,MyBatis 没有实现多对多级联,这是因为多对多级联可以通过两个一对多级联进行替换. 例如,一个订单可以有多种商品,一种商品可以对应多个订单,订单与商品就是多对多的级联关系,使用一个中间表(订 ...
- 7. MyBatis多表查询 - 一对一 - 一对多 - 多对多
7. MyBatis多表查询 - 一对一 - 一对多 - 多对多 前言 在前面的篇章,我们已经熟悉了单表查询,下面我们来看看如何进行 多表查询. 数据准备 create database if not ...
- Mybatis-Plus用纯注解完成一对多多对多查询
Mybatis-Plus用纯注解搞定一对多&多对多查询 业务中很常见的用户-角色就属于典型的多对多关系. 假设我们需要将用户信息(包括了用户对应的角色信息)查询出来 多对多 数据表结构 use ...
- mybatis高级映射多对多查询(二)
在这篇博客中,我来介绍下mybatis中的多对多查询的案例,在mybatis中,如何使用ResultMap来实现多对多的查询? 案例:一个user可以有很多role,一个role可以有很多entitl ...
- mybatis手写多对多关联映射
mybatis手写多对多关联映射 1.一对一关联查询 1.1resultType实现 1.2resultMap实现 2.一对多关联查询 3.多对多关联查询 4.resultType与resultMap ...
- SQLAlchemy_定义(一对一/一对多/多对多)关系
SQLAlchemy_定义(一对一/一对多/多对多)关系 目录 Basic Relationship Patterns One To Many One To One Many To Many Basi ...
最新文章
- MIIC:互联网会成基础设施,智能硬件就是互联网硬件
- xcode8控制台输出大量不用的log的问题解决NSLog失效的解决
- 推荐一个C++练手项目,面试也可用
- 2019春季学期进度报告(十四)
- php程序设计案例教程 程序题,PHP程序设计案例教程
- 如何与深度学习服务器优雅的交互?(长期更新)
- 苹果CMSV10绿色毛毛虫主题模板
- hadoop22---wait,notify
- 666的vue.mixin
- Java集合笔记,实用!!
- 小猪cms之怎样查询绑定的微网站模板
- 单片机c语言fft函数,单片机ADC采样FFT计算试验
- mysql快照数据_制作mysql数据快照
- CryEngine5 Shader调试
- Java Semaphore实现高并发场景下的流量控制(附源码) | 实用代码架构
- 影视剪辑,PR剪辑蒙太奇手法的认识
- 《数据赋能IT团队技术管理实战》与老杨不得不说的故事
- Dart 2.15 发布的新特性
- echarts词云图实现
- Spring的生态圈、Spring全家桶