JavaEE简单实例——MyBatis一对多关联映射的嵌套结果集查询
简单介绍:
在之前的章节,我们简单介绍了MyBatis中的一对一的关联查询,使用了嵌套查询和嵌套结果集两种方式进行讲解,但是在实际的使用中,我们常用的是嵌套结果集的查询方式,所以在一对多的查询中,我们也只针对嵌套结果集的查询方式进行讲解。嵌套结果集映射的核心思想就是通过一条SQL语句查询两个表,然后把两个表中查询出来的字段自定义映射到两个实体类中,最后实体类再进行嵌套。
如果之前已经熟练掌握或者能理解一对一查询中的各个标签的使用,在一对多的查询中的原理也是基本一样的,只不过是将配置一对一查询中的<association>标签换成了<collection>标签,并且增加了一个新的属性叫做ofType,这个属性的值就是我们List列表中的属性的类,关于这个属性我们会在后面使用的时候进行详细的演示。
我们首先来复习一下一对多的数据表查询结构:

那么,对应到SQL语句中就是下面这样:

查询结果如下:
简单地说,就是一张表中的一列数据可以对应另一张表的多行数据,就像这个查询结果一样,张三的信息可以查询出两条订单信息,但是每一条订单信息的只属于张三一个人。
对应到Java类中的效果如下:

查询出多条信息对应就是B类的集合,而B类的每一条信息只能对应一个A类。
使用方法:
<!-- 配置一对多的查询--><select id="one_more_select" resultMap="one_more_mappers" parameterType="int">select u.id , u.name , u.sex , u.order_id uoid , o.order_id ooid , o.order_information from user u,orders o where u.order_id = o.order_id and u.id = #{id}</select><resultMap id="one_more_mappers" type="User"><result property="id" column="id"/><result property="name" column="name"/><result property="sex" column="sex"/><collection property="ListOrder" ofType="Orders" javaType="java.util.List"><result property="order_id" column="ooid"/><result property="order_information" column="order_information"/></collection></resultMap>
在实现一对多的嵌套结果集映射中, 我们需要使用一个新的标签:<collection>,使用这个标签配置一对多的嵌套结果集查询,使用一个特殊的属性,ofType:这个属性的含义是指出我们需要填充进List集合中的反省的类型,也就是B类的类型:

只要掌握了这个标签和属性的使用之后,剩下的就和之前的嵌套结果集查询的写法是一样的了,接下来我们来进行完整的代码演示。
代码实现:
数据库内的数据:

SQL映射文件:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- 接口式开发有两个规范: -->
<!--1.接口中方法的名称必须与SQL语句的唯一标识,也就是id的值保持一致,resultType就是接口中返回值的类型,parameterType就是接口中方法的参数的类型-->
<!-- 2.mapper标签的namespace属性必须是接口的全路径,否则在运行的时候会无法找到接口对象的SQL映射文件 -->
<mapper namespace="mappers.one_more_select"><!-- 根据id查询单条数据--><select id="selectOne" resultType="user" parameterType="int">select *from userwhere id = #{id};</select><!-- 查询所有的数据--><select id="selectAll" resultType="user">select *from user;</select>
<!-- 配置一对多的查询--><select id="one_more_select" resultMap="one_more_mappers" parameterType="int">select u.id , u.name , u.sex , u.order_id uoid , o.order_id ooid , o.order_information from user u,orders o where u.order_id = o.order_id and u.id = #{id}</select><resultMap id="one_more_mappers" type="User"><result property="id" column="id"/><result property="name" column="name"/><result property="sex" column="sex"/><collection property="ListOrder" ofType="Orders" javaType="java.util.List"><result property="order_id" column="ooid"/><result property="order_information" column="order_information"/></collection></resultMap>
</mapper>
接口文件:
package mappers;import com.mybatis.POJO.User;import java.util.List;public interface one_more_select {public User selectOne(int i);public List<User> selectAll();public List<User> one_more_select(int i);
}
实体类:
package com.mybatis.POJO;import java.util.List;public class User{private int id;private String name;private String sex;private List<Orders> ListOrder;public User() {}public User(int id, String name, String sex, List<Orders> listOrder) {this.id = id;this.name = name;this.sex = sex;ListOrder = listOrder;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public List<Orders> getListOrder() {return ListOrder;}public void setListOrder(List<Orders> listOrder) {ListOrder = listOrder;}@Overridepublic String toString() {return "com.mybatis.POJO.User{" +"id=" + id +", name='" + name + '\'' +", sex='" + sex + '\'' +", ListOrder=" + ListOrder +'}';}
}
package com.mybatis.POJO;public class Orders {private int order_id;private String order_information;public Orders() {}public Orders(int order_id, String order_information) {this.order_id = order_id;this.order_information = order_information;}public int getOrder_id() {return order_id;}public void setOrder_id(int order_id) {this.order_id = order_id;}public String getOrder_information() {return order_information;}public void setOrder_information(String order_information) {this.order_information = order_information;}@Overridepublic String toString() {return "orders{" + '\n' +"order_id=" + order_id +", order_information='" + order_information + '\'' +'}'+'\n';}
}
测试类:
package mappers;import com.mybatis.POJO.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;import java.io.InputStream;public class one_more_selectTest {SqlSession session = null;one_more_select mapper = null;@Beforepublic void setUp() throws Exception {InputStream stream = Resources.getResourceAsStream("mybatis.xml");SqlSessionFactory build = new SqlSessionFactoryBuilder().build(stream);session = build.openSession(true);mapper = session.getMapper(one_more_select.class);}@Testpublic void testSelectOne() {User user = mapper.selectOne(1);System.out.println(user);}@Testpublic void testSelectAll() {for (User user : mapper.selectAll()) {System.out.println(user.toString());}}@Testpublic void testOne_more_mappers() {for (User oneMoreMapper : mapper.one_more_select(2)) {System.out.println(oneMoreMapper.toString());}}
}
注意点:
在这个案例中我们需要注意的是A类和B类的嵌套关系一定要清楚,以及ofTyoe的类型一定是B类的属性值,最后就是在自定义映射规则的时候一定要确定规则的正确,对应好每一个列和属性的映射关系。如果发现自己最后的查询结果和自己预期的不一致,首先去检查映射规则是否配置正确。
相关文章:
JavaEE简单实例——MyBatis一对多关联映射的嵌套结果集查询
简单介绍: 在之前的章节,我们简单介绍了MyBatis中的一对一的关联查询,使用了嵌套查询和嵌套结果集两种方式进行讲解,但是在实际的使用中,我们常用的是嵌套结果集的查询方式,所以在一对多的查询中ÿ…...
大数据框架之Hadoop:MapReduce(三)MapReduce框架原理——OutputFormat数据输出
3.6.1OutputFormat接口实现类 OutputFormat是MapReduce输出的基类,所有实现MapReduce输出都实现了OutputFormat接口。下面我们介绍几种常见的OutputFormat实现类。 1、文本输出TextOutputFormat 默认的输出格式是TextOutputFormat,它把每条记录写为文…...
Linux搜索、编辑
目录 1.搜索 1.1.基础用法 1.2.高级用法 2.编辑 2.1.vim简洁 2.2.vim快捷键 1.搜索 1.1.基础用法 find命令用于搜索,格式如下: find 指定目录 -匹配方式 所要匹配的关键字 所要匹配的关键字支持通配符,?代表一个字符*代表任意个字符。 如果想设…...
Git Commit提交规范总结
文章目录前言git commit 提交规范提交消息头(commit message header)提交消息具体内容(commit message body)提交消息尾述(commit message footer)Revert表情(Emojis)标识idea插件其他操作Commitizen生成 Change logGit获取提交消息格式化输出相关参考前言 我们都知道…...
【ESP 保姆级教程】疯狂毕设篇 —— 案例:基于ESP8266和EMQX的教室灯光控制系统
忘记过去,超越自己 ❤️ 博客主页 单片机菜鸟哥,一个野生非专业硬件IOT爱好者 ❤️❤️ 本篇创建记录 2023-02-26 ❤️❤️ 本篇更新记录 2022-02-26 ❤️🎉 欢迎关注 🔎点赞 👍收藏 ⭐️留言📝🙏 此博客均由博主单独编写,不存在任何商业团队运营,如发现错误,请…...
SpringBoot (一) 项目构建、配置读取、静态资源定义
哈喽,大家好,我是有勇气的牛排(全网同名)🐮 有问题的小伙伴欢迎在文末评论,点赞、收藏是对我最大的支持!!!。 前言 SpringBoot是基于Spring开发的开源项目,…...
<JVM上篇:内存与垃圾回收篇>12 - 垃圾回收相关概念
笔记来源:尚硅谷 JVM 全套教程,百万播放,全网巅峰(宋红康详解 java 虚拟机) 文章目录12.1. System.gc()的理解12.2. 内存溢出与内存泄露内存溢出(OOM)内存泄漏(Memory Leakÿ…...
new操作符做了什么?
new是什么? new 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例。 function Person (name,age) {this.name namethis.age age } Person.prototype.sayName function () {console.log(this.name) } let man new Person(xl,20) consol…...
Java_IO流,书城IO版
1.字符IO流的输入/输出 首先,IO流根据多方面划分。 根据方向划分 输入流/输出流根据处理单元划分 字节流/字符流根据功能划分 节点流/处理流 尝试一下使用字符输入流在读写文件: package IOStream;import java.io.*;public class Test {public stati…...
2023自动化测试岗位需求的 7 项必备技能 (最新版)
目录:导读 一、自动化测试员技能——编程语言 二、自动化测试员技能–出色的手动测试技能 三、.自动化测试员技能–自动化工具专业知识 四、自动化测试员技能–了解业务需求 五、自动化测试员技能–自动化工具故障排除 六、自动化测试员技能–具有测试管理工具…...
【华为OD机试模拟题】用 C++ 实现 - 路灯照明(2023.Q1)
最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 去重求和(2023.Q1) 文章目录 最近更新的博客使用说明路灯照明【华为OD机试模拟题】题目输入输出描述示例一输入输出说明Code使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高…...
学到贫血之-贫血模型和充血模型
学习自:设计模式之美 1 基于贫血模型的传统开发模式 // ControllerVO(View Object) public class UserController {private UserService userService; //通过构造函数或者IOC框架注入public UserVo getUserById(Long userId) {UserBo userBo userService.getUser…...
Java常用组件面试题
文章目录HTTP通信协议Kafka消息队列Linux操作系统Mybatis框架SpringCloud框架HTTP通信协议 https通信过程 https协议是指对通过http协议传输数据的进行加密和解密。当客户端发送https请求时,服务端会返回数字证书给客户端,客户端验证通过后会生成随机数…...
MySQL常见问题的解决方法
目录 cmd没有管理员权限 没有my.ini这个文件 ERROR 1045 (28000): Access denied for user ODBClocalhost (using password: NO) ERROR 1045 (28000): Access denied for user rootlocalhost (using password: NO) 其他常见问题 cmd没有管理员权限 cmd一定要用管理员权限打…...
全网详细介绍nginx的反向代理、正向代理配置,location的指令说明,反向代理的两个示例代码以及全局块,events块和http快的说明。
文章目录1. 文章引言2. 何谓反向代理3. 解析nginx的配置文件3.1 全局块(global block)3.2 events块(events block)3.3 http块(http block)4. 如何配置反向代理4.1 反向代理示例14.2 反向代理示例25. 补充说明5.1 location指令说明5.2 nginx完整配置文件1. 文章引言 如果你的服务…...
容斥恒等式的证明
容斥恒等式的证明 推广公式 P(A∪B)P(A)P(B)−P(A∩B)P(A\cup B)P(A)P(B)-P(A\cap B) P(A∪B)P(A)P(B)−P(A∩B) (a)设A、B、C为三个事件,则下列恒等式成立: P(A∪B∪C)P(A)P(B)P(C)−P(A∩B)−P(A∩C)−P(B∩C)P(A∩B∩C)P(A\cup B\cup C)P(A)P(B)P(C)…...
Java中的this与super关键字深度解析
一、this关键字this 关键字是 Java 常用的关键字,可用于任何实例方法内指向当前对象,也可指向对其调用当前方法的对象,或者在需要当前类型对象引用时使用。(1)this.属性名this修饰的变量用于指代成员变量方法的形参如果…...
CSS3新增的视口单位Vh、Vw单位
定义vw:浏览器可见视口【宽度】的百分比(1vw代表视窗【宽度】的1%)vh:浏览器可见视口【高度】的百分比(1vw代表视窗【高度】的1%)vmin:当前 vw 和 vh 较小的一个值。vmax:当前 vw 和…...
【Linux】yum安装docker指定版本
🍁博主简介 🏅云计算领域优质创作者 🏅华为云开发者社区专家博主 🏅阿里云开发者社区专家博主 💊交流社区:运维交流社区 欢迎大家的加入! 文章目录卸载已有的docker部署指定版本docker安…...
SpringBoot相关操作
01-今日内容 Spring概述、快速入门SpringBoot配置SpringBoot整合 02-SpringBoot概述 SpringBoot提供了一种快速使用Spring的方式,基于约定优于配置的思想,可以让开发人员不必在配置与逻辑业务之间进行思维的切换,全身心的投入到逻辑业务的…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
[ACTF2020 新生赛]Include 1(php://filter伪协议)
题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...
【UE5 C++】通过文件对话框获取选择文件的路径
目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 ,这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器,右键点击 .uproject 文件,选择 "Generate Visual Studio project files",重…...
医疗AI模型可解释性编程研究:基于SHAP、LIME与Anchor
1 医疗树模型与可解释人工智能基础 医疗领域的人工智能应用正迅速从理论研究转向临床实践,在这一过程中,模型可解释性已成为确保AI系统被医疗专业人员接受和信任的关键因素。基于树模型的集成算法(如RandomForest、XGBoost、LightGBM)因其卓越的预测性能和相对良好的解释性…...
