zoukankan      html  css  js  c++  java
  • MyBatis中使用#{}和${}的区别

    select * from table_name where id=#{id};
    
    select * from table_name where id=${id}; 

    区别:

    在动态SQL解析阶段,#{}会被解析为JDBC预编译语句的参数标记符(占位符),例如上面的#{}语句将被解析为:

    select * from table_name where id=? ;
    

      而${}则直接解析为字符串变量替换,当变量id的传参为"xiaoming"时,上面的${}语句将被解析为:

    select * from table_name where id='xiaoming';
    

      也就是说,对于变量替换,#{}发生在DBMS中,而${}发生在动态SQL解析阶段。

    实际使用:

    1、当变量为表名时,只能使用${},这是因为#{}解析的占位符在进行变量替换时,会带上单引号' ',表名带单引号会导致SQL错误。

    2、除了上面第1条之外,能用#{}的地方尽量用#{},这是因为相同的预编译SQL可以复用,用#{}能够节能开销提高性能;${}会引起SQL注入问题,例如:

    select * from ${tableName} where name = #{name} 
    

      当tableName为 " user; delete user; --"时,SQL将被解析为:

    select * from user; delete user; -- where name = ?;
    

      这样就造成了严重后果(-- 等于注释)。

    参考:http://blog.csdn.net/pfnie/article/details/53230994

  • 相关阅读:
    Java SE——线程介绍
    Vue
    Spring asm
    spring 自定义标签的实现
    Spring InitializingBean 接口以及Aware接口实现的原理
    值传递与引用传递
    redis学习
    ssm多数据源配置
    redis 启动
    json的设置
  • 原文地址:https://www.cnblogs.com/guodongdidi/p/7779326.html
Copyright © 2011-2022 走看看