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

简介:
一对一查询
根据上面我们分析的订单商品数据模型(链接:12.订单商品数据模型-分析思路.txt),我们来写一下有关一对一的查询,分别使用了resultType和resultMap指定输出参数类型

1.一对一查询使用resultType指定输出参数类型

1.1需求

查询订单信息,关联查询创建订单的用户信息

1.2resultType

1.2.1sql语句
确定查询的主表:订单表
确定查询的关联表:用户表
关联查询使用内链接?还是外链接?
由于orders表中有一个外键(user_id),通过外键关联查询用户表只能查询出一条记录,可以使用内链接。
SELECT 
  orders.*,
  USER.username,
  USER.sex,
  USER.address 
FROM
  orders,
  USER 
WHERE orders.user_id = user.id

1.2.2创建pojo
将上边sql查询的结果映射到pojo中,pojo中必须包括所有查询列名。
下面写Orders.java对映数据库表单
package cn.edu.hpu.mybatis.PO;

import java.util.Date;


public class Orders {
	private Integer id;
	
	private Integer userId;
	
	private String number;
	
	private Date creattime;
	
	private String note;


	//get和set方法省略...
}

发现原始的Orders.java不能映射全部字段,需要新创建的pojo。

创建 一个pojo继承包括查询字段较多的po类。
package cn.edu.hpu.mybatis.PO;

//Orders订单的拓展类
//通过此类映射订单和用户查询的结果,让此类继承包括字段较多的pojo类
public class OrdersCustom extends Orders{
	
	//添加用户属性
	private String username;
	
	private String sex;
	
	private String address;	
	
	//get和set方法省略...
}	

1.2.3mapper.xml
OrdersCustomMapper.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">


<!-- namespace命名空间,作用就是对sql进行分类化管理,理解sql隔离
注意:使用mapper代理方法开发,namespace有特殊重要的作用 -->
<mapper namespace="cn.edu.hpu.mybatis.mapper.OrdersCustomMapper">
 	<!-- 查询订单关联查询用户信息 -->
 	
 	<select id="findOrdersUser" resultType="cn.edu.hpu.mybatis.PO.OrdersCustom">
 		SELECT 
		  orders.*,
		  USER.username,
		  USER.sex,
		  USER.address 
		FROM
		  orders,
		  USER 
		WHERE orders.user_id = user.id
 	</select>
</mapper>
在SqlMapConfig.xml中我们扫描了mapper包所有的Mapper映射文件,所以这里就不在SqlMapConfig.xml中单独加载Mapper映射文件了。

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

import java.util.List;

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

//订单mapper
public interface OrdersCustomMapper {


	//查询订单关联查询用户信息
	public List<OrdersCustom> findOrdersUser() throws Exception;
}

测试:
@Test
public void testFindOrdersUser() throws Exception{
	
	SqlSession sqlSession=sqlSessionFactory.openSession();
	//创建代理对象
	OrdersCustomMapper ordersMapperCustom=sqlSession.getMapper(OrdersCustomMapper.class);
	
	//调用mapper的方法
	List<OrdersCustom> list=ordersMapperCustom.findOrdersUser();
	
	for (int i = 0; i < list.size(); i++) {
		OrdersCustom  oc=list.get(i);
		System.out.println(oc.getUsername()+"|"+oc.getSex()+"|"+oc.getAddress());
		
	}
	
	sqlSession.close();
}

测试结果:
张三|男|河南焦作
张三|男|河南焦作
刘莉莉|女|山东威

输出日志:
DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Created connection 21573890.
DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.Connection@1493102]
DEBUG [main] - ==>  Preparing: SELECT orders.*, USER.username, USER.sex, USER.address FROM orders, USER WHERE orders.user_id = user.id 
DEBUG [main] - ==> Parameters: 
DEBUG [main] - <==      Total: 3

2.一对一查询使用resultMap指定输出参数类型

2.1sql语句
同resultType实现的sql

2.2使用resultMap映射的思路

使用resultMap将查询结果中的订单信息映射到Orders对象中,在orders类中添加User属性,将关联查询出来的用户信息映射到orders对象中的user属性中。

2.3需要Orders类中添加user属性
package cn.edu.hpu.mybatis.PO;

import java.util.Date;

public class Orders {
	private Integer id;
	
	private Integer userId;
	
	private String number;
	
	private Date creattime;
	
	private String note;
	
	//用户信息
	private User user;
	...
}

2.4mapper.xml

2.4.1定义resultMap
<!-- 订单查询关联用户的resultMap 
	将整个查询结果映射到cn.edu.hpu.mybatis.PO.Orders中-->
	<resultMap type="cn.edu.hpu.mybatis.PO.Orders" id="OrdersUserResultMap">
			<!-- 配置映射的订单信息 -->
			  	<!-- id:指定查询中的唯一标识,订单信息中的唯一标识,如果有多个列组成唯一标识,
			  	那么就要配置多个id 。
			  	column:订单信息的唯一标识列。
			  	property:订单信息的唯一标识列所映射到Orderds中哪个属性-->
			  	<id column="id" property="id"/>
			  	<result column="user_id" property="userId"/>
			  	<result column="number" property="number"/>
			  	<result column="creattime" property="creattime"/>
			  	<result column="note" property="note"/>
			
			<!-- 配置关联用户的用户信息 -->
			<!-- association:用于映射关联查询单个对象的信息。
			 property:要将关联查询的用户信息映射到Orders中哪个属性-->
			<association property="user" javaType="cn.edu.hpu.mybatis.PO.User">
				<!-- id:关联查询用户的唯一标识
				指定唯一标识用户信息的列
				javaType:映射到User的哪个属性  -->
				<id column="user_id" property="id"/>
				<result column="username" property="username"/>
			  	<result column="sex" property="sex"/>
			  	<result column="address" property="address"/>
			  	
				<result/>
			</association>
	
	</resultMap>

2.4.2statement定义
<!-- 查询订单关联查询用户信息,使用resultMap -->
 	
 	<select id="findOrdersUserResultMap" resultMap="OrdersUserResultMap">
 		SELECT 
		  orders.*,
		  USER.username,
		  USER.sex,
		  USER.address 
		FROM
		  orders,
		  USER 
		WHERE orders.user_id = user.id
 	</select>

2.4.3mapper.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> findOrdersUserResultMap() throws Exception;
}

测试:

@Test
public void testFindOrdersUserResultMap() throws Exception{
	
	SqlSession sqlSession=sqlSessionFactory.openSession();
	//创建代理对象
	OrdersCustomMapper ordersMapperCustom=sqlSession.getMapper(OrdersCustomMapper.class);
	
	//调用mapper的方法
	List<Orders> list=ordersMapperCustom.findOrdersUserResultMap();
	
	for (int i = 0; i < list.size(); i++) {
		Orders  o=list.get(i);
		User u=o.getUser();
		System.out.println(u.getUsername()+"|"+u.getSex()+"|"+u.getAddress());
		
	}
	
	sqlSession.close();
}

测试结果:
张三|男|河南焦作
张三|男|河南焦作
刘莉莉|女|山东威海

日志输出:
DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Created connection 21443983.
DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.Connection@147358f]
DEBUG [main] - ==>  Preparing: SELECT orders.*, USER.username, USER.sex, USER.address FROM orders, USER WHERE orders.user_id = user.id 
DEBUG [main] - ==> Parameters: 
DEBUG [main] - <==      Total: 3

3.resultType和resultMap实现一对一查询小结

实现一对一查询:
resultType:使用resultType实现较为简单,如果pojo中没有包括查询出来的列名,需要增加列名对应的属性,即可完成映射。
如果没有查询结果的特殊要求建议使用resultType。


resultMap:需要单独定义resultMap,实现有点麻烦,如果对查询结果有特殊的要求(比如pojo里面又含有pojo),使用resultMap可以完成将关联查询映射pojo的属性中。


resultMap可以实现延迟加载,resultType无法实现延迟加载。

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

相关文章
|
1天前
|
SQL XML Java
mybatis复习04高级查询 一对多,多对一的映射处理,collection和association标签的使用
文章介绍了MyBatis中高级查询的一对多和多对一映射处理,包括创建数据库表、抽象对应的实体类、使用resultMap中的association和collection标签进行映射处理,以及如何实现级联查询和分步查询。此外,还补充了延迟加载的设置和用法。
mybatis复习04高级查询 一对多,多对一的映射处理,collection和association标签的使用
|
1月前
|
Java 数据库连接 Spring
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
文章是关于Spring、SpringMVC、Mybatis三个后端框架的超详细入门教程,包括基础知识讲解、代码案例及SSM框架整合的实战应用,旨在帮助读者全面理解并掌握这些框架的使用。
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
|
1月前
|
SQL Java 数据库连接
【Java 第十三篇章】MyBatis 框架介绍
MyBatis 原名 iBATIS,2001 年由 Clinton Begin 创建,以其简易灵活著称。2010 年更名以重塑品牌形象。MyBatis 通过 SQL 映射文件将 SQL 语句与 Java 代码分离,支持编写原生 SQL 并与方法映射。具备对象关系映射功能,简化数据库记录处理。支持动态 SQL 构建,灵活应对不同查询条件。内置缓存机制,提升查询效率。相比全功能 ORM,MyBatis 提供更高 SQL 控制度和更好的维护性,并易于与 Spring 等框架集成,广泛应用于 Java 数据访问层。
16 0
|
1月前
|
druid Java 数据库连接
SpringBoot项目整合MybatisPlus持久层框架+Druid数据库连接池,以及实现增删改查功能
SpringBoot项目整合MybatisPlus和Druid数据库连接池,实现基本的增删改查功能。
171 0
|
1月前
|
SQL Java 数据库连接
后端框架的学习----mybatis框架(5、分页)
这篇文章介绍了如何在MyBatis框架中实现分页功能,包括使用SQL的`limit`语句进行分页和利用MyBatis的`RowBounds`对象进行分页的方法。
|
14天前
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
|
1天前
|
SQL XML Java
springboot整合mybatis-plus及mybatis-plus分页插件的使用
这篇文章介绍了如何在Spring Boot项目中整合MyBatis-Plus及其分页插件,包括依赖引入、配置文件编写、SQL表创建、Mapper层、Service层、Controller层的创建,以及分页插件的使用和数据展示HTML页面的编写。
springboot整合mybatis-plus及mybatis-plus分页插件的使用
|
29天前
|
Java 数据库连接 测试技术
SpringBoot 3.3.2 + ShardingSphere 5.5 + Mybatis-plus:轻松搞定数据加解密,支持字段级!
【8月更文挑战第30天】在数据驱动的时代,数据的安全性显得尤为重要。特别是在涉及用户隐私或敏感信息的应用中,如何确保数据在存储和传输过程中的安全性成为了开发者必须面对的问题。今天,我们将围绕SpringBoot 3.3.2、ShardingSphere 5.5以及Mybatis-plus的组合,探讨如何轻松实现数据的字段级加解密,为数据安全保驾护航。
82 1
|
1月前
|
Web App开发 前端开发 关系型数据库
基于SpringBoot+Vue+Redis+Mybatis的商城购物系统 【系统实现+系统源码+答辩PPT】
这篇文章介绍了一个基于SpringBoot+Vue+Redis+Mybatis技术栈开发的商城购物系统,包括系统功能、页面展示、前后端项目结构和核心代码,以及如何获取系统源码和答辩PPT的方法。
|
1月前
|
Java 关系型数据库 MySQL
1、Mybatis-Plus 创建SpringBoot项目
这篇文章是关于如何创建一个SpringBoot项目,包括在`pom.xml`文件中引入依赖、在`application.yml`文件中配置数据库连接,以及加入日志功能的详细步骤和示例代码。