Mybatis学习(5)高级映射
需求:
一、一对一查询
查询订单信息,关联查询创建订单的用户信息;
1 package com.cy.po; 2 3 import java.util.Date; 4 import java.util.List; 5 6 public class Orders { 7 private Integer id; 8 9 private Integer userId; 10 11 private String number; 12 13 private Date createtime; 14 15 private String note; 16 17 public Integer getId() { 18 return id; 19 } 20 21 public void setId(Integer id) { 22 this.id = id; 23 } 24 25 public Integer getUserId() { 26 return userId; 27 } 28 29 public void setUserId(Integer userId) { 30 this.userId = userId; 31 } 32 33 public String getNumber() { 34 return number; 35 } 36 37 public void setNumber(String number) { 38 this.number = number == null ? null : number.trim(); 39 } 40 41 public Date getCreatetime() { 42 return createtime; 43 } 44 45 public void setCreatetime(Date createtime) { 46 this.createtime = createtime; 47 } 48 49 public String getNote() { 50 return note; 51 } 52 53 public void setNote(String note) { 54 this.note = note == null ? null : note.trim(); 55 } 56 }
Orders
pojo-- User:
1 package com.cy.po; 2 3 import java.util.Date; 4 5 public class User { 6 //属性名和数据库表的字段对应 7 private int id; 8 private String username;// 用户姓名 9 private String sex;// 性别 10 private Date birthday;// 生日 11 private String address;// 地址 12 public int getId() { 13 return id; 14 } 15 public void setId(int id) { 16 this.id = id; 17 } 18 public String getUsername() { 19 return username; 20 } 21 public void setUsername(String username) { 22 this.username = username; 23 } 24 public String getSex() { 25 return sex; 26 } 27 public void setSex(String sex) { 28 this.sex = sex; 29 } 30 public Date getBirthday() { 31 return birthday; 32 } 33 public void setBirthday(Date birthday) { 34 this.birthday = birthday; 35 } 36 public String getAddress() { 37 return address; 38 } 39 public void setAddress(String address) { 40 this.address = address; 41 } 42 @Override 43 public String toString() { 44 return "------->> User [id=" + id + ", username=" + username + ", sex=" + sex 45 + ", birthday=" + birthday + ", address=" + address + "]"; 46 } 47 }
User
pojo -- Order扩展类 OrdersCustom:
1 package com.cy.po; 2 3 /** 4 * 5 * <p>Description: 订单的扩展类</p> 6 */ 7 //通过此类映射订单和用户查询的结果,让此类继承包括 字段较多的pojo类 8 public class OrdersCustom extends Orders{ 9 10 //添加用户属性 11 /*USER.username, 12 USER.sex, 13 USER.address */ 14 private String username; 15 private String sex; 16 private String address; 17 public String getUsername() { 18 return username; 19 } 20 public void setUsername(String username) { 21 this.username = username; 22 } 23 public String getSex() { 24 return sex; 25 } 26 public void setSex(String sex) { 27 this.sex = sex; 28 } 29 public String getAddress() { 30 return address; 31 } 32 public void setAddress(String address) { 33 this.address = address; 34 } 35 36 }
OrdersCustom
Mapper.xml:
<mapper namespace="com.cy.mapper.OrdersMapperCustom"><!-- 查询订单关联查询用户信息 --><select id="findOrdersUser" resultType="com.cy.po.OrdersCustom">SELECT orders.*,USER.username,USER.sex,USER.addressFROM orders,USERWHERE orders.user_id = user.id</select></mapper>
Mapper接口:
/*** * <p>Title: OrdersMapperCustom</p>* <p>Description: 订单mapper</p>*/ public interface OrdersMapperCustom {//查询订单关联查询用户信息public List<OrdersCustom> findOrdersUser()throws Exception;}
测试代码:
1 public class OrdersMapperCustomTest { 2 private SqlSessionFactory sqlSessionFactory; 3 4 @Before 5 public void setUp() throws Exception { 6 String resource = "SqlMapConfig.xml"; 7 InputStream inputStream = Resources.getResourceAsStream(resource); 8 sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 9 } 10 11 @Test 12 public void testFindOrdersUser() throws Exception { 13 SqlSession sqlSession = sqlSessionFactory.openSession(); 14 OrdersMapperCustom ordersMapperCustom = sqlSession.getMapper(OrdersMapperCustom.class); 15 List<OrdersCustom> list = ordersMapperCustom.findOrdersUser(); 16 System.out.println(list.toString()); 17 sqlSession.close(); 18 } 19 20 }
View Code
2)使用resultMap方法:
思路:使用resultMap将查询结果中的订单信息映射到Orders对象中,在orders类中添加User属性,将关联查询出来的用户信息映射到orders对象中的user属性中。
Orders中保存user:
1 package com.cy.po; 2 3 import java.util.Date; 4 import java.util.List; 5 6 public class Orders { 7 private Integer id; 8 9 private Integer userId; 10 11 private String number; 12 13 private Date createtime; 14 15 private String note; 16 17 private User user; 18 19 public User getUser() { 20 return user; 21 } 22 23 public void setUser(User user) { 24 this.user = user; 25 } 26 27 public Integer getId() { 28 return id; 29 } 30 31 public void setId(Integer id) { 32 this.id = id; 33 } 34 35 public Integer getUserId() { 36 return userId; 37 } 38 39 public void setUserId(Integer userId) { 40 this.userId = userId; 41 } 42 43 public String getNumber() { 44 return number; 45 } 46 47 public void setNumber(String number) { 48 this.number = number == null ? null : number.trim(); 49 } 50 51 public Date getCreatetime() { 52 return createtime; 53 } 54 55 public void setCreatetime(Date createtime) { 56 this.createtime = createtime; 57 } 58 59 public String getNote() { 60 return note; 61 } 62 63 public void setNote(String note) { 64 this.note = note == null ? null : note.trim(); 65 } 66 }
包含user的Orders
Mapper.xml:
<mapper namespace="com.cy.mapper.OrdersMapperCustom"><!-- 订单查询关联用户的resultMap 将整个查询的结果映射到com.cy.po.Orders中--><resultMap id="OrdersUserResultMap" type="com.cy.po.Orders"><!-- 配置映射的订单信息 --><!-- id:指定查询列中的唯 一标识,订单信息的中的唯 一标识,如果有多个列组成唯一标识,配置多个idcolumn:订单信息的唯一标识列property:订单信息的唯一标识 列所映射到Orders中哪个属性--><id column="id" property="id"></id><result column="user_id" property="userId"></result><result column="number" property="number"></result><result column="createtime" property="createtime"></result><result column="note" property="note"></result><!-- 配置映射的关联的用户信息 --><!-- association:用于映射关联查询单个对象的信息 property:要将关联查询的用户信息映射到Orders中哪个属性 --><association property="user" javaType="com.cy.po.User"><!-- id:关联查询用户的唯 一标识column:指定唯一标识用户信息的列 property:映射到user的哪个属性 --> <id column="user_id" property="id"/><result column="username" property="username"/><result column="sex" property="sex"/><result column="address" property="address"/></association></resultMap><!-- 查询订单关联查询用户信息,使用resultmap --><select id="findOrdersUserResultMap" resultMap="OrdersUserResultMap">SELECTorders.*,USER.username,USER.sex,USER.addressFROMorders,USERWHERE orders.user_id = user.id</select></mapper>
mapper接口:
//查询订单关联查询用户使用resultMap public List<Orders> findOrdersUserResultMap()throws Exception;
测试代码:
@Testpublic void testFindOrdersUserResultMap() throws Exception {SqlSession sqlSession = sqlSessionFactory.openSession();OrdersMapperCustom ordersMapperCustom = sqlSession.getMapper(OrdersMapperCustom.class);List<Orders> orders = ordersMapperCustom.findOrdersUserResultMap();System.out.println(orders);sqlSession.close();}
使用resultType和resultMap实现一对一查询的总结:
resultType:使用resultType实现较为简单,如果pojo中没有包括查询出来的列名,需要增加列名对应的属性,即可完成映射。
resultMap:需要单独定义resultMap,如果对查询结果有特殊的要求,使用resultMap可以完成将关联查询映射pojo的属性中。
resultMap可以实现延迟加载,resultType无法实现延迟加载。
二、一对多查询
需求:查询订单及订单明细的信息。
在orders.java类中添加List<orderDetail> orderDetails属性:
1 package com.cy.po; 2 3 import java.util.Date; 4 import java.util.List; 5 6 public class Orders { 7 private Integer id; 8 9 private Integer userId; 10 11 private String number; 12 13 private Date createtime; 14 15 private String note; 16 17 //用户信息 18 private User user; 19 20 private List<Orderdetail> orderdetails; 21 22 public List<Orderdetail> getOrderdetails() { 23 return orderdetails; 24 } 25 26 public void setOrderdetails(List<Orderdetail> orderdetails) { 27 this.orderdetails = orderdetails; 28 } 29 30 public User getUser() { 31 return user; 32 } 33 34 public void setUser(User user) { 35 this.user = user; 36 } 37 38 public Integer getId() { 39 return id; 40 } 41 42 public void setId(Integer id) { 43 this.id = id; 44 } 45 46 public Integer getUserId() { 47 return userId; 48 } 49 50 public void setUserId(Integer userId) { 51 this.userId = userId; 52 } 53 54 public String getNumber() { 55 return number; 56 } 57 58 public void setNumber(String number) { 59 this.number = number == null ? null : number.trim(); 60 } 61 62 public Date getCreatetime() { 63 return createtime; 64 } 65 66 public void setCreatetime(Date createtime) { 67 this.createtime = createtime; 68 } 69 70 public String getNote() { 71 return note; 72 } 73 74 public void setNote(String note) { 75 this.note = note == null ? null : note.trim(); 76 } 77 }
Orders中包含Orderdetail的集合属性
1 package com.cy.po; 2 3 public class Orderdetail { 4 private Integer id; 5 6 private Integer ordersId; 7 8 private Integer itemsId; 9 10 private Integer itemsNum; 11 12 //明细对应的商品信息 13 private Items items; 14 15 public Integer getId() { 16 return id; 17 } 18 19 public void setId(Integer id) { 20 this.id = id; 21 } 22 23 public Integer getOrdersId() { 24 return ordersId; 25 } 26 27 public void setOrdersId(Integer ordersId) { 28 this.ordersId = ordersId; 29 } 30 31 public Integer getItemsId() { 32 return itemsId; 33 } 34 35 public void setItemsId(Integer itemsId) { 36 this.itemsId = itemsId; 37 } 38 39 public Integer getItemsNum() { 40 return itemsNum; 41 } 42 43 public void setItemsNum(Integer itemsNum) { 44 this.itemsNum = itemsNum; 45 } 46 47 public Items getItems() { 48 return items; 49 } 50 51 public void setItems(Items items) { 52 this.items = items; 53 } 54 55 @Override 56 public String toString() { 57 return "Orderdetail [id=" + id + ", ordersId=" + ordersId 58 + ", itemsId=" + itemsId + ", itemsNum=" + itemsNum + "]"; 59 } 60 61 }
订单明细类Orderdetail
mapper.xml:
1 <mapper namespace="com.cy.mapper.OrdersMapperCustom"> 2 <!-- 订单及订单明细的resultMap 使用extends继承,不用在中配置订单信息和用户信息的映射 --> 3 <resultMap id="OrdersAndOrderDetailResultMap" type="com.cy.po.Orders" extends="OrdersUserResultMap" > 4 <!-- 订单信息 --><!-- 用户信息 --><!-- 使用extends继承,不用在中配置订单信息和用户信息的映射 --> 5 6 <!-- 订单明细信息 一个订单关联查询出了多条明细,要使用collection进行映射 7 collection:对关联查询到多条记录映射到集合对象中 8 property:将关联查询到多条记录映射到com.cy.po.Orders哪个属性 9 ofType:指定映射到list集合属性中pojo的类型 10 --> 11 <collection property="orderdetails" ofType="com.cy.po.Orderdetail"> 12 <!-- id:订单明细唯一标识 property:要将订单明细的唯 一标识映射到com.cy.po.Orderdetail的哪个属性 --> 13 <id column="orderdetail_id" property="id"></id> 14 <result column="items_id" property="itemsId"/> 15 <result column="items_num" property="itemsNum"/> 16 <result column="orders_id" property="ordersId"/> 17 </collection> 18 </resultMap> 19 <!-- 查询订单关联查询用户及订单明细,使用resultmap --> 20 <select id="findOrdersAndOrderDetailResultMap" resultMap="OrdersAndOrderDetailResultMap"> 21 SELECT 22 orders.*, 23 USER.username, 24 USER.sex, 25 USER.address, 26 orderdetail.id orderdetail_id, 27 orderdetail.items_id, 28 orderdetail.items_num, 29 orderdetail.orders_id 30 FROM 31 orders, 32 USER, 33 orderdetail 34 WHERE orders.user_id = user.id AND orderdetail.orders_id=orders.id 35 </select> 36 37 </mapper>
mapper接口:
//查询订单(关联用户)及订单明细 public List<Orders> findOrdersAndOrderDetailResultMap() throws Exception;
测试代码:
1 @Test 2 public void FindOrdersAndOrderDetailResultMap() throws Exception { 3 SqlSession sqlSession = sqlSessionFactory.openSession(); 4 OrdersMapperCustom ordersMapperCustom = sqlSession.getMapper(OrdersMapperCustom.class); 5 6 List<Orders> orders = ordersMapperCustom.findOrdersAndOrderDetailResultMap(); 7 System.out.println(orders); 8 sqlSession.close(); 9 }
View Code
三、多对多查询
需求:查询用户及用户购买商品信息
思路:
将用户信息映射到user中。
在user类中添加订单列表属性List<Orders> orderslist,将用户创建的订单映射到orderslist
在Orders中添加订单明细列表属性List<OrderDetail>orderdetials,将订单的明细映射到orderdetials
在OrderDetail中添加Items属性,将订单明细所对应的商品映射到Items
在上面代码基础上,User类中添加List<Orders> orderslist:
1 package com.cy.po; 2 3 import java.util.Date; 4 import java.util.List; 5 6 public class User { 7 //属性名和数据库表的字段对应 8 private int id; 9 private String username;// 用户姓名 10 private String sex;// 性别 11 private Date birthday;// 生日 12 private String address;// 地址 13 14 private List<Orders> orderslist; 15 16 public List<Orders> getOrderslist() { 17 return orderslist; 18 } 19 public void setOrderslist(List<Orders> orderslist) { 20 this.orderslist = orderslist; 21 } 22 public int getId() { 23 return id; 24 } 25 public void setId(int id) { 26 this.id = id; 27 } 28 public String getUsername() { 29 return username; 30 } 31 public void setUsername(String username) { 32 this.username = username; 33 } 34 public String getSex() { 35 return sex; 36 } 37 public void setSex(String sex) { 38 this.sex = sex; 39 } 40 public Date getBirthday() { 41 return birthday; 42 } 43 public void setBirthday(Date birthday) { 44 this.birthday = birthday; 45 } 46 public String getAddress() { 47 return address; 48 } 49 public void setAddress(String address) { 50 this.address = address; 51 } 52 @Override 53 public String toString() { 54 return "------->> User [id=" + id + ", username=" + username + ", sex=" + sex 55 + ", birthday=" + birthday + ", address=" + address + "]"; 56 } 57 }
User中保存List
mapper.xml:
<mapper namespace="com.cy.mapper.OrdersMapperCustom"><!-- 查询用户及购买的商品 --><resultMap type="com.cy.po.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.cy.po.Orders"><id column="id" property="id"></id><result column="user_id" property="userId"></result><result column="number" property="number"></result><result column="createtime" property="createtime"></result><result column="note" property="note"></result><!-- 订单明细 一个订单包括 多个明细--><collection property="orderdetails" ofType="com.cy.po.Orderdetail"><id column="orderdetail_id" property="id"></id><result column="items_id" property="itemsId"/><result column="items_num" property="itemsNum"/><result column="orders_id" property="ordersId"/><!-- 商品信息一个订单明细对应一个商品--><association property="items" javaType="com.cy.po.Items"><id column="items_id" property="id"/><result column="items_name" property="name"/><result column="items_detail" property="detail"/><result column="items_price" property="price"/></association></collection></collection></resultMap><!-- 查询用户及购买的商品信息,使用resultmap --><select id="findUserAndItemsResultMap" resultMap="UserAndItemsResultMap">SELECT orders.*,USER.username,USER.sex,USER.address,orderdetail.id orderdetail_id,orderdetail.items_id,orderdetail.items_num,orderdetail.orders_id,items.name items_name,items.detail items_detail,items.price items_priceFROMorders,USER,orderdetail,itemsWHERE orders.user_id = user.id AND orderdetail.orders_id=orders.id AND orderdetail.items_id = items.id</select></mapper>
上面,其实思路就是用户中保存List<Orders>,然后Order中有多个订单明细List<Orderdetail>;一个订单明细对应一个商品,private Item;
顺着写来来就是了,不难。
mapper接口:
//查询用户购买商品信息 public List<User> findUserAndItemsResultMap() throws Exception;
测试代码:
@Testpublic void FindUserAndItemsResultMap() throws Exception {SqlSession sqlSession = sqlSessionFactory.openSession();OrdersMapperCustom ordersMapperCustom = sqlSession.getMapper(OrdersMapperCustom.class);List<User> users = ordersMapperCustom.findUserAndItemsResultMap();System.out.println(users);sqlSession.close();}
View Code
多对多查询总结:
将查询用户购买的商品信息明细清单,(用户名、用户地址、购买商品名称、购买商品时间、购买商品数量)
针对上边的需求就使用resultType将查询到的记录映射到一个扩展的pojo中,很简单实现明细清单的功能。
转载于:https://www.cnblogs.com/tenWood/p/6286519.html
Mybatis学习(5)高级映射相关推荐
- mybatis学习之高级映射
一对一映射查询 1.数据库执行脚本: /* SQLyog Ultimate v12.09 (64 bit) MySQL - 5.7.11-log : Database - db_mybatis *** ...
- mybatis入门(六)----高级映射(一对一,一对多,多对多)
阅读目录 一:订单商品数据模型 二.一对一查询 三.一对多查询 四.多对多查询 回到顶部 一:订单商品数据模型 1.数据库执行脚本 创建数据库表代码: View Code 测试数据代码: View C ...
- mybatis入门基础----高级映射(一对一,一对多,多对多)
一:订单商品数据模型 1.数据库执行脚本 创建数据库表代码: 查看代码 测试数据代码: 查看代码 2.数据模型分析思路 (1).每张表记录的数据内容:分模块对每张表记录的内容进行熟悉,相当于你学习 ...
- 【转自】mybatis入门基础----高级映射(一对一,一对多,多对多)
转自:http://www.cnblogs.com/selene/p/4627446.html 可参考https://blog.csdn.net/liu_yanzhao/article/details ...
- 【MyBatis框架】高级映射-延迟加载
延迟加载 1.什么是延迟加载 resultMap可以实现高级映射(使用association.collection实现一对一及一对多映射),association.collection具备延迟加载功能 ...
- 【MyBatis框架】高级映射-一对多查询
前面学习了一对一的查询,现在我们在刚才的数据模型基础上进行一对多的查询. 一对多查询 1.需求 查询订单及订单明细的信息. 2.sql语句 确定主查询表:订单表 确定关联查询表:订单明细表 在一对一查 ...
- Mybatis学习--Mapper.xml映射文件
简介 Mapper.xml映射文件中定义了操作数据库的sql,每个sql是一个statement,映射文件是mybatis的核心. 映射文件中有很多属性,常用的就是parameterType(输入类型 ...
- mybatis学习(53):构造方法映射
数据库表 数据库叫blog_gp1701 author表 数据 blog表 数据 comment表 数据 post表 数据 目录结构 jar包导入 先给对应的jar包导入 建立一个junit单元测试 ...
- 【MyBatis框架】高级映射-多对多查询
多对多查询 1.需求 查询用户及用户购买商品信息. 2.sql语句 查询主表是:用户表 关联表:由于用户和商品没有直接关联,通过订单和订单明细进行关联,所以关联表: orders.orderdetai ...
- 【MyBatis框架】高级映射-一对一查询
一对一查询 根据上面我们分析的订单商品数据模型(链接:12.订单商品数据模型-分析思路.txt),我们来写一下有关一对一的查询,分别使用了resultType和resultMap指定输出参数类型 1. ...
最新文章
- 系统管理员在企业中的职业定位及发展方向 连载(三)
- cyico收集的关于utf8转换gb2312,以及关于javascript实现urlencode和urldecode的一些方法...
- 如何用TensorFlow实现人工智能?
- cmd命令大全/cmd命令提示符大全
- 舒服的网页登录界面设计灵感
- 《构建之法》阅读笔记
- 图形学基础|深度缓冲(DepthBuffer)
- 西威变频器avo下载调试资料_西门子变频器使用BOP-2 面板调试 G120
- php tcpdf 分层,PHP 使用tcPdf 生成pdf文件
- workbench应力应变曲线_ANSYS WORKBENCH后处理中各种应力结果的详细说明
- 能量,功率,能量谱和功率谱密度
- 光敏二极管、光电二极管判断正负
- [openwrt] ubus实现进程间通信举例
- 五:以理论结合实践方式梳理前端 ES 6+ ——— ES 6+ 全局对象
- 进制数的转换方法大全
- Qt 多国语言部分翻译不能成功加载的原因探索
- 我和Ruby之父松本行弘的握手
- python3.6爬虫库_python3.6 网络爬虫
- 搜书吧自动购买(下载)功能实现
- 使用小觅相机录制数据集
热门文章
- chrome浏览器不展示地址栏的完整路径解决
- c语言回调函数_【云里雾里】回调函数与钩子函数
- springcloud五大组件?注解_Spring Cloud学习
- 5.2自动扫描及装配数据
- [渝粤教育] 西安交通大学 光通信器件及系统 参考 资料
- [渝粤教育] 长沙航空职业技术学院 信息技术 参考 资料
- 【渝粤教育】广东开放大学 商务翻译实务 形成性考核 (49)
- 建筑系学生怎么系统地学 Photoshop、CAD 之类软件?
- The Stanford Geostatistical Modeling Software(地质统计软件)
- CentOS虚拟机挂载U盘