mybatis动态sql一对多查询
在数据库设计中,一对多关系是非常多的,例如消息通知和附件,一个消息通知中往往会包含多个附件,这种情况下使用mybatis动态sql可以很方便的查询出来。
1、数据库设计
消息表:sys_message
CREATE TABLE `sys_message` (`id` varchar(40) COLLATE utf8mb4_unicode_ci NOT NULL,`title` varchar(200) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '标题',`content` mediumtext COLLATE utf8mb4_unicode_ci COMMENT '内容',`message_fk` varchar(40) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '附件fk'PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='消息管理';
附件表:sys_attachment
CREATE TABLE `sys_attachment` (`id` varchar(40) NOT NULL COMMENT '主键',`file_name` varchar(50) NOT NULL COMMENT '原文件名',`storing_name` varchar(100) NOT NULL COMMENT '存储文件名',`size` bigint(20) NOT NULL COMMENT '大小',`fk` varchar(40) NOT NULL COMMENT '业务主键',`suffix_type` tinyint(4) DEFAULT NULL COMMENT '类型(后缀)',`file_type` tinyint(4) DEFAULT '0' COMMENT '文件类型:0其他 1图片 2视频',`url` varchar(200) NOT NULL COMMENT '访问地址',`absolute_path` varchar(200) NOT NULL COMMENT '绝对路径',PRIMARY KEY (`id`)
)
一条消息对应多个附件,附件表中的 fk
引用消息表的message_fk
。
2、实现
返回类型是Message
对象,其中有一个 List<SysAttachment> fileList
,存储附件信息。
public class SysMessage extends LaboratoryBaseModel<SysMessage> {private static final long serialVersionUID=1L; @TableField("id")private String id;@TableField("title")private String title;@TableField("content")private String content;@TableField("message_fk")private String messageFk;@TableField(exist = false)private List<SysAttachment> fileList;}
这种情况下,在动态sql的标签中,返回值只能使用resultMap
属性接收:
<select id="selectMessagePage" resultMap="sysMessageMap">SELECT*FROMsys_message a
</select>
resultMap是一个外部结果映射关系的引用,描述了结果数据的映射关系,在resultMap中有一个 collection
标签,分别是:
- column:message表的message_fk,即一对多的一中被引用的字段名
- property:SysMessage中fileList属性,属性名是fileList
- javaType:SysMessage中fileList属性的对应的java类型Arraylist
- ofType:javaType的数据类型SysAttachment
- select:需要引用的select标签的名字,
<select id="selectFileByFk">
实际上, collection
标签的含义是:对于每一条【消息查询】的结果,都要根据message_fk去到执行select属性中的查询语句,将查询结果封装到fileList属性。其中column属性会当作参数传递<select id="selectFileByFk">
标签中。
<resultMap id="sysMessageMap" type="cn.xxx.model.SysMessage"><result property="id" column="id"/><result property="title" column="title"/><result property="content" column="content"/><result property="messageFk" column="message_fk"/><collection column="message_fk"property="fileList"javaType="Arraylist"ofType="cn.yibiao163.laboratory.model.SysAttachment"select="selectFileByFk"></collection></resultMap>
<select id="selectFileByFk" resultMap="cn.xxx.repository.SysAttachmentMapper.sysAttachmentMap">select * from sys_attachment where is_deleted = 0 and fk = #{message_fk}
</select>
<select id="selectFileByFk"
标签中,使用了resultMap="cn.yibiao163.laboratory.repository.SysAttachmentMapper.sysAttachmentMap"
,除了resultMap还有一个 resultType
属性,可以配置一个java类,用来转换sql语句执行的结果。应用如下:
<select id="selectFileByFk" resultType="cn.xxx.model.SysAttachment">select * from sys_attachment where is_deleted = 0 and fk = #{message_fk}
</select>
public class SysAttachment extends LaboratoryBaseModel<SysAttachment> {private static final long serialVersionUID=1L;@TableField("file_name")private String fileName;@TableField("storing_name")private String storingName;@TableField("size")private Long size;@TableField("fk")private String fk;@TableField("suffix_type")private String suffixType;@TableField("file_type")private Integer fileType;@TableField("url")private String url;@TableField("absolute_path")private String absolutePath;}
3、完整mapper.xml
<resultMap id="sysMessageMap" type="cn.yibiao163.laboratory.model.SysMessage"><result property="id" column="id"/><result property="title" column="title"/><result property="content" column="content"/><result property="messageFk" column="message_fk"/><collection column="message_fk"property="fileList"javaType="Arraylist"ofType="cn.yibiao163.laboratory.model.SysAttachment"select="selectFileByFk"></collection>
</resultMap><select id="selectMessagePage" resultMap="sysMessageMap">SELECT*FROMsys_message a
</select><select id="selectFileByFk" resultType="cn.xxx.model.SysAttachment">select * from sys_attachment where is_deleted = 0 and fk = #{message_fk}
</select>
相关文章:
mybatis动态sql一对多查询
在数据库设计中,一对多关系是非常多的,例如消息通知和附件,一个消息通知中往往会包含多个附件,这种情况下使用mybatis动态sql可以很方便的查询出来。 1、数据库设计 消息表:sys_message CREATE TABLE sys_message (i…...

Leetcode.2316 统计无向图中无法互相到达点对数
题目链接 Leetcode.2316 统计无向图中无法互相到达点对数 rating : 1604 题目描述 给你一个整数 n n n ,表示一张 无向图 中有 n n n 个节点,编号为 0 0 0 到 n − 1 n - 1 n−1 。同时给你一个二维整数数组 e d g e s edges edges ,其…...
介绍机器学习中CatBoost工具的详细使用指南
在机器学习的动态世界中,Python 是创新背后的驱动力,专业人士必须使用正确的工具。CatBoost 就是这样一个工具,以其卓越的速度和准确性悄然改变了该领域。在本指南中,我们将深入研究 Python 3 中的 CatBoost,涵盖基础知识、高级技术和实际示例,包括使用示例数据集和绘图进…...
操作系统【OS】线程与进程的比较
进程 线程 是什么的单位? 是资源分配的基本单位 是调度的基本单位 不能共享什么? 不能共享虚拟地址空间 不能共享栈指针 可以共享什么? 拥有一个完整的资源平台 每个进程都有独立的地址空间和资源 除了共享全局变量,不允许其他进程访问 某进程中的线程…...

在Mac上使用安卓桌面模式
在安装Homeblew的基础上 替换国内源 export HOMEBREW_API_DOMAIN"https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles/api" export HOMEBREW_BREW_GIT_REMOTE"https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/brew.git" brew update 安装Scrcpy …...

YOLO目标检测——人脸口罩佩戴数据集【(含对应voc、coco和yolo三种格式标签】
实际项目应用:公共场所监控场景下的大密度人群检测是否佩戴口罩,以及戴口罩的人证比对(安检刷脸不用摘口罩)、手机解锁、刷脸考勤等身份认证场景。数据集说明:人脸口罩佩戴检测数据集,真实场景的高质量图片…...

mongodb如何多表查询,如同时查询店铺以及里面对应的商品
多表查询场景介绍 一种很常见的场景,比如电商首页中,需要同时展示最近比较火热的店铺,以及直接展示店铺里对应的商品。或者用户下单之后购物车里可以看到所选的商品以及对应的店铺。如果不知道如何用mongodb自带的查询语句快速查询的话&#…...
Linux环境修改服务器时间和网络时间保持一致
目录 介绍UTC和CST 修改时区 修改时间 介绍UTC和CST UTC是协调世界时,是全球统一的时间标准。UTC的时间是基于原子钟计算的,以秒为单位,不受夏令时等影响。世界各地都可以通过UTC来同步时间。 CST是中央标准时间,相当于UTC-6…...

CUDA学习笔记6——事件计时
事件计时 CUDA事件是直接在GPU上实现的,因此它们不适用于对同时包含设备代码和主机代码的混合代码计时。 cudaEventCreate 创建一个事件cudaEventRecord 记录一个事件cudaEventElapsedTime 计算两个事件之间经历的时间,第一个参数为某个浮点变量的地址…...
使用vscode调试ffmpeg源码
ffmpeg的编译配置 # --enable-debug 设置为调试级别 # --disable-stripping 如果不加此选项,会strip去掉符号信息 ./configure --prefix{output_path} --enable-debug --disable-stripping make -j10VSCode的配置 将以下文件对比替换工程.vscode目录下的相同文件 …...

微信小程序--数字化会议OA系统之首页搭建
一、Flex弹性布局 布局的传统解决方案,基于盒状模型,依赖 display属性 position属性 float属性。它对于那些特殊布局非常不方便,比如,垂直居中就不容易实现。 2009年,W3C提出了一种新的方案—-Flex布局,可…...

代码随想录算法训练营第六十天 | 739. 每日温度、496.下一个更大元素 I
739. 每日温度 链接: 代码随想录 (1)代码 496.下一个更大元素 I 链接: 代码随想录 (1)代码...
WebView 以及如何测试
混合应用 顾名思义,它们是本机应用程序和 Web 应用程序的混合体。它们可以在应用程序商店中下载,并且需要像本机应用程序一样从设备进行访问身份验证,但它们也有一个嵌入在应用程序中的浏览器(WebView)用于呈现 HTML。…...

Jetpack:013-Jetpack底部导航栏
文章目录 1. 概念介绍2. 使用方法2.1 NavigationBar2.2 NavigationBarItem 3. 示例代码3.1 代码和注释3.2 代码难点3.3 运行效果 4. 内容总结 我们在上一章回中介绍了Jetpack中弹出菜单相关的内容,本章回中将介绍 底部导航栏。闲话休提,让我们一起Talk …...
MATLAB - excel 读取
matlab中excel 读取 1. 写入excel文件 - xlswrite2. 读取excel文件 - xlsread 1. 写入excel文件 - xlswrite xlswrite(filename,A,sheet,xlRange) % 写入字符串 % 注意事项:Str需要是Cell格式,否则一个字母占一格 % Str {‘abc’}; xlswr…...

【AIGC核心技术剖析】Hotshot-XL 一种 AI 文本转 GIF 模型(论文 + 代码:经过训练可与Stable Diffusion XL一起使用)
Hotshot-XL 是一种 AI 文本转 GIF 模型,经过训练可与Stable Diffusion XL一起使用。 Hotshot-XL 可以使用任何经过微调的 SDXL 模型生成 GIF。这意味着两件事: 您将能够使用您可能想要使用的任何现有或新微调的 SDXL 模型制作 GIF。 如果您想制作个性化主题的 GIF,您可以…...
2023年9月青少年软件编程(C 语言) 等级考试试卷(八级)
2023年9月青少年软件编程(C 语言) 等级考试试卷(八级) 第 1 题 最短路径问题 平面上有n个点(n<100),每个点的坐标均在-10000~10000之间。其中的一些点之间有连线。 若有连线࿰…...

MS17010(永恒之蓝)漏洞实战
曾因苦难多壮志,不教红尘惑坚心。 工具检测 实战过程 使用搜索命令,搜索ms17_010 search ms17_010 搜索网段中主机漏洞 use auxiliary/scanner/smb/smb_ms17_010 照例,show options 看一下配置 设置网段,run运行就行了 使用攻…...
ROS自学笔记十三:VScode的介绍和安装
Visual Studio Code(简称VS Code)是一款由Microsoft开发的免费、轻量级、开源的集成开发环境(IDE)。它支持多种编程语言,并且具有丰富的扩展系统,使得用户可以根据自己的需求自定义和扩展功能。 以下是VS …...

操作系统【OS】微内核
基本概念 微内核结构将操作系统划分为两大部分:微内核多个服务器微内核包含: 与硬件处理紧密相关的部分一些较基本的功能客户和服务器间的通信客户与服务器之间是借助微内核提供的消息传递机制来实现交互的 基本功能 进程管理 进程的通信、切换、调度…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...

ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...

网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...