当前位置: 首页 > article >正文

006 mybatis关联查询(一对一、一对多)

文章目录

  • 一对一查询
    • SQL语句
      • 方法一:resultType
      • 方法二:resultMap
        • 创建扩展po类
        • Mapper映射文件
        • Mapper接口
        • 测试代码
        • 小结
  • 一对多查询
    • SQL语句
    • 修改po类
    • Mapper映射文件
    • Mapper接口
    • 测试代码

商品订单数据模型
注意:因为一个订单信息只会是一个人下的订单,所以从查询订单信息出发,关联查询用户信息为一对一查询。如果从用户信息出发,查询用户下的订单信息则为一对多查询,因为一个用户可以下多个订单。

一对一查询

需求
查询所有订单信息,关联查询下单用户信息。

SQL语句

SELECT
orders.*,
user.username,
user.address
FROM
orders LEFT JOIN user
ON orders.user_id = user.id

主信息:订单信息
从信息:用户信息

方法一:resultType

方法二:resultMap

使用resultMap进行结果映射,定义专门的resultMap用于映射一对一查询结果。

创建扩展po类

创建OrdersExt类(该类用于结果集封装),加入User属性,user属性中用于存储关联查询的用户信息,因为订单关联查询用户是一对一关系,所以这里使用单个User对象存储关联查询的用户信息。

public class OrdersExt extends Orders {
	private User user;// 用户对象
	// get/set。。。。
}
Mapper映射文件
<!-- 查询订单关联用户信息使用resultmap -->
<resultMap type="OrdersExt" id="ordersAndUserRstMap">
	<id column="id" property="id"/>
	<result column="user_id" property="userId"/>
	<result column="number" property="number"/>
	<result column="createtime" property="createtime"/>
	<result column="note" property="note"/>
	<!-- 一对一关联映射 -->
	<!--
	property:Orders对象的user属性
	javaType:user属性对应 的类型
	-->
	<association property="user" javaType="com.xd.mybatis.po.User">
		<!-- column:user表的主键对应的列 property:user对象中id属性-->
		<id column="user_id" property="id"/>
		<result column="username" property="username"/>
		<result column="address" property="address"/>
	</association>
</resultMap>
<select id="findOrdersAndUserRstMap" resultMap="ordersAndUserRstMap">
	SELECT
		o.id,
		o.user_id,
		o.number,
		o.createtime,
		o.note,
		u.username,
		u.address
	FROM
		orders o
	JOIN `user` u ON u.id = o.user_id
</select>


association:表示进行一对一关联查询映射
property:表示关联查询的结果存储在com.kkb.mybatis.po.Orders的user属性中
javaType:表示关联查询的映射结果类型

Mapper接口

在UserMapper接口中,添加以下接口方法:

public List<OrdersExt> findOrdersAndUserRstMap() throws Exception;
测试代码
public void testfindOrdersAndUserRstMap()throws Exception{
	//获取session
	SqlSession session = sqlSessionFactory.openSession();
	//获限mapper接口实例
	UserMapper userMapper = session.getMapper(UserMapper.class);
	//查询订单信息
	List<OrdersExt> list = userMapper.findOrdersAndUserRstMap();
	System.out.println(list);
	//关闭session
	session.close();
}
小结

使用resultMap进行结果映射时,具体是使用association完成关联查询的映射,将关联查询信息映射到pojo对象中。

一对多查询

需求
查询所有用户信息及用户关联的订单信息。

SQL语句

SELECT
	u.*,
	o.id oid,
	o.number,
	o.createtime,
	o.note
FROM
	`user` u
LEFT JOIN orders o ON u.id = o.user_id

主信息:用户信息
从信息:订单信息
分析
在一对多关联查询时,只能使用resultMap进行结果映射。
1、一对多关联查询时,sql查询结果有多条,而映射对象是一个。
2、resultType完成结果映射的方式的一条记录映射一个对象。
3、resultMap完成结果映射的方式是以[主信息]为主对象,[从信息]映射为集合或者对象,然后封装到主对象中。

修改po类

在User类中加入List orders属性

private List<Orders> orders;

Mapper映射文件

在UserMapper.xml文件中,添加以下代码:

<resultMap type="user" id="userAndOrderRstMap">
	<!-- 用户信息映射 -->
	<id property="id" column="id"/>
	<result property="username" column="username"/>
	<result property="birthday" column="birthday"/>
	<result property="sex" column="sex"/>
	<result property="address" column="address"/>
	<!-- 一对多关联映射 -->
	<collection property="orders" ofType="orders">
		<id property="id" column="oid"/>
		<result property="userId" column="id"/>
		<result property="number" column="number"/>
		<result property="createtime" column="createtime"/>
		<result property="note" column="note"/>
	</collection>
</resultMap>
<select id="findUserAndOrderRstMap" resultMap="userAndOrderRstMap">
	SELECT
	u.*,
	o.id oid,
	o.number,
	o.createtime,
	o.note
	FROM
	`user` u
	LEFT JOIN orders o ON u.id = o.user_id
</select>

Collection标签:定义了一对多关联的结果映射。
property=“orders”**:关联查询的结果集存储在User对象的上哪个属性。
ofType=“orders”**:指定关联查询的结果集中的对象类型即List中的对象类型。此处可以使用别名,也
可以使用全限定名。

Mapper接口

public List<User> findUserAndOrdersRstMap() throws Exception;

测试代码

@Test
public void testFindUserAndOrdersRstMap() {
	SqlSession session = sqlSessionFactory.openSession();
	UserMapper userMapper = session.getMapper(UserMapper.class);
	List<User> result = userMapper.findUserAndOrdersRstMap();
	for (User user : result) {
		System.out.println(user);
	}
	session.close();
}

http://www.kler.cn/a/522242.html

相关文章:

  • Vuex中的getter和mutation有什么区别
  • 【llm对话系统】大模型 RAG 之回答生成:融合检索信息,生成精准答案
  • 解读隐私保护工具 Fluidkey:如何畅游链上世界而不暴露地址?
  • 树状数组讲解
  • 软考信安27~Windows操作系统安全相关
  • 特权模式docker逃逸
  • OPencv3.4.1安装及配置教程
  • 20.Word:小谢-病毒知识的科普文章❗【38】
  • freeswitch在centos上编译过程
  • 白平衡与色温:摄影中的色彩密码
  • 2025_1_27 C语言内存,递归,汉诺塔问题
  • 二叉树(补充)
  • 51单片机开发:IO扩展(串转并)实验
  • 基于单片机的家用无线火灾报警系统的设计
  • PETSc源码分析: Time Integrators
  • 将 OneLake 数据索引到 Elasticsearch - 第 1 部分
  • C语言中的static关键字在函数和变量声明中的不同作用是什么?
  • AI学习指南Ollama篇-Ollama模型的量化与优化
  • MMDetection 详细安装过程
  • Elasticsearch的索引生命周期管理
  • RocketMQ实战—1.订单系统面临的技术挑战
  • 使用 OpenResty 构建高效的动态图片水印代理服务20250127
  • 批量处理多个模型的预测任务
  • 甘油单油酸酯行业分析
  • 常见的多媒体框架(FFmpeg GStreamer DirectShow AVFoundation OpenMax)
  • Autogen_core: Tool Use