当前位置: 首页 > news >正文

[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.lryc.cn/news/214856.html

相关文章:

  • 安装ifconfig命令(两步搞定)
  • 【蓝桥杯 第十届省赛Java B组】真题训练(A - H)H待更新
  • 【牛客题】二进制求和 <模拟>
  • Error:Only idle or expired IP address can be disabled.
  • Xubuntu16.04系统中create_ap开启5G网络的踩坑记录
  • 8. 一文快速学懂常用工具——Linux命令(上)
  • @RestController注解说明
  • Excel中行列范围的转换
  • golang的类型断言
  • 监听dom变化,监听dom属性变化
  • mfc140u.dll丢失怎么修复,mfc140u.dll文件有什么作用
  • 关于MySql update语句不能用子查询的解决办法
  • 【WinForm】WinForm程序C#分屏显示
  • 云安全—K8S API Server 未授权访问
  • nodejs+vue啄木鸟便民维修网站设计与实现-计算机毕业设计python-django-php
  • 【数据结构】树形结构所有路径复原为链表
  • linux杀毒软件下载、安装(在线安装、离线安装)
  • 系列五、映射文件xxxMapper.xml
  • 【缓存】Spring全家桶中@CacheEvict无效情况共有以下几种
  • P9117 [春季测试 2023] 涂色游戏
  • react如何进行项目配置代理
  • 2023杭州.云栖大会:计算,为了无法计算的价值
  • MIT6.5830 Lab1-GoDB实验记录(二)
  • 设计模式—创建型模式之工厂模式
  • N.B.缩略语的意思
  • SpringBoot源码透彻解析—自动装配
  • 基于springboot实现疫情防控期间外出务工人员信息管理系统项目【项目源码+论文说明】
  • 自动曝光算法(第一讲)
  • QStandardItemModel,setData和setItem区别
  • 应用出海新福祉,融云助IM社交迅速对齐海外用户体验