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类也就是非基本类型的取值,而#号使用在具体有基本类型的取值

 

    原文作者:狂妄的老头
    原文地址: https://www.cnblogs.com/pxffly/p/8291620.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞