前言
当我们学习heribnate的时候,也就是SSH框架的网上商城的时候,我们就学习过它对应的高级映射,一对一映射,一对多映射,多对多映射。对于SSM的Mybatis来说,肯定也是差不多的。既然开了头了,我们就也来简单说一些Mybatis的高级映射。当然说到这些东西的时候,最简单也最常用的就是级联查询,所以我们就以几个简单的级联查询为例,分别说一下Mybatis的一对一、一对多、多对多查询。
一.一对一映射
1.需求
电商类做买卖,用户提交订单后,某宝根据订单信息和客户的姓名、地址派送,现在查询所有的订单信息,关联查询下但用户信息。
确定执行的sql语句为:
SELECT orders.*,user.username,userss.address FROM orders,user WHEREorders.user_id = user.id
2.resultType方式解决这个问题
(1)定义po类
public class OrdersCustom extends Orders { //OrdersCustom类继承Orders类后OrdersCustom类包括了Orders类的所有字段,只需要定义用户的信息字段即可。 private String username;// 用户名称 private String address;// 用户地址 public String getUsername(){ return username; } public String setUsername(String username){ this.username=username; } …… }
(2)Mapper映射文件
<!-- 查询所有订单信息 --> <select id="findOrdersList" resultType="cn.itcast.mybatis.po.OrdersCustom"> SELECT orders.*, user.username, user.address FROM orders, user WHERE orders.user_id = user.id </select>
(3)定义mapper接口
public List<OrdersCustom> findOrdersList() throws Exception;
(4)测试
public void testfindOrdersList()throws Exception{ //获取session SqlSession session = sqlSessionFactory.openSession(); //获限mapper接口实例 UserMapper userMapper = session.getMapper(UserMapper.class); //查询订单信息 List<OrdersCustom> list =userMapper.findOrdersList(); System.out.println(list); //关闭session session.close(); }
3.使用resultMap解决这个问题
(1)定义resultMap
<!-- 订单信息resultmap___需要关联查询映射的是用户信息,使用association将用户信息映射到订单对象的用户属性中 --> <resultMap type="cn.itcast.mybatis.po.Orders"id="userordermap"> <!-- 这里的id,是mybatis在进行一对一查询时将user字段映射为user对象时要使用,必须写 --> <id property="id" column="id"/> <result property="user_id" column="user_id"/> <result property="number" column="number"/> <association property="user" javaType="cn.itcast.mybatis.po.User"> <!-- 这里的id为user的id,如果写上表示给user的id属性赋值 --> <id property="id" column="user_id"/> <result property="username" column="username"/> <result property="address" column="address"/> </association> </resultMap>
(2)调用resultMap
<select id="findOrdersListResultMap" resultMap="userordermap"> SELECT orders.*, user.username, user.address FROM orders, user WHERE orders.user_id = user.id </select>
(3)定义mapper接口
4.一对一查询总结
个人认为啊,这种情况下使用resultType定义输出映射相对简单,因为这样只需要去添加一个po类就行了,按需求添加额外需要的属性,就可以完成映射。而相对于resultType来说,resultMap就显得稍微麻烦一些了,他需要特别定义resultMap来映射相关联表的实体属性。
二.一对多查询
1.需求
继上面的需求,查询所有订单信息及订单下的订单明细信息(一个订单信息下面或有很多商品,这个女生买护肤品的时候应该很有感触吧。所以订单信息与订单明细是一对多的关系)
(1)确定在数据库执行的sql语句
select orders.*, user.username, user.address,orderdetail.idorderdetail_id,orderdetail.items_id, orderdetail.items_num FROM orders,user,orderdetail WHERE orders.user_id = user.id AND orders.id = orderdetail.orders_id
执行结果:
(2)定义po类
public class Orders{ private Integer id; private Integer userId; private String number; private Date createtime; private String note; private User user; private List<OrderDetial> orderDetails; //getter、setter }
(3)定义resultMap
<!-- 订单信息resultmap --> <resultMap type="cn.itcast.mybatis.po.Orders" id="userorderdetailmap"> <id property="id"column="id"/> <result property="user_id" column="user_id"/> <result property="number" column="number"/> <association property="user" javaType="cn.itcast.mybatis.po.User"> <id property="id" column="user_id"/> <result property="username" column="username"/> <result property="address" column="address"/> </association> <collection property="orderdetails" ofType="cn.itcast.mybatis.po.Orderdetail"> <id property="id" column="orderdetail_id"/> <result property="items_id" column="items_id"/> <result property="items_num" column="items_num"/> </collection> </resultMap>
大家可以跟上面对比一下,这两个resultMap除了对订单详细的映射定义外,其他的是完全一样的,现在问题来了,我们需要重新定义上面重复的映射信息吗?答案是不用,resultMap具有可继承特性,我们只需要继承上面的resultMap(userordermap),然后只定义别的就可以了,如下:
<resultMap type="cn.itcast.mybatis.po.Orders" id="userorderdetailmap" extends="userordermap"> <collection property="orderdetails" ofType="cn.itcast.mybatis.po.Orderdetail"> <id property="id" column="orderdetail_id"/> <result property="items_id" column="items_id"/> <result property="items_num" column="items_num"/> </collection> </resultMap>
使用extends来继承订单信息resultmap:userordermap
(4)实现调用
<select id="findOrdersDetailList" resultMap="userorderdetailmap"> select orders.*, user.username, user.address, orderdetail.id orderdetail_id, orderdetail.items_id, orderdetail.items_num FROM orders,user,orderdetail WHERE orders.user_id = user.id AND orders.id =orderdetail.orders_id </select>
(5)定义mapper接口
publicList<Orders>findOrdersDetailList () throws Exception;
(6)来测试一下
public void testfindOrdersDetailList()throws Exception{ //获取session SqlSession session = sqlSessionFactory.openSession(); //获限mapper接口实例 UserMapper userMapper =session.getMapper(UserMapper.class); //查询订单信息 List<Orders> list =userMapper.findOrdersDetailList(); System.out.println(list); //关闭session session.close(); }
这个吧,图没有了,可是可以给大家形容一下,就是返回结果只有四个订单信息,然后每个订单信息里面有两个商品信息list压到这里面。就这样,我们就实现了一对多的查询,为什么这个例子我们不用resultType来执行,其实结果早就给大家了,上面执行sql的结果图,就是返回的信息列表,实际上只有四个订单信息,但是使用resultType会返回8条信息,也就是没有完成去重,还需要我们去手动去重,了然了吗?不是很方便。
三.多对多查询
(1)需求
查询用户购买的商品信息(一个用户可以有N个订单信息,每个订单信息可以有M个商品信息,所以我们需要查询所有的用户信息,关联查询订单及订单明细信息,订单名信息中关联查询商品信息)
(2)确定要执行的sql
SELECT orders.*, USER.username, USER.address, orderdetail.idorderdetail_id, orderdetail.items_id, orderdetail.items_num, items.nameitems_name, items.detailitems_detail FROM orders, USER, orderdetail, items WHERE orders.user_id= USER .id AND orders.id = orderdetail.orders_id ANDorderdetail.items_id = items.id
(3)po类变化
在User中添加List<Orders>orders 属性;在Orders类中加入List<Orderdetail> orderdetails属性;Items类,不用动。
(4)定义resultMap
<resultMap type="cn.itcast.mybatis.po.User"id="userOrderListResultMap"> <id column="user_id"property="id"/> <result column="username"property="username"/> <collection property="orders"ofType="cn.itcast.mybatis.po.Orders"> <id column="id"property="id"/> <result property="number" column="number"/> <collection property="orderdetails"ofType="cn.itcast.mybatis.po.Orderdetail"> <id column="orderdetail_id" property="id"/> <result property="ordersId"column="id"/> <result property="itemsId"column="items_id"/> <result property="itemsNum"column="items_num"/> <association property="items"javaType="cn.itcast.mybatis.po.Items"> <id column="items_id" property="id"/> <result column="items_name" property="name"/> <result column="items_detail" property="detail"/> </association> </collection> </collection> </resultMap>
(5)调用resultMap
<select id="findUserItemResultMap" resultMap="UserItemResultMap" > select orders.*, user.username, user.sex, user.address, orderdetail.id, orderdetail_id, orderdetail.items_id, orderdetail.items_num, orderdetail.orders_id, item.id item_id, item.name item_name, item.detail item_detail, item.price item_price from orders,user,orderdetail,item where orders.user_id=user.id and orders.id=orderdetail.orders_id and orderdetail.items_id=item.id </select>
到这里,相信大家能看出点端倪来了吧,我们一直都是用<collection></collection>和<association></association>分别对集合和实体进行关联映射,而且它们层层嵌套的方式就跟实体之间层层嵌套的方式一样:user中包含orders,orders中包含orderdetail,orderdetail中包含item。
(6)然后定义mapper接口
public interface UserMapper { List<User> findUserItemResultMap() throws Exception; }
结果,就请大家自己去动手实验一下吧!
四.小结
到此,我们的Mybatis高级映射之一对一,一对多,多对多映射就分享完了,期间自己又有点收获,总结一下:
1.resultType:将查询结果按照sql列名pojo属性名一致性映射到pojo中。常见一些明细记录的展示,比如用户购买商品明细,将关联查询信息全部展示在页面时,此时可直接使用resultType将每一条记录映射到pojo中,在前端页面遍历list(list中是pojo)即可。
2.resultMap:使用association和collection完成一对一和一对多高级映射(对结果有特殊的映射要求)。其中association见关联查询信息映射到一个pojo对象中,collection将关联查询信息映射到一个list集合中然而,使用resultType无法将查询结果映射到pojo对象的pojo属性中,根据对结果集查询遍历的需要选择使用resultType还是resultMap。那就要看我们自己的判断力了。
文章来源:http://blog.csdn.net/liweizhong193516/article/details/53688995#
相关推荐
本篇文章将深入探讨MyBatis在处理多对多查询时的高级映射技巧。 首先,理解多对多关系。在数据库设计中,多对多关系意味着一个表中的记录可以与另一表中的多个记录相关联,反之亦然。例如,学生和课程之间的关系...
在处理一对多或多对多关系时,关联嵌套非常有用。例如,一个用户可能有多个订单,我们可以使用`<association>`标签来实现这种关系。以下是一个示例,展示如何获取用户及其关联的订单: ```xml SELECT u.*, o.* ...
7. 动态结果集映射:Mybatis 提供了动态结果集映射功能,通过 `<collection>` 和 `<association>` 标签可以处理复杂的一对多和多对一关系。例如,一个用户可能有多个订单,那么在查询用户时,可以将订单信息一同返回...
在 MyBatis 的使用过程中,经常会遇到需要处理复杂的数据关联情况,如一对一、一对多、多对多的关系。这些关系的处理主要依赖于 MyBatis 的高级结果映射特性。 **1.1 一对一映射** **需求**: 查询订单信息的同时,...
本篇主要探讨的是MyBatis中的高级映射之一——一对多查询。在数据库关系模型中,一对多关系是常见的关联类型,例如一个学生可以对应多个课程,一个部门可以有多个员工等。MyBatis提供了一对多映射功能,使得在Java...
在这个主题中,我们将深入探讨MyBatis如何实现一对一的高级映射。 首先,我们来理解一下一对一查询的基本概念。在数据库设计中,一对一关系是指两个表中的记录是一一对应的,例如,一个员工可能只属于一个部门,而...
"关联映射"是MyBatis中的一个重要概念,用于处理数据库中表之间的关联关系,比如一对一、一对多、多对一和多对多的关系。下面将详细介绍MyBatis的关联映射以及如何在代码中实现。 关联映射是MyBatis通过XML配置文件...
在处理复杂的关联关系时,MyBatis的一对多映射机制显得尤为重要。一对多映射指的是一个父类实体对应多个子类实体的关系,例如一个学生可以有多个课程,一个部门可以有多名员工等。 一、一对多映射的基本概念 在...
Mybatis关联映射是数据库操作中的一个重要概念,它允许我们在SQL查询中处理一对多、多对一、多对多等复杂关系。在这个"Mybatis关联映射Demo"中,我们将深入探讨如何在Mybatis框架中实现这些关系映射,以便更好地理解...
在MyBatis中,关联映射是处理对象关系映射(ORM)的重要部分,用于描述实体类之间的关联关系,如一对一(OneToOne)、一对多(OneToMany)和多对多(ManyToMany)。下面我们将深入探讨这些关联映射的实现和原理。 ...
本主题将详细探讨在MyBatis中如何实现一对一和一对多的映射。 ### 一对一映射(One-to-One) 一对一关系通常发生在两个实体之间,例如一个用户对应一个唯一地址。在MyBatis中,可以通过`<association>`标签来配置...
在处理复杂的数据库关联关系时,比如一对一、一对多、多对一、多对多等,Mybatis提供了灵活的映射机制。本篇将详细讲解如何在Mybatis中实现一对多关联映射的查询操作。 首先,我们要明确一对多关联映射的基本概念。...
SpringBoot 中 MyBatis 表关联映射关系(一对多嵌套:结果方式) 在 SpringBoot 中,MyBatis 是一个非常流行的持久层框架,它提供了强大的持久化功能,能够将 Java 对象与数据库表进行映射。在实际开发中,我们经常...
本话题主要关注MyBatis中的一对一关系映射,这是一种常见的数据库关联关系,用于描述一个实体与另一个实体之间的对应关系。 一对一关系映射在数据库设计中意味着一个表中的记录唯一对应另一个表中的记录。例如,...
3. `association`: 这个元素用于处理一对多或多对一的关系。在本例中,`<association property="author" column="blog_author_id" javaType="Author">` 定义了 `Blog` 对象的 `author` 属性,它是一个 `Author` 对象...
其次,`<foreach>`标签在Mybatis映射中扮演着动态SQL片段的角色,主要用于构建动态的SQL语句,比如批量插入、批量查询等场景。它可以遍历一个列表或数组,并为每个元素生成适当的SQL片段,还可以通过`open`和`close`...
mybatis生成映射文件的插件,下载之后,在myeclipse中配置一下,就可以用
MyBatis关系映射之一对多和多对一 MyBatis是一款流行的Java持久化框架,提供了丰富的关系映射功能。关系映射是指在数据库中建立实体之间的关联关系,例如,一对多、多对一、多对多等。今天,我们将探讨MyBatis关系...
本压缩包文件包含的资源主要讲解了MyBatis中的两种关联映射技术:一对一(One-to-One)和一对多(One-to-Many)映射的实现代码。 在数据库设计中,一对一关系是指两个表中的记录之间存在一对一的对应关系,例如一个...