[MySQL]——SQL预编译、动态sql

news2024/11/19 9:28:23

键盘敲烂,年薪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的优势

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1155242.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

协程框架nty_co

一、为什么要有协程&#xff1f; 以DNS请求为例子&#xff0c;客户端向服务器发送域名&#xff0c;服务器回复该域名对应得IP地址。 我们想要以同步的编程方式获得异步的性能&#xff01;&#xff01;&#xff01; 在Linux下&#xff0c;常使用IO多路复用器epoll来管理客户端…

YOLO算法改进4【中阶改进篇】:添加DeformableConvolution卷积模块

论文地址: https://arxiv.org/abs/1811.11168 源码地址:https://github.com/msracver/Deformable-ConvNets 传统的卷积操作是将特征图分成一个个与卷积核大小相同的部分,然后进行卷积操作,每部分在特征图上的位置都是固定的。这样,对于形变比较复杂的物体,使用这种卷积的…

C#学习相关系列之多线程---lock线程锁的用法

一、lock的作用 Lock可以看成在操作系统中的临界区&#xff0c;Lock区域内的代码表示临界区&#xff0c;使得同一时间只有一个线程能够进入Lock所包含的函数中&#xff0c;实现原子操作&#xff0c;保护同一资源只有一个线程进行修改&#xff0c;实现不同线程中数据的同步。 …

【数据结构】数组和字符串(十二):顺序存储字符串的基本操作(串长统计、查找、复制、插入、删除、串拼接)

文章目录 4.3 字符串4.3.1 字符串的定义与存储4.3.2 字符串的基本操作&#xff08;顺序存储&#xff09;1. 串长统计2. 串定位3. 串复制4. 串插入5. 串删除6. 串拼接7.主函数8. 代码整合及优化 4.3 字符串 字符串(String)是由零个或多个字符(char)顺序排列组成的有限序列&#…

基于RFID技术的优化医药供应链管理解决方案

一、社会背景和挑战 随着全球假药问题的严重性日益凸显&#xff0c;医疗产品的追溯和管理变得越来越重要。据世界卫生组织报告&#xff0c;全球假药比例已超过10%&#xff0c;而中国每年至少有20万人死于假药和不当用药。在国际上&#xff0c;医疗产品的追溯体系已成为监管机构…

总线类设备驱动——IIC

目录 一、本章目标 二、IIC设备驱动 2.1 I2C协议简介 2.2 LinuxI2C驱动 2.3 I2C 设备驱动实例 一、本章目标 一条总线可以将多个设备连接在一起&#xff0c;提高了系统的可扩展性能。这个互联的系统通常由三部分组成:总线控制器、物理总线(一组信号线) 和设备。总线控制器…

视频监控平台EasyCVR分组接口出现“pending”报错,该如何解决?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台可拓展性强、视频能力灵活&#xff0c;能对外分发RTMP、RTSP、…

直线导轨的误差匹配度如何?

直线导轨的误差匹配度是评估导轨之间配合精度的重要指标&#xff0c;导轨之间的配合精度越高&#xff0c;误差匹配度就会越好&#xff0c;反之则越差。 在直线导轨的生产和加工过程中&#xff0c;每个导轨都会产生一定误差&#xff0c;例如平行误差、垂直误差、轨面平整度、滑块…

什么是跨域问题?如何解决?

跨域问题指的是不同站点之间,使用 ajax 无法相互调用的问题。跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。但这个保护机制也带来了新的问题,它的问题是给不同站点之间的正常调用,也带来的阻碍,那怎么解决这个问题呢?接下来…

2023软件测试八股文最新版(含答案+文档)

一、Web 自动化测试 1、Selenium 中 hidden 或者是 display &#xff1d; none 的元素是否可以定位到&#xff1f; 不能&#xff0c;可以写 JavaScript 将标签中的 hidden 先改为 0&#xff0c;再定位元素 2、Selenium 中如何保证操作元素的成功率&#xff1f;也就是说如何保…

连续分析:提高应用效率和成本效益的关键

作者&#xff1a;John Knoepfle 最近&#xff0c;Elastic Universal Profiling 已经正式发布。 它是我们可观察性解决方案的一部分&#xff0c;允许用户在生产环境中进行整个系统的连续分析。 如果你不熟悉连续分析&#xff0c;你可能想知道通用分析是什么以及为什么你应该关心…

【1++的Linux】之信号(一)

&#x1f44d;作者主页&#xff1a;进击的1 &#x1f929; 专栏链接&#xff1a;【1的Linux】 文章目录 一&#xff0c;关于信号二&#xff0c;深剖信号的产生1. 键盘组合建产生信号2.核心转储3. 系统调用接口产生信号4. 由软件条件产生信号5. 硬件异常产生信号 一&#xff0c;…

TSINGSEE青犀AI视频识别技术+危化安全生产智慧监管方案

一、背景分析 石油与化学工业生产过程复杂多样&#xff0c;涉及的物料易燃易爆、有毒有害&#xff0c;生产条件多高温高压、低温负压&#xff0c;现场危险化学品存储量大、危险源集中&#xff0c;重特大安全事故多发。打造基于工业互联网的安全生产新型能力&#xff0c;提高危…

storage数据存储问题,不能存undefined

这篇文章分享一下自己使用sessionStorage遇到的一个小问题&#xff0c;以后遇到要避坑。 需求是easyui表格的单元格编辑&#xff0c;点击保存的时候会结束当前行的编辑&#xff0c;然后修改editingId&#xff08;当前编辑行记录的ID&#xff09;。 待解决问题 如图&#xff0c…

操作系统的内存管理之虚拟空间

操作系统的内存管理&#xff0c;主要分为三个方面。 第一&#xff0c;物理内存的管理&#xff0c;相当于会议室管理员管理会议室。 第二&#xff0c;虚拟地址的管理&#xff0c;也即在项目组的视角&#xff0c;会议室的虚拟地址应该如何组织。 第三&#xff0c;虚拟地址和物…

vcomp140.dll丢失是什么意思,vcomp140.dll丢失这几个方法都能修复好

vcomp140.dll是什么&#xff1f; vcomp140.dll是一个动态链接库&#xff08;Dynamic Link Library&#xff09;&#xff0c;它主要用于支持Microsoft Visual C 2015编程语言的运行。这个文件包含了编译器相关的函数和资源&#xff0c;对于使用Visual C 2015开发的程序和游戏来…

Android图形系统之HWComposer、ComposerHal、ComposerImpl、Composer、Hwc2::Composer实例总结(十四)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:Android…

一款Nacos漏洞自动化工具

1、参考GitHub - charonlight/NacosExploitGUI: Nacos漏洞综合利用GUI工具&#xff0c;集成了默认口令漏洞、SQL注入漏洞、身份认证绕过漏洞、反序列化漏洞的检测及其利用 0x01 前言 ​ 本工具已经集成Nacos常见漏洞的检测及其利用&#xff0c;工具为GUI版本&#xff0c;简单…

[迁移学习]DA-DETR基于信息融合的自适应检测模型

原文标题为&#xff1a;DA-DETR: Domain Adaptive Detection Transformer with Information Fusion&#xff1b;发表于CVPR2023 一、概述 本文所描述的模型基于DETR&#xff0c;DETR网络是一种基于Transformer的目标检测网络&#xff0c;详细原理可以参见往期文章&#xff1a;…

k8s 资源预留

KUBERNETES资源管理之–资源预留 Kubernetes 的节点可以按照 Capacity 调度。node节点本身除了运行不少驱动 OS 和 Kubernetes 的系统守护进程&#xff0c;默认情况下 pod 能够使用节点全部可用容量&#xff0c; 除非为这些系统守护进程留出资源&#xff0c;否则它们将与 pod 争…