zoukankan      html  css  js  c++  java
  • Mybatis中#和$的区别及应用

    (一)#和$的区别

    • #{}
    1. 可以进行预编译处理,会被当成?号,调用PreparedStatement的set方法来赋值;
    2. 可以防止sql注入;
    3. 传入的参数在sql中被看成一个字符串,会对传入的数据自动加引号,例如:
    select id,name,age from user where id =#{id};

    当参数id传入的值是“1”时,上述sql解析为:

    select id,name,age from user where id =1’;
    • ${}
    1. 不会进行预编译处理,是普通的占位符;
    2. 不能防止sql注入;
    3. 传入的参数在sql中直接替换成变量的值,例如:
    select id,name,age from user where id =${id};

    当参数id传入的值是“1”时,上述sql解析为:

    select id,name,age from user where id =1;

    (二)何时使用#{},何时使用${}?

    大多数情况下还是经常使用#,一般能用#{}的就不用${}
    既然#{}有预编译功能,能防止sql 注入,那为什么还要使用${}呢?请看下面sql语句能用#{}传递参数吗?

    SELECT * FROM #{tableName};

    假如tableName传入的值是user,那么解析后的sql是这样的:

    SELECT * FROM  'user';

    到mysql控制台试一下,会报1064错误,这种情况下就必须使用${},还是上面的语句使用$传参:

    SELECT * FROM ${tableName};

    解析后的sql可以正常执行:

    SELECT * FROM  user;

    凡是sql中不能添加引号的值动态传参时都必须使用${},像order by,group by等。

  • 相关阅读:
    bootstrap modal 弹出效果
    集合List内容
    input文本框设置和移除默认值
    jQuery hover事件
    jQuery事件之鼠标事件
    jquery操作select(取值,设置选中)
    JS里设定延时:js中SetInterval与setTimeout用法
    移动端 触摸事件 ontouchstart、ontouchmove、ontouchend、ontouchcancel
    profiler加入计划任务
    sql server 时间小汇
  • 原文地址:https://www.cnblogs.com/xmm2017/p/13943873.html
Copyright © 2011-2022 走看看