• sql语句中的#{}占位符和${}占位符(自己看的)


    搜了一晚上,原谅我的愚蠢:这里sql中占位符#{},${} 是JDBC提供使用的,跟什么Ognl表达式,EL表达式或者jstl标签库完全没关系!

    #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by “111”, 如果传入的值是id,则解析成的sql为order by “id”。

    $将传入的数据直接显示生成在sql中。如:order by userid,如果传入的值是111,那么解析成sql时的值为order by user_id, 如果传入的值是id,则解析成的sql为order by id。

    #方式能够很大程度防止sql注入;$方式无法防止Sql注入。

    $方式一般用于传入数据库对象,例如传入表名。

    一般能用#的就别用$。MyBatis排序时使用order by 动态参数时需要注意,用$而不是#。

    默认情况下,使用#{}格式的语法会导致MyBatis创建预处理语句属性并以它为背景设置安全的值(比如?)。这样做很安全,很迅速也是首选做法,有时你只是想直接在SQL语句中插入一个不改变的字符串。比如,像ORDER BY,你可以这样来使用:

    ORDER BY ${columnName};
    
    • 1
    • 2

    这里MyBatis不会修改或转义字符串。

    重要:接受从用户输出的内容并提供给语句中不变的字符串,这样做是不安全的。这会导致潜在的SQL注入攻击,因此你不应该允许用户输入这些字段,或者通常自行转义并检查。

    -------------------------------------------------------------------

    sql语句中的#{}

    例:Student stu = new Student("田七",27,95); 
           Map<String,Object> map=new HashMap<String, Object>();
           map.put("nameCon", "张");
           map.put("ageCon", 23);
           map.put("stu", stu);
    select id,name,age,score from student where name like '%' #{nameCon} '%' and age > #{ageCon} and score > #{stu.score}
    #{}中可以放什么内容:
    1)参数对象的属性
    2)随意内容,此时的#{}是个占位符
    3)参数为map时的key
    4)参数为map时,若key对应的value为对象,则可将该对象的属性放入
    5)参数的索引号

    ---------------------------------------------------------

    sql语句中使用#跟$的区别(MyBatis中)

    1、#可以进行预编译,进行类型匹配,#变量名# 会转化为 jdbc 的 类型
    $不进行数据类型匹配,$变量名$就直接把 $name$替换为 name的内容
    例如:
    select * from tablename where id = #id# ,假设id的值为12,其中如果数据库字段id为字符型,那么#id#表示的就是'12',如果id为整型,那么#id#就是 12
    会转化为jdbc的 select * from tablename where id=?,把?参数设置为id的值
    select * from tablename where id = $id$ ,如果字段id为整型,Sql语句就不会出错,但是如果字段id为字符型,
    那么Sql语句应该写成 select * from table where id = '$id$'
    3、#方式能够很大程度防止sql注入.
    4、$方式无法方式sql注入.
    5、$方式一般用于传入数据库对象.例如传入表名.
    6、所以ibatis用#比$好,一般能用#的就别用$.
    另外,使用##可以指定参数对应数据库的类型
    如:
    select * from tablename where id = #id:number#
    在做in,like 操作时候要特别注意
    总结以下:
    $号使用在具体pojo类也就是非基本类型的取值,而#号使用在具体有基本类型的取值
  • 相关阅读:
    【数据库数据恢复】HPUX下ORACLE数据库数据恢复案例
    【数据库数据恢复】LINUX下误删除ORACLE数据库误删除的数据恢复
    UndeclaredThrowableException
    本地tomcat部署项目时,8080端口被占用
    Java程序包不存在问题的解决办法
    Win10 WSD 扫描 事件 自动 响应 保存
    Disk Folder Directory Size DU DiskUsage dir DIRUSE FSO WMIC V1.1
    apt 安装 包 package 命令 更新源 构建 源码 Linux Raspbian Debian Raspberry
    hh.exe chm帮助文件 异常 与代理有关
    Typora 试用期 版本 问题 记录
  • 原文地址:https://www.cnblogs.com/pxffly/p/8291620.html
Copyright © 2020-2023  润新知