Mybatis基础学习(四)—关系映射
2016-07-04 19:35
344 查看
一、模型分析
![](https://images2015.cnblogs.com/blog/496517/201607/496517-20160704193435936-45185095.png)
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..... }
我们要执行如下语句:
![](https://images2015.cnblogs.com/blog/496517/201607/496517-20160704193437686-1791224951.png)
(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)编写映射文件
![](https://images2015.cnblogs.com/blog/496517/201607/496517-20160704193439217-1865294829.png)
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对象![](https://images2015.cnblogs.com/blog/496517/201607/496517-20160704193447999-519197590.png)
(2)编写mapper接口
![](https://images2015.cnblogs.com/blog/496517/201607/496517-20160704193449999-1380694638.png)
(3)编写映射文件
![](https://images2015.cnblogs.com/blog/496517/201607/496517-20160704193451639-1714479792.png)
![](https://images2015.cnblogs.com/blog/496517/201607/496517-20160704193453421-500810579.png)
一对一查询
resultType: 使用resultType实现较为简单,如果pojo中没有包括查询出来的列名,需要增加列名对应的属性,即可完成映射。
如果没有查询结果的特殊要求建议使用resultType。
resultMap: 需要单独定义resultMap,实现有点麻烦,如果对查询结果有特殊的要求,使用resultMap可以完成将关联查询映射pojo的对象属性中。
resultMap可以实现延迟加载,resultType无法实现延迟加载。
三、一对多映射
(1)需求查询订单信息及订单明细和用户信息。
(2)Sql语句
确定主查询表: 订单表
确定关联查询表: 订单明细表、用户表
在一对一查询基础上添加订单明细关联表即可。
![](https://images2015.cnblogs.com/blog/496517/201607/496517-20160704201021108-1933968848.png)
(3)修改PO类
![](https://images2015.cnblogs.com/blog/496517/201607/496517-20160704201022796-2068422668.png)
(4)编写mapper接口
![](https://images2015.cnblogs.com/blog/496517/201607/496517-20160704201024530-1403201428.png)
(5)编写mapper配置文件
![](https://images2015.cnblogs.com/blog/496517/201607/496517-20160704201026264-46958801.png)
collection: 定义一个一对多关系。
ofType: 指定该集合参数所映射的类型。
四、多对多
(1)需求查询用户信息及用户购买的商品信息,要求将关联信息映射到主pojo的pojo属性中。
(2)Sql语句
查询主表: user
查询关联表: orders、orderdetail、items
![](https://images2015.cnblogs.com/blog/496517/201607/496517-20160705012335952-637474029.png)
(3)映射思路
将用户信息映射到user中。
在user类中添加订单列表属性List<Orders> orders,将用户创建的订单映射到orders。
在Orders中添加订单明细列表属性List<Orderdetail> detailList,将订单的明细映射到detailList。
在Orderdetail中添加Items属性,将订单明细所对应的商品映射到Items。
(4)修改PO类
![](https://images2015.cnblogs.com/blog/496517/201607/496517-20160705012337124-1232504192.png)
(5)编写mapper接口
![](https://images2015.cnblogs.com/blog/496517/201607/496517-20160705012338202-927431684.png)
(6)编写mapper配置文件
![](https://images2015.cnblogs.com/blog/496517/201607/496517-20160705012339280-706258693.png)
![](https://images2015.cnblogs.com/blog/496517/201607/496517-20160705012340889-1687511784.png)
相关文章推荐
- Prime Ring Problem(DFS)
- 熟悉几个命令,脱离鼠标依赖,VIM技能升级
- Linux内核---37.S3C6410让ubifs作rootfs
- 先执行Block里面的内容再执行后面的内容(Block同步执行)
- hadoop随笔二之MR-wordcount小试
- 开源MySQL数据仓库解决方案:Infobright
- 团体程序设计天梯赛-练习集 L2-002. 链表去重
- NYOJ 懂懒事的小明(小明真厉害,无敌了)
- Linux内核---36.RTC驱动分析
- 【Poj】-3061-Subsequence
- HTML DOM
- 第一次玩博客,好好写一写东西可以分享给大家的。
- CrackingtheCodeInterview之位操作
- Linux内核---35.rtc驱动中的文件处理
- Andriod项目开发实战(2)——JSON和XML的区别
- 3.1、决策树算法
- 计算机网络(2)-----ARP协议
- HTML5+规范:IO(管理本地文件系统)
- Linux内核---34.smdk6410平台的初始化(未完成)
- C++数组、指针与vector、iterator