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

06-01 788阅读

键盘敲烂,年薪30万🌈

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

目录

一、SQL的预编译

📕一条SQL语句的执行过程

📕弊端

📕预编译SQL的优势

📕两种参数占位符

📕小结

二、动态SQL

📕概念介绍:

📕案例:

📕动态SQL语句:

📕应用场景总结:

三、总结:


一、SQL的预编译

📕一条SQL语句的执行过程

[MySQL]——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。

          📕案例:

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

          📕动态SQL语句:

          用于判断条件是否成立。使用test属性进行条件判断,如果条件为true,则拼接SQL。

          用法:test属性为if的判断条件

          实现:例如动态sql实现条件查询

              
              
                  select *
                  from emp
                      
                          
                              name like concat('%', #{name}, '%')
                          
                          
                              and gender = #{gender}
                          
                          
                              and entrydate between #{begin} and #{end}
                          
                      
                  order by update_time desc
              

          注意:

          如果name字段为空,sql语句为select * from emp where and gender = #{gemder}……

          引入标签:

          where 元素只会在子元素有内容的情况下才插入where子句。而且会自动去除子句的开头的AND 或OR

          同理update时也要引入标签去除多余 ,

          遍历集合或数组给字段赋值

          属性介绍 :

          • collection:集合或数组名
          • item:要分割的字段名
          • separator:每次遍历的分隔符
          • open:遍历开始前拼接的片段
          • close:遍历开始后拼接的片段

            实现:例如实现批量删除

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

目录[+]

取消
微信二维码
微信二维码
支付宝二维码