SQL中$ # 符号的使用

69 阅读1分钟

$的使用场景

${attribute}属于字符串拼接SQL,而非预编译占位符,会有注入攻击问题,不建议在常规SQL中使用,常用于可解决动态升降序问题。

$符号参数绑定

image.png

${}、#{} 是取值表达式

在取值时,若参数列表中对应属性没有注解,则取得是参数列表中对应参数中的属性值因此使用{}在取值时,若参数列表中对应属性没有注解,则取得是参数列表中对应参数中的属性值 因此使用{}时,参数列表中只有单个参数时一定要加注解,引用类型,实体对象可以不加

字符类型的取值要加单引号

image.png

${}:(1)实际上是进行字符串的拼接,(2)会有sql注入的风险

#{}:(1)使用占位符:规避了sql注入的风险,(2)原则:填充数据要与列相关,

如:select * from t_user where id=?(列相关)

如果想在一个sql片段中动态填充只能使用${},如填充一个升序、降序

String sqls = “select * from t_user order by id ”+desc;

如果使用#{}则会在占位符?填充数据时desc会导致语法错误

image.png

解决${}的注入问题:定义一个新的变量作为用户传递的数据(下面图中只允许用户传过来的是一个数值-),随后在程序内+部进行条件判断,最终直接在字符串中拼接的是我定义的内容,防止了sql注入

image.png