[MySQL]——SQL预编译、动态sql
键盘敲烂,年薪30万🌈

目录
一、SQL的预编译
📕一条SQL语句的执行过程
📕弊端
📕预编译SQL的优势
📕两种参数占位符
📕小结
二、动态SQL
📕概念介绍:
📕案例:
📕动态SQL语句:
📕应用场景总结:
三、总结:
一、SQL的预编译
📕一条SQL语句的执行过程

📕弊端
- 3条SQL语句都是删除操作,但是经过语法解析,优化,编译会生成3条不同的SQL语句,降低性能也浪费空间。
delete from emp where id = 1;
delete from emp where id = 2;
delete from emp where id = 3;
//优化后执行3条不同的SQL语句
📕预编译SQL的优势
- 使用参数占位符#{}替代
- 预编译生成的SQL语句相同,故第二次、第三次,省去了解析和优化过程,提高性能
delete from emp where id = #{id};
-- 预编译后的SQL语句
delete from emp where id = ?;
预编译可防止SQL注入
下面是一个登户登录的校验,当你输入用户名和密码,点击登录,信息传到服务器,服务器端会从User表中查询有无该用户,以下是两种SQL语句的差别。
-- 用户登录校验
select username, password from user where username='张三' and password='123'-- 普通语句
select username, password from user where username='saggd' and password='' or '1'='1';-- 预编译SQL安全
select username, password from user where username=? ans password=?;
小结:
普通语句编译后会将参数以字符串的形式拼接到SQL语句中,这就造成了语句的恒成立
预编译SQL编译后将参数整体视为一个字符串,当语句开始执行时,才进行替换
📕两种参数占位符
#{}
- 执行SQL时,会将#{…}替换为?,生成预编译SQL,会自动设置参数值。
- 使用时机:参数传递,都使用#{…}
${}
- 拼接SQL。直接将参数拼接在SQL语句中,存在SQL注入问题。
- 使用时机:如果对表名、列表进行动态设置时使用。
📕小结
预编译SQL利用参数占位符编译生成的SQL语句相同,性能高效
可防止SQL注入
二、动态SQL
📕概念介绍:
随着用户的输入或外部条件的变化而变化的SQL语句,我们称为 动态SQL。
📕案例:

📕动态SQL语句:
<if>用于判断条件是否成立。使用test属性进行条件判断,如果条件为true,则拼接SQL。
用法:test属性为if的判断条件
实现:例如动态sql实现条件查询
<!-- 动态sql - if--><select id="select" resultType="com.itpan.pojo.Emp">select *from emp<where><if test="name != null">name like concat('%', #{name}, '%')</if><if test="gender != null">and gender = #{gender}</if><if test="begin != null and end != null">and entrydate between #{begin} and #{end}</if></where>order by update_time desc</select>
注意:
如果name字段为空,sql语句为select * from emp where and gender = #{gemder}……
引入<where></where>标签:
where 元素只会在子元素有内容的情况下才插入where子句。而且会自动去除子句的开头的AND 或OR
同理update时也要引入<set></set>标签去除多余 ,
<foreach>遍历集合或数组给字段赋值
属性介绍 :
- collection:集合或数组名
- item:要分割的字段名
- separator:每次遍历的分隔符
- open:遍历开始前拼接的片段
- close:遍历开始后拼接的片段
实现:例如实现批量删除
<!-- 批量删除元素-->
<!-- ids是List<Integer>集合><delete id="deleteById">delete from emp where id in<foreach collection="ids" item="id" separator="," open="(" close=")">#{id}</foreach></delete>
<sql>与<include>
- <sql>:定义可重用的 SQL 片段。
- <include>:通过属性refid,指定包含的sql片段。


📕应用场景总结:
<if>
- 用于判断条件是否成立,如果条件为true,则拼接SQL。
- 形式:<if test="name != null">…</if>
<where>
- where 元素只会在子元素有内容的情况下才插入where子句,而且会自动去除子句的开头的AND 或OR
<set>
- 动态地在行首插入 SET 关键字,并会删掉额外的逗号。(用在update语句中)
<foreach>
- 遍历集合或数组给字段赋值
- 形式<foreach collection=集合或数组名 item=字段名 separator="," open="(" close=")">
<sql><include>
- sql封装相同代码 include引入
三、总结:
🌈 动态SQL是重点,也是我们开发中最为常用的SQL语句
🌈 #{} 与 ${}占位符有什么区别 -> 大厂面试题
🌈 预编译SQL的优势
相关文章:
[MySQL]——SQL预编译、动态sql
键盘敲烂,年薪30万🌈 目录 一、SQL的预编译 📕一条SQL语句的执行过程 📕弊端 📕预编译SQL的优势 📕两种参数占位符 📕小结 二、动态SQL 📕概念介绍: Ǵ…...
安装ifconfig命令(两步搞定)
如果你输入ifconfig显示没有这条命令,最可能的原因就是你在安装CentOS,先择的是最小安装模式,默认不安装ifconfig等命令, 解决办法:1. yum安装ifconfig这个命令包。命令:yum search ifconfig 2.通过yum …...
【蓝桥杯 第十届省赛Java B组】真题训练(A - H)H待更新
目录 A、组队 - 看图一眼出答案 B、不同子串 - 字符串模拟 set去重 C、数列求值 - 模拟取余 D、数的分解 - 三重暴力 E、迷宫 - bfs 判断路径 F、特别数的和 - 弱智模拟 G、外卖店优先级 - map 暴力(90%通过率) H、人物相关性分析 - A、组队 -…...
【牛客题】二进制求和 <模拟>
给定两个用字符串表示的二进制数,返回他们的和。 数据范围:字符串长度满足 1 ≤ n ≤ 1 0 5 10^5 105 ,字符串中只含有 0 和 1,且保证除 0 以外的二进制数没有前导零的情况。 示例输入: "101","1&qu…...
Error:Only idle or expired IP address can be disabled.
华为数通设备,在配置DHCP排除地址时可能会出现以下情况 Error:Only idle or expired IP address can be disabled. 这是因为地址已经被分配出去,所以现在无法进行排除 解决方法 1.先进入接口关闭DHCP [CE2-GigabitEthernet0/0/1]undo dhcp select g…...
Xubuntu16.04系统中create_ap开启5G网络的踩坑记录
Xubuntu16.04系统中安装create_ap创建无线AP: https://blog.csdn.net/qq_45445740/article/details/133972642?spm1001.2014.3001.5501 目录 1.create_ap.conf 配置文件解析2.关于信号强度和延时2.1 信号强度2.2 信号延时2.3 网络延时测试工具推荐——PingPlotter …...
8. 一文快速学懂常用工具——Linux命令(上)
本章讲解知识点 引言 指令学习 本专栏适合于软件开发刚入职的学生或人士,有一定的编程基础,帮助大家快速掌握工作中必会的工具和指令。本专栏针对面试题答案进行了优化,尽量做到好记、言简意赅。如专栏内容有错漏,欢迎在评论区指…...
@RestController注解说明
在Spring框架中,RestController注解是一个非常重要的注解,它用于将一个类标记为RESTful风格的控制器。本文将详细介绍RestController注解的作用和用法,并提供示例以帮助读者更好地理解和使用它。 RestController的作用 RestController注解是…...
Excel中行列范围的转换
将 行:1,4-5,8,11 列:a,c-e,f 这种写法转换成单元格地址的方法。 public static Tuple<List<int>, List<string>> ConvertRowColumn(string rowRep, string colRep){List<int> rowIdxs new List<int>();rowRep rowRep.…...
golang的类型断言
前言:原因很简单,写的代码panic了。报错如下。为此专门看下golang的类型断言。 “[PANIC]interface conversion: interface {} is string, not float64”。 1、类型断言(assertion) 所谓“类型断言”即判断一个变量是不是某个类型的实例(简单来讲就是判…...
监听dom变化,监听dom属性变化
一、利用new MutationObserver const config {attributes: true, // 监听属性变化childList: true, // 监听子节点变subtree: true // 监听后代元素变化};jianting new MutationObserver(() > {this.changeFun()});jianting.observe(dom, config) /监听 jianting.disconne…...
mfc140u.dll丢失怎么修复,mfc140u.dll文件有什么作用
今天我想和大家分享的是关于mfc140u.dll文件丢失的解决方法。在我们使用电脑的过程中,有时候会遇到一些错误提示,其中比较常见的就是“无法找到mfc140u.dll文件”。那么,这个文件是什么呢?它有什么作用呢? 首先&#…...
关于MySql update语句不能用子查询的解决办法
关于MySql update语句不能用子查询的解决办法 使用MySql数据库语法操作update时,第一时间想到的是一下写法: UPDATE purchase_request_detail SET convert_to_voucher_id2, convert_to_voucher_typeinventory-voucher WHERE detail_id IN (select deta…...
【WinForm】WinForm程序C#分屏显示
文章目录 前言1. 准备工作2. 步骤3 示例代码4. 结论 前言 在开发WinForm应用程序时,有时我们需要在另一个屏幕上显示与主界面内容相同的界面。本文将介绍如何使用C#克隆正在运行的界面,并在另一个屏幕上显示相同的内容。 1. 准备工作 在开始之前&…...
云安全—K8S API Server 未授权访问
0x00 前言 master节点的核心就是api服务,k8s通过REST API来进行控制,在k8s中的一切都可以抽象成api对象,通过api的调用来进行资源调整,分配和操作。 通常情况下k8s的默认api服务是开启在8080端口,如果此接口存在未授…...
nodejs+vue啄木鸟便民维修网站设计与实现-计算机毕业设计python-django-php
1、目的: 设计一个适用于便民家电维护的平台。该系统方便管理员对用户信息的管理,使用户在不掌握任何专业知识的前提下,可以方便快速的上手,因此项目应具有广泛使用人群。该课题应包括(至少包括)以下几个基…...
【数据结构】树形结构所有路径复原为链表
目录 1. 树形结构可视化 2. 树形结构转为链表 此目标是要还原树形结构的所有路径。树形结构是一种常见的数据结构,它表示元素之间层次关系。在树形结构中,每个节点可能拥有一个或多个子节点,形成了一个分层的结构。为了还原树形结构的路径&…...
linux杀毒软件下载、安装(在线安装、离线安装)
下载 ClamAVNet 离线安装 # 离线安装 rpm -ivh --prefix/usr/local/clamav clamav*linux.x86_64.rpm # 添加用户组和组成员 groupadd clamav useradd -g clamav clamav # 创建日志目录、病毒库目录和套接字目录 mkdir -p /usr/local/clamav/logs mkdir -p /usr/local/clamav/…...
系列五、映射文件xxxMapper.xml
一、概述 mapper映射文件是mybatis中最重要的部分,涉及到的细节也非常多。 1.1、parameterType 表示输入参数的类型。例如: <select id"getUserById" parameterType"integer" resultType"org.star.entity.model.UserDO&…...
【缓存】Spring全家桶中@CacheEvict无效情况共有以下几种
Spring全家桶中CacheEvict无效情况共有以下几种 一、背景介绍二、原因分析三、解决方案 一、背景介绍 SpringBoot中使用Cacheable注解缓存数据,使用CacheEvict注解删除缓存。但是在项目使用过程中,发现使用CacheEvict注解删除缓存无效。 拓展ÿ…...
Claude Code 总被封号或 Token 不足时如何通过 Taotoken 获得稳定替代方案
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Claude Code 总被封号或 Token 不足时如何通过 Taotoken 获得稳定替代方案 对于依赖 Claude Code 这类编程助手进行日常开发的工程…...
WaveTools:智能游戏优化工具的革命性突破
WaveTools:智能游戏优化工具的革命性突破 【免费下载链接】WaveTools 🧰鸣潮工具箱 项目地址: https://gitcode.com/gh_mirrors/wa/WaveTools WaveTools是一款专为《鸣潮》玩家设计的开源智能优化工具箱,通过创新的技术方案解决游戏性…...
SUDO_HOST环境变量提权漏洞深度解析与防御
1. 这不是“又一个sudo漏洞”,而是权限模型的结构性失守你刚收到安全团队的紧急邮件,标题写着“高危Sudo漏洞(CVE-2025-32463,CVSS 9.3):可提权至root并绕过主机限制,PoC已公开”。你下意识点开…...
子黎曼几何与庞特里亚金原理:约束系统时间最优控制
1. 从黎曼到子黎曼:当几何遇见约束 在物理和工程的世界里,我们常常需要为系统寻找一条“最优”的路径。无论是让量子比特以最快的速度演化到目标态,还是规划机器人在复杂地形中的最短时间轨迹,其背后都隐藏着一个深刻的几何问题&a…...
高维数据压缩:秩-1格点与双曲交叉方法原理与应用
1. 项目概述:高维数据压缩的格点与双曲交叉方法在科学计算和工程仿真中,我们常常需要处理由海量样本点构成的高维数据集。想象一下,你正在模拟一架飞机的气动性能,或者评估一个复杂金融模型的风险,每一次仿真都可能产生…...
为什么你的MJ图总像“老胶片过曝”?揭秘ISO模拟算法缺陷,5种降颗粒参数组合实测对比(含LUT映射表)
更多请点击: https://kaifayun.com 第一章:为什么你的MJ图总像“老胶片过曝”?揭秘ISO模拟算法缺陷,5种降颗粒参数组合实测对比(含LUT映射表) MidJourney 默认的图像生成流程中隐式嵌入了一套基于扩散步长…...
基于KDTree的机器学习壁面函数:提升CFD湍流模拟精度与效率
1. 项目概述在计算流体力学(CFD)的湍流模拟领域,尤其是处理高雷诺数工程流动时,近壁面区域的精确建模一直是个核心挑战。直接对粘性底层进行网格解析(Wall-Resolved LES/DES)虽然精度高,但计算成…...
保险智能体部署失败率高达73%?揭秘头部险企AI Agent上线前必须完成的3个合规校验步骤
更多请点击: https://codechina.net 第一章:保险智能体部署失败率高达73%?揭秘头部险企AI Agent上线前必须完成的3个合规校验步骤 近期多家头部保险机构联合发布的《2024保险AI落地白皮书》指出,AI Agent在核心承保、核保与理赔场…...
【AI Agent法律应用实战指南】:20年律所技术总监亲授3大落地场景与5个避坑红线
更多请点击: https://kaifayun.com 第一章:AI Agent法律应用的认知重构与行业定位 传统法律服务长期依赖人工经验、线性流程与静态知识体系,而AI Agent的出现正推动法律行业从“工具辅助”迈向“自主协同”的范式跃迁。它不再仅是检索法条或…...
别再傻傻分不清了!用DPABI和Matlab实操,带你搞懂脑影像分析里的ROI和VBM
从零掌握脑影像分析:DPABIMatlab实战ROI与VBM全流程 第一次打开MRI数据时,那种面对海量体素无从下手的感觉,相信每个神经影像研究者都记忆犹新。作为实验室新人,我花了整整三个月才弄明白ROI和VBM这两种基础方法的实操差异——而现…...
