[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的优势

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

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

相关文章

Opencv学习笔记(最近更新2023.11.1)

文章目录 棋盘格角点检测findChessboardCorners()亚像素角点检测cornerSubPix(&#xff09;棋盘格角点的绘制drawChessboardCorners()计算外参solvePnPRansac()旋转向量转旋转矩阵Rodrigues()鱼眼畸变矫正initUndistortRectifyMap()检测轮廓findContours()轮廓显示drawContours…

springboot2.x使用@RestControllerAdvice实现通用异常捕获

文章目录 demo地址实现效果引入基础类准备1.通用枚举与错误状态枚举2.定义通用返回结果3.自定义业务异常 统一异常捕获测试 demo地址 demo工程地址 实现效果 当我们输入1时&#xff0c;正常的返回通用的响应结果当我们输入2时&#xff0c;抛出异常&#xff0c;被捕获然后返回…

react-组件生命周期

一、生命周期阶段 官方文档&#xff1a;https://zh-hans.legacy.reactjs.org/docs/react-component.html React组件生命周期可分为三个阶段&#xff1a;挂载、更新、卸载 挂载&#xff1a;当组件实例被创建并插入 DOM 中时。其生命周期调用顺序如下&#xff1a; constructor()s…

【c++Leetcode】287. Find the Duplicate Number

问题入口 思想&#xff1a;Floyds Tortoise and Hare 这个算法除了可以检测是否有环&#xff08;问题入口&#xff09;&#xff0c;还可以用来检测重复数。当然这还需要一个慢指针才能实现。具体请点击标题跳转到原视频&#xff0c;这里是把内容再梳理一遍。如果有不对的地方…

Web自动化测试之图文验证码的解决方案

对于web应用程序来讲&#xff0c;处于安全性考虑&#xff0c;在登录的时候&#xff0c;都会设置验证码&#xff0c; 验证码的类型种类繁多&#xff0c;有图片中辨别数字字母的&#xff0c;有点击图片中指定的文字的&#xff0c;也有算术计算结果的&#xff0c;再复杂一点就是滑…

无测试组织:测试团队的敏捷转型

文章目录 写在前面01 从测试角度理解敏捷理念什么是敏捷&#xff1f;测试人员应该怎样理解敏捷理念&#xff1f;敏捷宣言对于测试活动的启发与思考总结如下敏捷原则12条敏捷实践框架为什么要做敏捷 02 什么是敏捷测试03 敏捷测试为什么会失败04 诊断脑暴会的成果示例测试团队转…

表格识别软件:科技革新引领行业先锋,颠覆性发展前景广阔

表格识别软件的兴起背景可以追溯到数字化和自动化处理的需求不断增加的时期。传统上&#xff0c;手动处理纸质表格是一项费时费力的工作&#xff0c;容易出现错误&#xff0c;效率低下。因此&#xff0c;开发出能够自动识别和提取表格数据的软件工具变得非常重要。 随着计算机…

使用 Python 进行自然语言处理第 5 部分:文本分类

一、说明 关于文本分类&#xff0c;文章已经很多&#xff0c;本文这里有实操代码&#xff0c;明确而清晰地表述这种过程&#xff0c;是实战工程师所可以参照和依赖的案例版本。 本文是 2023 年 1 月的 WomenWhoCode 数据科学跟踪活动提供的会议系列文章中的一篇。 之前的文章在…

【深度学习基础】专业术语汇总(欠拟合和过拟合、泛化能力与迁移学习、调参和超参数、训练集、测试集和验证集)

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…

linux的环境安装以及部署前后端分离后台接口

⭐⭐ linux专栏&#xff1a;linux专栏 ⭐⭐ 个人主页&#xff1a;个人主页 目录 一.linux安装环境 1.1 jdk和tomcat的安装配置 1.1.1 解压jdk和tomcat的安装包 解压jdk安装包 解压tomcat安装包 1.2 jdk环境变量配置 1.3 tomcat启动 1.4 MySQL的安装 二.部署前后端分离…

机器学习快速入门教程 Scikit-Learn实现

机器学习是什么? 机器学习是一帮计算机科学家想让计算机像人一样思考所研发出来的计算机理论。他们曾经说过,人和计算机其实本没有差别,同样都是一大批互相连接的信息传递和存储元素所组成的系统。所以有了这样的想法,加上他们得天独厚的数学功底,机器学习的前身也就孕育而生…

RHCSA -- VMware虚拟机配置及破解密码

一、配置虚拟机 1、开启VMware&#xff08;自定义&#xff09; 2、设置虚拟机硬件兼容性&#xff08;默认&#xff09; 3、稍后安装虚拟机操作系统 4、选择为Linux的虚拟机 5、虚拟机机名 6、设置虚拟机处理器 7、设置虚拟机所连接的网络类型 8、选择磁盘类型 9、设置所选磁…

【源码】医院绩效考核系统-对接HIS核算

医院绩效考核系统&#xff0c;它需要和his系统进行对接&#xff0c;按照设定周期&#xff0c;从his系统获取医院科室和医生、护士、其他人员工作量&#xff0c;对没有录入信息化系统的工作量&#xff0c;绩效考核系统设有手工录入功能&#xff08;可以批量导入&#xff09;&…

CSS标点符号换行问题

最近遇到一个奇怪的现象,元素中中文文本正常显示,但是加了一堆符号后中文文本居然换行了. div{width: 200px;border: 1px solid blue;word-break: break-all;} <div>文本</div>经过研究发现&#xff0c;因为标点符号不允许出现在行首和行尾&#xff0c;连带着符号…

Kafka - 监控工具 Kafka Eagle:实时洞察Kafka集群的利器

文章目录 引言Kafka Eagle简介Kafka Eagle的特点Kafka Eagle的优势使用Kafka Eagle的步骤结论 引言 在现代大数据架构中&#xff0c;Apache Kafka已成为一个不可或缺的组件&#xff0c;用于可靠地处理和传输大规模的数据流。然而&#xff0c;随着Kafka集群规模的不断增长&…

QT基础学习笔记

文章目录 1 概述1.1 优点1.2 QT成功使用案例1.3 安装教程1.3.1 在线安装流程1.3.2 离线安装流程 2 创建工程2.1 快捷键2.1.1 常用快捷键2.1.2 修改快捷键 2.2 proj文件 3 对象树4 信号和槽4.1 自定义信号和槽4.1.1 信号连接信号4.1.2 一个信号连接多个槽函数4.1.3 多个信号连接…

算法---缺失的第一个正数

题目 给你一个未排序的整数数组 nums &#xff0c;请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。示例 1&#xff1a;输入&#xff1a;nums [1,2,0] 输出&#xff1a;3 示例 2&#xff1a;输入&#xff1a;nums …

C++数据结构算法篇Ⅰ

C数据结构算法篇Ⅰ &#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;C算法 &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 主要内容讲解数据结构中的链表结构 文章目录 C数据…

WSL安装Ubuntu

先安装wsl2 安装Ubuntu 打开windows商店&#xff0c;搜索对应版本的Ubuntu&#xff0c;点击获取进度跑完后&#xff0c;点击打开&#xff0c;就可以完成安装 删除Ubuntu版本 wsl --unregister Ubuntu-18.04安装位置迁移 正常情况下Ubuntu是被安装在C盘&#xff0c;我们需要…

什么是数字展览馆,数字展览馆有什么应用前景

引言&#xff1a; 数字展览馆作为一种新兴的文化艺术展示形式&#xff0c;以数字化技术和虚拟现实为基础&#xff0c;正在逐渐改变传统展览的方式。 一、什么是数字展览馆&#xff1f; 1.定义 数字展览馆是利用数字技术和虚拟现实技术打造的一种线上文化艺术展示平台。通过虚…