1.Mybatis 的Mapper.xml语句中parameterType向SQL语句传参有两种方式:#{}和${}
我们经常使用的是#{},是因为这种方式可以防止SQL注入,#{}这种方式SQL语句是经过预编译的,它把#{}中间的参数转义成字符串。
比如:
select * from table where name = #{zhangSan}
预编译后,会动态解析成一个参数标记符?:
select * from table where name = ?
而使用${}在动态解析时候,会传入参数字符串
select * from table where name = ${zhangSan}
动态解析时候,会传入参数字符串
select * from table where name = 'zhangSan'
我们经常使用的是#{},是因为这种方式可以防止SQL注入,#{}这种方式SQL语句是经过预编译的,它把#{}中间的参数转义成字符串。
比如:
select * from table where name = #{zhangSan}
预编译后,会动态解析成一个参数标记符?:
select * from table where name = ?
而使用${}在动态解析时候,会传入参数字符串
select * from table where name = ${zhangSan}
动态解析时候,会传入参数字符串
select * from table where name = 'zhangSan'
总结:
#{} 这种取值是编译好SQL语句再取值 即 #{}:动态解析 -> 预编译 -> 执行
${} 这种是取值以后再去编译SQL语句 即 ${}:动态解析 -> 编译 -> 执行
#{} 这种取值是编译好SQL语句再取值 即 #{}:动态解析 -> 预编译 -> 执行
${} 这种是取值以后再去编译SQL语句 即 ${}:动态解析 -> 编译 -> 执行
#传入的参数在SQL中显示为字符串(当成一个字符串),会对自动传入的数据加一个双引号。
$传入的参数在SqL中直接显示为传入的值
${ } 变量的替换阶段是在动态 SQL 解析阶段,而 #{ }变量的替换是在 DBMS 中。
2、#可以防止SQL注入的风险(语句的拼接);但$无法防止Sql注入。
3、$方式一般用于传入数据库对象,例如传入表名。
4、大多数情况下还是经常使用#,一般能用#的就别用$;但有些情况下必须使用$,例:MyBatis排序时使用order by 动态参数时需要注意,用$而不是#。