[MySQL]——SQL预编译、动态sql
最佳答案 问答题库598位专家为你答疑解惑
键盘敲烂,年薪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的优势
99%的人还看了
相似问题
- JavaScript基础—for语句、循环嵌套、数组、冒泡排序、综合案例—根据数据生成柱形图
- P6 C++控制流语句(continue, break, return)
- (二)汇编语句组成
- MATLAB 嵌套switch语句||MATLAB while循环
- ⑩⑤【DB】详解MySQL存储过程:变量、游标、存储函数、循环,判断语句、参数传递..
- 事关Django的静态资源目录设置(Django的setting.py中的三句静态资源(static)目录设置语句分别是什么作用?)
- Python基础入门例程55-NP55 2的次方数(循环语句)
- JavaScript条件分支语句-if 语句
- 【Python基础】try-finally语句和with语句
- if,switch语句
猜你感兴趣
版权申明
本文"[MySQL]——SQL预编译、动态sql":http://eshow365.cn/6-39248-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!
- 上一篇: 多模态大一统:开启全模态LLM和通用AI时代的大门
- 下一篇: 计算机视觉:人脸识别与检测