一:订单商品数据模型

1.数据库执行脚本

  创建数据库表代码:

 查看代码

  测试数据代码:

 查看代码

2.数据模型分析思路

(1)。每张表记录的数据内容:分模块对每张表记录的内容进行熟悉,相当于你学习系统需求(功能)的过程;

(2)每张表重要的字段设置:非空字段,外键字段;

(3)数据库级别表与表之间的关系:外键关系;

(4)表与表之间的业务关系:在分析表与表之间的业务关系时一定要建立在某个业务意义基础上去分析。

3.针对订单商品模型的数据库思路分析:

  用户表:T_USER - >记录了购买商品的用户信息

  订单表:订单 - >记录了用户所创建的订单(购买商品的订单)

  订单明细表:的OrderDetail - >记录了订单的详细信息即购买商品的信息

  商品表:项目 - >记录了商品信息

表与表之间的业务关系:

  在分析表与表之间的业务关系时需要建立在某个业务意义基础上去分析。

  先分析数据级别之间有关系的表之间的业务关系:

T_USER和订单:

  T_USER ---->订单:一个用户可以创建多个订单,一对多

  订单---> T_USER:一个订单只由一个用户创建,一对一

订单和的OrderDetail:

  订单--->的OrderDetail:一个订单可以包括多个订单明细,因为一个订单可以购买多个商品,每个商品的购买信息在的OrderDetail记录,一对多关系

  orderdetail - > orders:一个订单明细只能包括在一个订单中,一对一

的OrderDetail和ITESM:

  的OrderDetail ---> itesms:一个订单明细只对应一个商品信息,一对一

  items - > orderdetail:一个商品可以包括在多个订单明细,一对多

再分析数据库级别没有关系的表之间是否有业务关系:

订单项目状语从句:

  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.address7             FROM8                 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测试

 View Code

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对象中。

  场合

    为了方便查询关联信息可以使用联想将关联订单信息映射为用户对象的POJO属性中,比如:查询订单及关联用户信息。

    使用与resultType无法将查询结果映射到POJO对象的POJO属性中,根据对结果集查询遍历的需要选择使用与resultType还是结果映射。

采集:

  作用:将关联查询信息映射到一个列表集合中。

  场合

    为了方便查询遍历关联信息可以使用集合将关联信息映射到列表集合中,比如:查询用户权限范围模块及模块下的菜单,可使用收集将模块映射到模块列表中,将菜单列表映射到模块对象的菜单列表属性中,这样的作的目的也是方便对查询结果集进行遍历查询。

  如果使用与resultType无法将查询结果映射到表集合中。

转自:https://www.cnblogs.com/selene/p/4627446.html

mybatis入门基础----高级映射(一对一,一对多,多对多)相关推荐

  1. 【转自】mybatis入门基础----高级映射(一对一,一对多,多对多)

    转自:http://www.cnblogs.com/selene/p/4627446.html 可参考https://blog.csdn.net/liu_yanzhao/article/details ...

  2. mybatis入门(六)----高级映射(一对一,一对多,多对多)

    阅读目录 一:订单商品数据模型 二.一对一查询 三.一对多查询 四.多对多查询 回到顶部 一:订单商品数据模型 1.数据库执行脚本 创建数据库表代码: View Code 测试数据代码: View C ...

  3. Mybatis中的关系映射(一对一,一对多,多对多)

    在网上寻了很久,大多数讲关系性的文章都是大篇幅的去将表照搬上来,本来就很生硬,此文就不在讲述关系性映射的具体实现,转而从浅层来讲讲其概念性. 1.1 关联关系概述 在关系型数据库中,多表之间存在着三种 ...

  4. 【MyBatis框架】高级映射-一对一查询

    一对一查询 根据上面我们分析的订单商品数据模型(链接:12.订单商品数据模型-分析思路.txt),我们来写一下有关一对一的查询,分别使用了resultType和resultMap指定输出参数类型 1. ...

  5. mysql中建立一对多映射_Mybatis中的高级映射一对一、一对多、多对多

    学习hibernate的时候,小编已经接触多各种映射,mybatis中映射有到底是如何运转的,今天这篇博文,小编主要来简单的介绍一下mybatis中的高级映射,包括一对一.一对多.多对多,希望多有需要 ...

  6. mybatis高级映射(一对一,一对多,多对多)

    http://www.cnblogs.com/selene/p/4627446.html 阿赫瓦里 生命对于某些人来说,一直都是美丽的,因为这些人的一生都在为某个梦想而奋斗!!! 博客园 首页 新随笔 ...

  7. mybatis入门基础(二)----原始dao的开发和mapper代理开发

    阅读目录 一:原始dao开发方法 二:mapper代理方法(只需要mapper接口,相当于dao接口) 承接上一篇 mybatis入门基础(一) 看过上一篇的朋友,肯定可以看出,里面的MybatisS ...

  8. 7. MyBatis多表查询 - 一对一 - 一对多 - 多对多

    7. MyBatis多表查询 - 一对一 - 一对多 - 多对多 前言 在前面的篇章,我们已经熟悉了单表查询,下面我们来看看如何进行 多表查询. 数据准备 create database if not ...

  9. mybatis的一对一 一对多 多对多

    mybatis的一对一 一对多 多对多 1.表 2.建表语句 order_t表 CREATE TABLE `order_t` ( `id` int(11) NOT NULL, `user_id` in ...

最新文章

  1. 【Android 应用开发】LruCache 简介
  2. 雅客EXCEL(6)-通用表格格式、销售实际案例(总结之前的知识点)
  3. [云炬创业管理笔记]第三章打造优秀创业团队讨论2
  4. DGL教程【三】构建自己的GNN模块
  5. java 随机数 【指定范围】
  6. Dead Pixel CodeForces - 1315A(思维)
  7. 数据结构实验之排序五:归并求逆序数
  8. 百度云域名解析如何添加? - [未完待续]
  9. fedora安装pyenv实现python的版本管理
  10. 强悍的 vim —— g s 替换区别
  11. 微服务学习之01父工程创建【Hoxton.SR1版】
  12. SAPUI5教程——URLHelper的使用技巧
  13. 全国DNS服务器IP地址【电信、网通、铁通】
  14. Win10系统下如何安装鼠标指针主题包
  15. 阿尔伯塔计算机科学学费,留学360发布阿尔伯塔大学学费
  16. Java人工弱智算法_人工智障也刷题!Kaggle 入门之实战泰坦尼克号
  17. mysql identity属性_Mysql中Identity 详细介绍
  18. Android2.1源码目录结构
  19. 推荐一款智能黑科技微信小程序,简直不要太良心!
  20. matlab-线性代数 创建 N阶数量矩阵 N阶单位矩阵 对角矩阵 范德蒙矩阵 等差数列...

热门文章

  1. AndroidStudio(IDEA)代码提示背景为白色如何去除
  2. POJ 3190: Stall Reservations
  3. Python实例:6~10例
  4. 关于H264中的startcode(干货)
  5. vs2019提示系统资源不足
  6. 什么?CSS内联样式的使用
  7. 我这个程序员没有秃头,但是将要白头了!
  8. NOI:2722 和数
  9. DNSPod十问中企动力陈鸣飞:“本地化”为什么是SaaS公司的胜负手?
  10. 2019中兴校招面经整理