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

简介:
前面学习了一对一的查询,现在我们在刚才的数据模型基础上进行一对多的查询。

一对多查询

1.需求
查询订单及订单明细的信息。

2.sql语句
确定主查询表:订单表
确定关联查询表:订单明细表
在一对一查询基础上添加订单明细表关联即可。
SELECT 
  orders.*,
  USER.username,
  USER.sex,
  USER.address,
  orderdetail.id orderdetail_id,
  orderdetail.items_id,
  orderdetail.items_num,
  orderdetail.orders_id
FROM
  orders,
  USER,
  orderdetail
WHERE orders.user_id = user.id AND orderdetail.orders_id=orders.id

3.分析
使用resultType将上边的 查询结果映射到pojo中,订单信息的就是重复。

如图



要求:
对orders映射不能出现重复记录。

4.在orders中添加list订单明细属性

在orders.java类中添加List<orderDetail> orderDetails属性。
最终会将订单信息映射到orders中,订单所对应的订单明细映射到orders中的orderDetails属性中。
package cn.edu.hpu.mybatis.PO;

import java.util.Date;
import java.util.List;


public class Orders {


	private Integer id;
	
	private Integer userId;
	
	private String number;
	
	private Date creattime;
	
	private String note;
	
	//用户信息
	private User user;
	
	//订单明细
	private List<Orderdetail> orderdetils;


	//get和set方法省略
}

其中Orderdetail为
package cn.edu.hpu.mybatis.PO;


public class Orderdetail {
	
	private int id;
	
	private int orders_id;
	
	private int items_id;
	
	private int items_num;


	//get和set方法省略
}

映射成的orders记录数为两条(orders信息不重复)
每个orders中的orderDetails属性存储了该订单所对应的订单明细。

5.mapper.xml
<pre name="code" class="html"><!-- 查询订单关联查询用户信息以及订单明细,使用resultMap -->
 	
 	<select id="findOrdersAndOrderDetailResultMap" resultMap="OrdersAndOrderDetailResultMap">
 		SELECT 
		  orders.*,
		  USER.username,
		  USER.sex,
		  USER.address,
		  orderdetail.id orderdetail_id,
		  orderdetail.items_id,
		  orderdetail.items_num,
		  orderdetail.orders_id
		FROM
		  orders,
		  USER,
		  orderdetail
		WHERE orders.user_id = user.id AND orderdetail.orders_id=orders.id
 	</select>
 6.resultMap定义 
<!-- 订单及订单明细的resultMap
	     使用extend继承,不用在此中配置订单信息和用户信息的映射 -->
	<resultMap type="cn.edu.hpu.mybatis.PO.Orders" id="OrdersAndOrderDetailResultMap" 
			   extends="OrdersUserResultMap">
		
		<!-- 使用extend继承,不用在此中配置订单信息和用户信息的映射 -->
	
		<!-- 订单明细信息
		一个订单关联查询出了多个明细,要使用
		collection进行映射
		collection:对关联查询到多条记录映射cn.edu.hpu.mybatis.PO.Orders哪个属性
		ofType:指定要映射到的集合属性中pojo的类型(就是一个List<Orderdetail>的尖括号中的类型)
		-->
		<collection property="orderdetils" ofType="cn.edu.hpu.mybatis.PO.Orderdetail">
			<!-- id:订单明细的唯一标识 -->
			<id column="orderdetail_id" property="id"/>
			<result column="items_id" property="items_id"/>
			<result column="items_num" property="items_num"/>
			<result column="orders_id" property="orders_id"/>
		</collection>
		
</resultMap>

7.mapper.java
package cn.edu.hpu.mybatis.mapper;

import java.util.List;

import cn.edu.hpu.mybatis.PO.Orders;
import cn.edu.hpu.mybatis.PO.OrdersCustom;


//订单mapper
public interface OrdersCustomMapper {
	
	//...


	//查询订单(关联查询用户)及订单明细使用resultMap
	public List<Orders> findOrdersAndOrderDetailResultMap() throws Exception;
}

8.测试:
@Test
public void testFindOrdersAndOrderDetailResultMap() throws Exception{
	
	SqlSession sqlSession=sqlSessionFactory.openSession();
	//创建代理对象
	OrdersCustomMapper ordersMapperCustom=sqlSession.getMapper(OrdersCustomMapper.class);
	
	//调用mapper的方法
	List<Orders> list=ordersMapperCustom.findOrdersAndOrderDetailResultMap();
	
	for (int i = 0; i < list.size(); i++) {
		Orders  o=list.get(i);
		User u=o.getUser();
		System.out.println("\n下单用户:");
		System.out.println(u.getUsername()+"|"+u.getSex()+"|"+u.getAddress());
		System.out.println("订单明细:");
		List<Orderdetail> os=o.getOrderdetils();
		if(os!=null){
			for (int j = 0; j < os.size(); j++) {
				Orderdetail od=os.get(j);
				System.out.println("订单id:"+od.getOrders_id()+
						"商品id:"+od.getItems_id()+"订单总数:"+od.getItems_num());
			}
		}
	}
	sqlSession.close();
}

测试结果:

下单用户:
张三|男|河南焦作
订单明细:
订单id:1商品id:1订单总数:2


下单用户:
张三|男|河南焦作
订单明细:
订单id:2商品id:2订单总数:2


下单用户:
刘莉莉|女|山东威海
订单明细:
订单id:3商品id:3订单总数:1


日志输出:
DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Created connection 18135083.
DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.Connection@114b82b]
DEBUG [main] - ==>  Preparing: SELECT orders.*, USER.username, USER.sex, USER.address, orderdetail.id orderdetail_id, orderdetail.items_id, orderdetail.items_num, orderdetail.orders_id FROM orders, USER, orderdetail WHERE orders.user_id = user.id AND orderdetail.orders_id=orders.id 
DEBUG [main] - ==> Parameters: 
DEBUG [main] - <==      Total: 3
测试成功!


9.小结
mybatis使用resultMap的collection对关联查询的多条记录映射到一个list集合属性中。

使用resultType实现:

将订单明细映射到orders中的orderdetails中,需要自己处理,使用双重循环遍历,去掉重复记录,将订单明细放在orderdetails中。

转载请注明出处:http://blog.csdn.net/acmman/article/details/46646033

相关文章
SQL XML Java
130 0
|
3月前
|
SQL Java 数据库连接
MyBatis 的映射关系
MyBatis 核心功能之一是映射关系,支持一对一、一对多和多对多三种 ORM 映射。通过实体类与配置文件结合,开发者可灵活实现数据关联,提升数据库操作效率。
300 4
|
3月前
|
SQL Java 数据库连接
区分iBatis与MyBatis:两个Java数据库框架的比较
总结起来:虽然从技术角度看,iBATIS已经停止更新但仍然可用;然而考虑到长期项目健康度及未来可能需求变化情况下MYBATISS无疑会是一个更佳选择因其具备良好生命周期管理机制同时也因为社区力量背书确保问题修复新特征添加速度快捷有效.
245 12
|
4月前
|
SQL XML Java
MyBatis框架如何处理字符串相等的判断条件。
总的来说,MyBatis框架提供了灵活而强大的机制来处理SQL语句中的字符串相等判断条件。无论是简单的等值判断,还是复杂的条件逻辑,MyBatis都能通过其标签和属性来实现,使得动态SQL的编写既安全又高效。
324 0
|
5月前
|
SQL XML Java
MyBatis Mapper中使用limit参数的查询问题
总结而言,MyBatis中使用 `limit`参数的查询可以高度定制并且灵活,基于方法签名和XML映射文件的组合来达成多样化的查询需求。通过参数化查询和动态SQL,MyBatis可以有效地处理各种复杂情境下的数据库操作,并且将SQL语句的维护与业务代码的编写相分离,提升代码的可维护性和可阅读性。
533 13
|
6月前
|
SQL Java 数据库
解决Java Spring Boot应用中MyBatis-Plus查询问题的策略。
保持技能更新是侦探的重要素质。定期回顾最佳实践和新技术。比如,定期查看MyBatis-Plus的更新和社区的最佳做法,这样才能不断提升查询效率和性能。
293 1
|
7月前
|
SQL XML Java
菜鸟之路Day35一一Mybatis之XML映射与动态SQL
本文介绍了MyBatis框架中XML映射与动态SQL的使用方法,作者通过实例详细解析了XML映射文件的配置规范,包括namespace、id和resultType的设置。文章还对比了注解与XML映射的优缺点,强调复杂SQL更适合XML方式。在动态SQL部分,重点讲解了`&lt;if&gt;`、`&lt;where&gt;`、`&lt;set&gt;`、`&lt;foreach&gt;`等标签的应用场景,如条件查询、动态更新和批量删除,并通过代码示例展示了其灵活性与实用性。最后,通过`&lt;sql&gt;`和`&lt;include&gt;`实现代码复用,优化维护效率。
730 5
|
9月前
|
Java 数据库连接 mybatis
MyBatis篇-映射关系(1-1 1-n n-n)
本文介绍了MyBatis中四种常见关系映射的配置方法,包括一对一、一对多、多对一和多对多。**一对一**通过`resultMap`实现属性与字段的映射;**一对多**以用户-角色为例,使用`&lt;collection&gt;`标签关联集合数据;**多对一**以作者-博客为例,利用`&lt;association&gt;`实现关联;**多对多**则通过引入第三方类(如UserForDept)分别在User和Dept类中添加集合属性,并配置对应的`&lt;collection&gt;`标签完成映射。这些方法解决了复杂数据关系的处理问题,提升了开发效率。
|
9月前
|
Oracle 关系型数据库 Java
|
6月前
|
Java 数据库连接 数据库
Spring boot 使用mybatis generator 自动生成代码插件
本文介绍了在Spring Boot项目中使用MyBatis Generator插件自动生成代码的详细步骤。首先创建一个新的Spring Boot项目,接着引入MyBatis Generator插件并配置`pom.xml`文件。然后删除默认的`application.properties`文件,创建`application.yml`进行相关配置,如设置Mapper路径和实体类包名。重点在于配置`generatorConfig.xml`文件,包括数据库驱动、连接信息、生成模型、映射文件及DAO的包名和位置。最后通过IDE配置运行插件生成代码,并在主类添加`@MapperScan`注解完成整合
1218 1
Spring boot 使用mybatis generator 自动生成代码插件