zoukankan      html  css  js  c++  java
  • ibatis 中#和 $ 符号的区别

    • 1、数据类型匹配
      • #:会进行预编译,而且进行类型匹配(自动确定数据类型);
      • $:不进行数据类型匹配。
    • 2、实现方式:
      •  # 用于变量替换(先生成一个占位符,然后替换)
        • select * from users  where name = #name#
        • 等效于
        • prepareStement=stmt.createPrepareStement("select * from users where name = ?")
        • prepareStement.setString (1,' 张三 ');
      • $ 的作用实际上是字符串拼接()
        • select * from users where name= $name$
        • 等效于
        • StringBuffer sb = newStringBuffer(256);
        • sb.append("select * from userswhere name=").append(name);
        • sb.toString();
    • 3、使用场景
      • -#主要用于变量的传递。# 是用 prepareStement,提升效率。#方式一般用于传入添加 / 修改的值或查询 / 删除的 where 条件
      • $ 只是简单的字符拼接而已,对于非变量部分, 只能使用 $。$ 方式一般用于传入数据库对象。例如传入表名,select  * from  $tableName$  对于不同的表执行统一的查询
    • 4、为什么会出现SQL注入?
      • $没有预编译,只是字符串替换,所以语句可能被注入,传给数据库时是多条语句;
      • 而#会先预编译,验证SQL语句,预防了问题的出现。
    • 5、关于预编译的理解:
      • 为什么需要预编译
        • JDBC 中使用对象 PreparedStatement 来抽象预编译语句,使用预编译
        • 预编译阶段可以优化 sql 的执行。
          • 预编译之后的 sql 多数情况下可以直接执行,DBMS 不需要再次编译,越复杂的 sql,编译的复杂度将越大,预编译阶段可以合并多次操作为一个操作。
        • 预编译语句对象可以重复利用。
          • 把一个 sql 预编译后产生的 PreparedStatement 对象缓存下来,下次对于同一个 sql,可以直接使用这个缓存的 PreparedState 对象。
        • mybatis 默认情况下,将对所有的 sql 进行预编译。
      • 参考附录:
        • 说明下,就是$时传给DBMS的时一个Statement对象,该对象会被DBMS先编译后执行;
        • 而#时传给DBMS的时一个PrepareStatement 对象,该对象会直接传给DBMS进行编译,DBMS执行时会直接执行编译后的语句。
    • 6、参考:
  • 相关阅读:
    又一种Mysql报错注入
    PHP wget 增强脱裤脚本(PDO MYSQL)
    一种少见的跨目录写webshell方法
    过狗一句话
    在myql sqlserver里边怎么快速找到带有关键字的表
    php读取3389脚本
    学习OpenCV,看这些!
    Git 学习看这篇就够了!
    开发工具使用技巧和插件大总结
    (资源整理)带你入门Spark
  • 原文地址:https://www.cnblogs.com/buwuliao/p/10681182.html
Copyright © 2011-2022 走看看