【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

相关文章
|
18天前
|
SQL Java 数据库连接
对Spring、SpringMVC、MyBatis框架的介绍与解释
Spring 框架提供了全面的基础设施支持,Spring MVC 专注于 Web 层的开发,而 MyBatis 则是一个高效的持久层框架。这三个框架结合使用,可以显著提升 Java 企业级应用的开发效率和质量。通过理解它们的核心特性和使用方法,开发者可以更好地构建和维护复杂的应用程序。
107 29
|
1月前
|
XML Java 数据库连接
Mybatis一对一,一对多关联查询
## MyBatis一对一、一对多关联查询详解 MyBatis是一款优秀的持久层框架,提供了灵活的SQL映射功能,支持复杂的数据库操作。本文将详细介绍MyBatis中一对一和一对多关联查询的实现。 ### 一对一关联查询 一对一关联关系指的是一个表中的一条记录与另一个表中的一条记录相关联。例如,一个用户有一个地址信息。 #### 数据库表设计 假设有两个表:`user`和 `address`。 ``` CREATE TABLE user ( id INT PRIMARY KEY, name VARCHAR(50) ); CREATE TABLE address
37 18
|
29天前
|
SQL Java 数据库连接
【潜意识Java】MyBatis中的动态SQL灵活、高效的数据库查询以及深度总结
本文详细介绍了MyBatis中的动态SQL功能,涵盖其背景、应用场景及实现方式。
96 6
|
2月前
|
XML Java 数据库连接
Mybatis实现RBAC权限模型查询
通过对RBAC权限模型的理解和MyBatis的灵活使用,我们可以高效地实现复杂的权限管理功能,为应用程序的安全性和可维护性提供有力支持。
73 5
|
3月前
|
SQL Java 数据库连接
持久层框架MyBatisPlus
持久层框架MyBatisPlus
75 1
持久层框架MyBatisPlus
|
2月前
|
SQL Java 数据库连接
spring和Mybatis的各种查询
Spring 和 MyBatis 的结合使得数据访问层的开发变得更加简洁和高效。通过以上各种查询操作的详细讲解,我们可以看到 MyBatis 在处理简单查询、条件查询、分页查询、联合查询和动态 SQL 查询方面的强大功能。熟练掌握这些操作,可以极大提升开发效率和代码质量。
162 3
|
3月前
|
SQL 缓存 Java
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
本文详细介绍了MyBatis的各种常见用法MyBatis多级缓存、逆向工程、分页插件 包括获取参数值和结果的各种情况、自定义映射resultMap、动态SQL
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
|
3月前
|
SQL 安全 Java
MyBatis-Plus条件构造器:构建安全、高效的数据库查询
MyBatis-Plus 提供了一套强大的条件构造器(Wrapper),用于构建复杂的数据库查询条件。Wrapper 类允许开发者以链式调用的方式构造查询条件,无需编写繁琐的 SQL 语句,从而提高开发效率并减少 SQL 注入的风险。
61 1
MyBatis-Plus条件构造器:构建安全、高效的数据库查询
|
29天前
|
前端开发 Java 数据库连接
Java后端开发-使用springboot进行Mybatis连接数据库步骤
本文介绍了使用Java和IDEA进行数据库操作的详细步骤,涵盖从数据库准备到测试类编写及运行的全过程。主要内容包括: 1. **数据库准备**:创建数据库和表。 2. **查询数据库**:验证数据库是否可用。 3. **IDEA代码配置**:构建实体类并配置数据库连接。 4. **测试类编写**:编写并运行测试类以确保一切正常。
52 2
|
4月前
|
Java 数据库连接 Maven
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和MyBatis Generator,使用逆向工程来自动生成Java代码,包括实体类、Mapper文件和Example文件,以提高开发效率。
206 2
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。