1.0概述
#{} : 采用预编译方式,可以防止SQL注入, #{}实现的是向prepareStatement中的预处理语句中设置参数值,sql语句中#{}表示一个占位符即?
${}: 采用直接赋值方式,无法阻止SQL注入攻击,他是直接拼接sql字符串的方式
2.0实例
2.1使用${}
xml:
<insert id="deptSave">
insert into dept
values(${deptNo},'${dname}','${loc}',${flag})
</insert>
log:
[DEBUG] Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@61884cb1]
[DEBUG] ==> Preparing: insert into dept values(66,'名字','地址',true)
[DEBUG] ==> Parameters:
[DEBUG] <== Updates: 1
2.2使用#{}
xml:
<insert id="deptSave">
insert into dept
values(#{deptNo},#{dname},#{loc},${flag})
</insert>
log:
[DEBUG] Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@749c877b]
[DEBUG] ==> Preparing: insert into dept values(?,?,?,true)
[DEBUG] ==> Parameters: 90(Integer), TEST(String), CD(String)
[DEBUG] <== Updates: 1
3.0什么时候使用${}和#{}
大多数情况下面我们使用#{}读取参数,但是在一些特殊的情况下,我们还是需要使用${}读取参数的
比如 有两张表,分别是emp 和 emp2 .如果需要在查询语句中动态指定表名,就只能使用${}
<select>
select * from ${tableName}
<select>
再比如.需要动态的指定查询中的排序字段,此时也只能使用${}
<select>
select * from dept order by ${name}
</select>
简单来说,在JDBC不支持使用占位符的地方,都可以使用${},能使用#{}的就一定使用#{}