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

mybatis多表查询

多表查询有哪些情况

Mybatis 支持多表查询,常见的多表查询方式包括使用嵌套查询和关联查询

嵌套查询

嵌套查询是指在 SQL
语句中嵌套另外一个查询语句,可以用于在一个表中查询与另一表相关的数据。例如,在一个订单表中同时需要查询该订单所属用户的信息,可以使用嵌套查询。

假设我们有两个表,orders 表和 user 表,orders 表中有一个 user_id 字段,对应着 user 表中的 id 字段,下面是查询某个订单和对应的用户信息的 SQL 语句:

SELECT o.*, u.*
FROM orders o
INNER JOIN user u ON u.id = o.user_id
WHERE o.order_no = '001'

这里使用了 INNER JOIN 进行内连接,将 orders 表和 user 表连接在一起,查询条件为 o.order_no = ‘001’。SELECT 语句中指定了要返回的字段,由于两个表中可能有重复的字段,所以用 o.* 和 u.* 表示要返回的所有字段

在 Mybatis 中实现嵌套查询可以使用 resultMap 标签来定义查询结果映射,下面是一个示例:

<resultMap id="orderUserMap" type="Order"><id property="id" column="id"/><result property="orderNo" column="order_no"/><!-- 其他订单相关字段 --><association property="user" javaType="User"><id property="id" column="id"/><result property="username" column="username"/><!-- 其他用户相关字段 --></association>
</resultMap><select id="selectOrderWithUser" resultMap="orderUserMap">SELECT o.*, u.*FROM orders oINNER JOIN user u ON u.id = o.user_idWHERE o.order_no = #{orderNo}
</select>

其中, 定义了 Order 类和 User 类的属性映射,关键字 id 表示主键property 指定类属性名column 指定字段对应的列名

在 resultMap 中使用 标签来表示一个查询结果需要关联另外一个对象,这里用于关联订单和用户。property 指定类属性名,javaType 指定关联对象的类型,其他属性映射同上。

最后,在 中使用 resultMap 属性绑定映射关系,#{orderNo} 表示动态参数。

关联查询

关联查询是常用的一种多表查询方式,可以使用 Mybatis 提供的关联标签来实现。

假设我们有两个表,orders 表和 user 表,orders 表中有一个 user_id 字段,对应着 user 表中的 id 字段,下面是查询所有订单及对应用户的 SQL 语句:

SELECT o.*, u.*
FROM orders o
LEFT JOIN user u ON u.id = o.user_id

这里使用 LEFT JOIN 进行左连接,将 orders 表和 user 表连接在一起,查询所有记录。由于有可能存在订单没有对应用户,所以需要使用左连接进行查询。

在 Mybatis 中实现关联查询可以使用 association 和 collection 标签,它们分别用于表示一对一关联和一对多关联关系。下面我们分别来看一下:

一对一关联查询

首先定义 Order 类和 User 类,其中 Order 类中有一个 user 属性:

public class Order {private Integer id;private String orderNo;private Integer userId;private User user;// 省略 getter/setter
}

定义 OrderMapper 接口:

public interface OrderMapper {List<Order> selectAllOrdersWithUser();
}

然后在 OrderMapper.xml 文件中实现多表查询:

<select id="selectAllOrdersWithUser" resultMap="orderWithUserMap">SELECT o.*, u.*FROM orders oLEFT JOIN user u on u.id = o.user_id
</select><resultMap type="Order" id="orderWithUserMap"><id column="id" property="id"/><result column="order_no" property="orderNo"/><!-- 其他订单相关字段 --><association property="user" column="user_id" javaType="User" select="selectUserById"/>
</resultMap><select id="selectUserById" parameterType="int" resultType="User">SELECT * FROM user WHERE id = #{id}
</select>

其中,resultMap 定义了 Order 类的属性映射使用 <association> 标签表示一对一关联column 表示关联条件字段select 表示关联查询的 SQL 语句

在上述示例中,我们定义了 selectUserById 这个查询语句,用于根据用户 id 查询用户信息。在 association 标签中指定了 select 属性后,Mybatis 会自动根据这个语句进行关联查询。

最后,我们只需要在 OrderMapper 接口中调用 selectAllOrdersWithUser() 方法即可完成多表查询:

List<Order> orders = orderMapper.selectAllOrdersWithUser();

一对多关联查询

在一对多关联查询中,需要定义一个中间表来存储两个实体之间的关联,例如定义 Order 类OrderItem 类,中间表是 order_item

首先定义 OrderItem 类和 Order 类,其中 Order 类中有一个 orderItems 属性

public class OrderItem {private Integer id;private Integer orderId;private String itemName;private Double itemPrice;
}public class Order {private Integer id;private String orderNo;private List<OrderItem> orderItems;// 省略 getter/setter
}

定义 OrderMapper 接口:

public interface OrderMapper {List<Order> selectAllOrdersWithItems();
}

然后在 OrderMapper.xml 文件中实现多表查询:

<select id="selectAllOrdersWithItems" resultMap="orderWithItemsMap">SELECT o.*, oi.*FROM orders oLEFT JOIN order_item oi on oi.order_id = o.id
</select><resultMap type="Order" id="orderWithItemsMap"><id column="id" property="id"/><result column="order_no" property="orderNo"/><!-- 其他订单相关字段 --><collection property="orderItems" ofType="OrderItem" ><id column="id" property="id"/><result column="item_name" property="itemName"/><result column="item_price" property="itemPrice"/><association property="order" column="order_id" javaType="Order" select="selectAllOrdersWithItems"/></collection>
</resultMap>

其中,resultMap 定义了 Order 类的属性映射,使用 <collection> 标签表示一对多关联,column 表示关联条件字段,select 表示关联查询的 SQL 语句。

在上述示例中,我们定义了 selectAllOrdersWithItems 这个查询语句,用于查询所有订单和订单明细信息。在 <collection> 标签中指定了 select 属性后,Mybatis 会自动根据这个语句进行关联查询。

最后,我们只需要在 OrderMapper 接口中调用 selectAllOrdersWithItems() 方法即可完成多表查询:

List<Order> orders = orderMapper.selectAllOrdersWithItems();

相关文章:

mybatis多表查询

多表查询有哪些情况 Mybatis 支持多表查询&#xff0c;常见的多表查询方式包括使用嵌套查询和关联查询 嵌套查询 嵌套查询是指在 SQL 语句中嵌套另外一个查询语句&#xff0c;可以用于在一个表中查询与另一表相关的数据。例如&#xff0c;在一个订单表中同时需要查询该订单所属…...

kafka 从入门到精通

kafka 安装 zookeeper模式 创建软件目录 mkdir /opt/soft cd /opt/soft下载 wget https://downloads.apache.org/kafka/3.4.0/kafka_2.13-3.4.0.tgz解压 tar -zxvf kafka_2.13-3.4.0.tgz 修改目录名称 mv kafka_2.13-3.4.0 kafka配置环境变量 vim /etc/profileexport K…...

写PPT没有思路, 这些底层方法论让你灵感爆棚……

作为一个10年经验的策划人&#xff0c;以下是个人多年经验&#xff0c;看完绝对对你写PPT会有很大帮助&#xff01; 首先&#xff0c;有很多新手写PPT有一个不好的习惯&#xff0c;就是喜欢直接上手就打开PPT开始啪啪啪打字。 这是非常错误的&#xff0c;这就等于你是想到哪写…...

【小沐学Python】Python实现Web服务器(Flask+Vue+node.js,web单页增删改查)

文章目录 1、简介1.1 flask1.2 vue 2、开发2.1 新建flask项目2.2 安装flask库2.3 新建flask的主脚本2.4 新建Vue项目2.5 安装vue项目依赖项2.6 新增组件Ping.vue2.7 Ping.vue增加HTTP请求2.8 美化vue前端页面2.9 新增组件Books.vue2.10 flask增加路由Books2.11 Books.vue增加HT…...

甘肃非煤矿山电子封条 智慧矿山 opencv

甘肃非煤矿山电子封条 智慧煤矿接入国家矿山安全平台是通过pythonopencv网络模型&#xff0c;甘肃非煤矿山电子封条pythonopencv网络模型对关键位置&#xff08;回风井口、运人井口、车辆出入口&#xff09;对现场人员行为、数量、穿戴着装及设备状态各数据进行实时监控分析。p…...

工业识别与定位系统源码解决方案

工厂人员定位系统源码&#xff0c;工业领域定位系统源码 近年来人员定位系统在工业领域的发展势头迅猛&#xff0c;工业识别与定位成为促进制造业数字化的关键技术。通过实时定位可以判断所有的人、物、车的位置。实时定位系统要适用于复杂工业环境&#xff0c;单一技术是很难…...

PCL学习之滤波算法

前言 点云滤波作为常见的点云处理算法&#xff0c;一般是点云处理的第一步&#xff0c;对后续处理有很重要作用。滤波 有很多方面也有很多种功能&#xff0c;比如去除噪声点、离群点、点云平滑以及空洞、数据压缩等 原始点云数据往往包含大量散列点、孤立点&#xff0c;在获取…...

第二章 链表

目录 一、移除链表元素二、设计链表三、反转链表四、两两交换链表中的节点五、删除链表倒数第N个节点六、链表相交七、环形链表Ⅱ 一、移除链表元素 Leetcode 203 class Solution { public:ListNode* removeElements(ListNode* head, int val) {ListNode* dummyHead new Lis…...

Spring Security OAuth2实现单点登录:简化多个系统之间的登录流程

Spring Security OAuth2实现单点登录&#xff1a;简化多个系统之间的登录流程 一、介绍OAuth21. OAuth2的定义和作用2. OAuth2的优点和使用场景 二、Spring Security1. Spring Security的介绍2. Spring Security的特点和优势 三、OAuth2与Spring Security的结合1. OAuth2在Spri…...

语义分析器

语义分析器&#xff08;Semantic Analyzer&#xff09;是编译器中的一个重要组成部分&#xff0c;它负责对源代码进行语义分析&#xff0c;检查源代码是否符合语义规范&#xff0c;并进行错误处理和类型推导等操作。 举个例子&#xff0c;假设有以下的源代码&#xff1a; int…...

爬虫基本原理

爬虫基本原理 1.1获取网页1.1.1提取信息1.1.2保存数据 1.2请求1.2.1 请求方法1.2.2 请求网址1.2.3 请求头1.2.4请求体1.3响应 1.1获取网页 爬虫首先要做的工作就是获取网页&#xff0c;这里就是获取网页的源代码。源代码里包含了网页的部分有用信息&#xff0c;所以只要把源代…...

常见电子元器件和电路

目录 常见电子元器件一览表(字母标志)NTC(负温度系数热敏电阻)压敏电阻X2电容(抑制电源电磁干扰用电容器)泄放电阻共模电压共模电感整流桥滤波电容RCD吸收二极管Y电容整流器的原理输出整流肖特基二极管 功率晶体管&#xff08;GTR&#xff0c;三极管)双极型晶体管(BJT&#xff…...

English Learning - L3 Lesson1 VOA-Color 译文

听碎 VOA NOW, THE VOA SPECIAL ENGLISH PROGRAM WORDS AND THEIR STORIES Every people has its own way of saying things, its own special expressions. Many everyday American expressions are based on colors. 各国人民都有自己说话的方式&#xff0c;有自己独特的表…...

如何在linux中配置JDK环境变量

在linux系统部署皕杰报表&#xff0c;因皕杰报表是一款纯java报表工具&#xff0c;运行时需要jre环境&#xff0c;所以要在服务器上配置三个jdk环境变量path、classpath、JAVA_HOME。 那么为什么要配置jdk环境变量呢&#xff1f;因为java软件运行时要用到一些java命令&#xff…...

横截面收益率(二) 阿尔法策略是如何构建的

资本资产定价模型自从首次被提出以来在金融经济学中一直处于中心地位。 在一系列简化假定条件下&#xff0c;资本资产定价模型表明&#xff0c;任何证券的收益率与该证券 的系统性风险&#xff08;或者贝塔值&#xff09;呈线性关系。因此&#xff0c;依据资本资产定价模型横截…...

【ConfluxNews】2023.5.15 警惕任何未经合约审计的项目

1.【网络状态】当前版本V2.2.3&#xff0c;全网算力≈8T&#xff0c;昨日交易次数20K&#xff0c;昨日新增账户0.17K&#xff0c;昨日新增合约0个&#xff1b; 2.【POS参数】总锁仓275M&#xff0c;节点总数284&#xff0c;年利率13.7%&#xff08;理论计算&#xff09;&#x…...

MySQL学习---17、MySQL8其它新特性

1、MySQL新增特性 1.1 更简便的NoSQL支持 NoSQL泛指非关系型数据库和数据存储。随着互联网平台的规模飞速发展&#xff0c;传统的关系型数据库已经越来越不能瞒住需求。从5.6版本开始&#xff0c;MySQL就开始支持简单的NoSQL存储功能。MySQL 8对这一功能做了优化&#xff0c;…...

快速入门matlab——变量练习

学习目标&#xff1a;1.掌握matlab编程中最常用的几种变量类型 2.对变量类型的属性有所熟悉&#xff0c;不要求记忆&#xff0c;知道了解即可 3.要求熟练运用这几种变量类型创建自己的变量 clear all; % 清除Workspace中的所有…...

c++ 11标准模板(STL) std::set(三)

定义于头文件 <set> template< class Key, class Compare std::less<Key>, class Allocator std::allocator<Key> > class set;(1)namespace pmr { template <class Key, class Compare std::less<Key>> using se…...

ChatGPT详细介绍

ChatGPT: 自然语言处理的强大工具 ChatGPT是一种基于人工智能的自然语言处理模型&#xff0c;它是由OpenAI开发的一款先进的语言模型。ChatGPT基于GPT-3.5架构&#xff0c;具有强大的语言生成和理解能力。它被设计用于与人类进行自然对话&#xff0c;并提供广泛的应用场景。 …...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

智能AI电话机器人系统的识别能力现状与发展水平

一、引言 随着人工智能技术的飞速发展&#xff0c;AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术&#xff0c;在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码&#xff0c;而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库&#xff0c;可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画&#xff0c;可以包含在你的网页或应用项目中。 3.An…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

【C++进阶篇】智能指针

C内存管理终极指南&#xff1a;智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...

Web中间件--tomcat学习

Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机&#xff0c;它可以执行Java字节码。Java虚拟机是Java平台的一部分&#xff0c;Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...

python爬虫——气象数据爬取

一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用&#xff1a; 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests&#xff1a;发送 …...