一、模型分析

user和orders

user---->orders

一个用户可以创建多个订单,一对多。

orders--->user

一个订单只由一个用户创建,一对一。

 

orders和orderdetail

orders--->orderdetail

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

orderdetail---> orders

一个订单明细只能包括在一个订单中,一对一。

 

orderdetail和items

orderdetail--->itesms

一个订单明细只对应一个商品信息,一对一。

items---> orderdetail

一个商品可以包括在多个订单明细 ,一对多。

 

二、一对一查询

1.使用resultType

     复杂查询时,单表对应的po类已不能满足输出结果集的映射。所以要根据需求建立一个扩展类来作为resultType的类型。

 

User.java

public class User implements Serializable{

	private int id;

	private String username;// 用户姓名

	private String sex;// 性别

	private Date birthday;// 生日

	private String address;// 地址

	public User(){
} public User(String username,String sex,Date birthday,String address){
this.username = username;
this.sex = sex;
this.birthday = birthday;
this.address = address;
} //get、set.....
}

 

Orders.java

public class Orders implements Serializable{

    private Integer id;

    private Integer userId;

    private String number;

    private Date createtime;

    private String note;

    //get、set.....
}

 

我们要执行如下语句:

 

(1)编写PO类

public class OrdersExt extends Orders{

	private String username;

	private String sex;

	private String address;

	//get、set......
}

 

(2)编写mapper接口 

public interface OrdersMapper{

	public List<OrdersExt> findOrderAndUser();
}

 

(3)编写映射文件

 

Test.java

	@Test
public void testFindUsersByNameAndSex(){ SqlSession sqlSession = sqlSessionFactory.openSession(); OrdersMapper mapper = sqlSession.getMapper(OrdersMapper.class); List<OrdersExt> list = mapper.findOrderAndUser(); for(OrdersExt orderExt : list){ System.out.println(orderExt);
} sqlSession.close();
}

 

2.使用resultMap

(1)修改PO类,添加User对象

 

(2)编写mapper接口

 

(3)编写映射文件

 

一对一查询

resultType: 使用resultType实现较为简单,如果pojo中没有包括查询出来的列名,需要增加列名对应的属性,即可完成映射。

如果没有查询结果的特殊要求建议使用resultType。

resultMap: 需要单独定义resultMap,实现有点麻烦,如果对查询结果有特殊的要求,使用resultMap可以完成将关联查询映射pojo的对象属性中。

resultMap可以实现延迟加载,resultType无法实现延迟加载。

 

三、一对多映射

(1)需求

     查询订单信息及订单明细和用户信息。

 

(2)Sql语句

确定主查询表: 订单表

确定关联查询表: 订单明细表、用户表

在一对一查询基础上添加订单明细关联表即可。

 

(3)修改PO类

 

(4)编写mapper接口

 

(5)编写mapper配置文件

collection: 定义一个一对多关系。

ofType: 指定该集合参数所映射的类型。

 

四、多对多

(1)需求

查询用户信息及用户购买的商品信息,要求将关联信息映射到主pojo的pojo属性中。

 

(2)Sql语句

查询主表: user

查询关联表: orders、orderdetail、items

 

(3)映射思路

将用户信息映射到user中。

在user类中添加订单列表属性List<Orders> orders,将用户创建的订单映射到orders。

在Orders中添加订单明细列表属性List<Orderdetail> detailList,将订单的明细映射到detailList。

在Orderdetail中添加Items属性,将订单明细所对应的商品映射到Items。

 

(4)修改PO类

 

(5)编写mapper接口

 

(6)编写mapper配置文件

Mybatis基础学习(四)—关系映射的更多相关文章

  1. Python基础学习四

    Python基础学习四 1.内置函数 help()函数:用于查看内置函数的用途. help(abs) isinstance()函数:用于判断变量类型. isinstance(x,(int,float) ...

  2. Hibernate基础学习(四)—对象-关系映射(上)

    一.映射对象标识符      Java语言按内存地址来识别或区分同一个类的不同对象,而关系数据库按主键值来识别或区分同一个表的不同记录.Hibernate使用对象标识符(OID)来建立内存中的对象和数 ...

  3. Mybatis系列(四)映射文件

    转自:https://blog.csdn.net/chris_mao/article/details/48811507 Mybatis的真正强大,在于她对SQL的映射,这也是她吸引人的地方.实现相同的 ...

  4. Mybatis基础学习(一)—初识MyBatis

    一.MyBatis是什么?      MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google co ...

  5. 【mybatis xml】数据层框架应用--Mybatis(三)关系映射之一对一关系映射

    实际的开发中,对数据库的操作常常会涉及到多张表,这在面向对象中就涉及到了对象与对象之间的关联关系. 针对多表之间的操作,MyBatis提供了关联映射,通过关联映射就可以很好的处理对象与对象之间的关联关 ...

  6. Hibernate学习之关系映射(转)

    一.一对多 "一对多"是最普遍的映射关系,简单来讲就如消费者与订单的关系.一对多:从消费者角的度来说一个消费者可以有多个订单,即为一对多.多对一:从订单的角度来说多个订单可以对应一 ...

  7. MyBatis基础学习笔记--摘录

    1.MyBatis是什么? MyBatis源自于IBatis,是一个持久层框架,封装了jdbc操作数据库的过程,使得开发者只用关心sql语句,无需关心驱动加载.连接,创建statement,手动设置参 ...

  8. entityframework学习笔记--007-实体数据建模基础之继承关系映射TPT

    Table per Type Inheritance (TPT)建模 1.假设你有两张表与一张公共的表密切相关,如图7-1所示,Businiss表与eCommerce表.Retail表有1:0...1 ...

  9. Mybatis基础学习(三)—映射文件

    一.输入映射 1.parameterType     指定输入参数的Java类,可以使用别名或者类的全限定名.它也可以接受基本数据类型.POJO对象.HashMap.   (1)基本数据类型   (2 ...

随机推荐

  1. Javascript事件绑定及深入

    由于开学后的编程实验课,接触了海量字符换搜索的实验,所以好几天没有学习JS课程了,今天继续学习事件绑定. 传统事件绑定存在一些问题,如:同名事件函数都执行,第二个函数会覆盖第一个. 下面我们以事件切换 ...

  2. ARP攻击

    ARP攻击,是针对以太网地址解析协议(ARP)的一种攻击技术,就是通过伪造IP地址和MAC地址实现ARP欺骗,能够在网络中产生大量的ARP通信量使网络阻塞.此种攻击可让攻击者取得局域网上的数据封包甚至 ...

  3. UITableView多层展开与收起

    规则要求: tableview 有多层,类似于xcode文件目录的层级关系,每一个最开始展示的层姑且称之为根目录吧,并且,每个根目录下的层数不定. 与文件目录类似,每个目录下可以有不同层级的目录同时展 ...

  4. 每天一个linux命令31)--chown命令

    chown将 指定文件的拥有者改为指定的用户或组,用户可以是用户名或者用户ID,组可以使组名或者组ID:文件是以空格分开的要改变权限的文件列表,支持通配符.系统管理员经常使用chown命令,在将文件拷 ...

  5. 每天一个Linux命令(17)--whereis命令

    whereis 命令只能用于程序名的搜索,而且只搜索二进制文件(参数-b).man说明文件(参数-m)和源代码文件(参数-s).如果省略参数,则返所有信息. 和find相比,whereis查找的速度非 ...

  6. 【openstack N版】——云主机调整大小\冷迁移

    一.先决条件 云主机冷迁移,即:将一台云主机从一个计算节点上,迁移到另外一个计算节点上.因为环境原因,所以我们需要准备两个计算节点. 1.1准备环境 在控制节点上,安装一个计算节点 #在控制节点安装n ...

  7. Linux的常用基本命令。

    Linux的常用基本命令. 首先启动Linux.启动完毕后需要进行用户的登录,选择登陆的用户不同自然权限也不一样,其中"系统管理员"拥有最高权限. 在启动Linux后屏幕出现如下界 ...

  8. smarty fetch方法

    fetch   取得输出的内容 返回一个模板输出的内容(HTML代码),而不是直接显示出来,需要指定一个合法的模 板资源的类型和路径.你还可以通过 第二个可选参数指定一个缓存号,相关的信息可以查看缓存 ...

  9. macOS apache配置及开启虚拟服务器的开启,apache开启重写模式

    今天把自己的mac系统升到最新版,但是,apache却不能用了,因为mac上的apache是系统自带的,因为是mac目前的最新系统,所以出现了好多问题,整理了一下午也没有啥进展,最后还是把原来的在云盘 ...

  10. 【解题报告】pojP1436 Horizontally Visible Segments

    http://poj.org/problem?id=1436 题目大意:有n条平行于x轴的线段,每条线段有y坐标,如果两条线段有一段x坐标数值相等,且中间没有其它线段阻隔,则称这两条线段"照 ...