MyBatis Mapper变量引用方式#{}与${}差别

前言

众所周知,SQL存在注入的风险,所以mybatis 在默认情况下会使用预编译的方式,并会设置PreparedStatement参数,并进行了必要的安全检查和字符的转义。

PreparedStatement预编译

1. Mapper配置,默认是预编译

1
<select id="getList" resultType="Map" >select * from A where age = #{age} ORDER BY #{age}</select>

2. SQL举例

1
select * from A where age = #{age}

3. 解释

参数:age=>5
解析后执行的SQL:select * from A where age = ?
然后在SQL的执行中进行值的替换。

Statement直接拼接

1. Mapper配置 statementType

1
<select id="getList" resultType="Map" statementType="STATEMENT">select * from A where age = ${age} ORDER BY ${age}</select>

2. SQL举例

1
select * from B where age = ${age}

3. 解释

参数:age传入值为:5
解析后执行的SQL:select * from B where age =5

总结

1. ${}方式会引发SQL注入的问题、同时也会影响SQL语句的预编译,所以从安全性和性能的角度出发,能使用#{}的情况下就不要使用${}。

2. 可能需要直接插入一个不做任何修改的字符串到SQL语句中,这时候应该使用${}语法更加灵活方便,但是不能有外部sql的进入,防止sql注入。


1.如果本文帮到了您,不妨点一下右下角的 分享到 按钮。
2.除非注明,本博文章均为原创,转载请以链接形式标明本文地址。
3.本博文章只代表博主当时的观点或结论,与博主公司没有任何关系。