"MyBatis中${} 和 #{} 有什么区别"是MyBatis中常见的问题,从语法和使用角度分析这两种符号的区别,有助于读者更好地理解和使用MyBatis。
1.语法差异
- ${}:会将SQL语句中的${}替换为实际的参数值,一个${}只能替换一个参数值,因此如果想传递的参数需要在SQL中拼接就需要使用${}。
- #{}:会将SQL语句中的#{}替换为?,即SQL预处理语句中的参数占位符,MyBatis底层会自动将传入的参数进行预编译,防止SQL注入攻击,因此推荐使用#{}。
示例1:
SQL语句中使用${},将会将传入的参数直接替换在SQL语句中,如:
<select id="getUserById" resultMap="userResult">
SELECT * FROM user WHERE id=${id}
</select>
如果传入的参数是id=1,则执行的SQL语句就是:
SELECT * FROM user WHERE id=1
这种方式虽然简单,但是容易发生SQL注入攻击。
示例2:
SQL语句中使用#{},效果就像JDBC的PreparedStatement,最终生成的SQL语句中使用?占位符,例如:
<select id="getUserById" resultMap="userResult">
SELECT * FROM user WHERE id=#{id}
</select>
如果传入的参数是id=1,则执行的SQL语句就是:
SELECT * FROM user WHERE id=?
这种方式在MyBatis中是推荐的方式,能够有效避免SQL注入攻击。
2.变量占位符区别
- ${}:变量替换时不会将参数值加上引号或转义字符,因此如果参数是字符串类型,则还需自己手动添加单引号或双引号,如:
username='${username}'
。 - #{}:变量替换时会将参数值加上引号或转义字符,因此不用再手动添加单引号或双引号。
示例3:
<select id="getUserByName" resultMap="userResult">
SELECT * FROM user WHERE username='${username}'
</select>
根据用户名查询数据时使用${},如果传入的参数是username=Tom,则最终执行SQL语句类似于:
SELECT * FROM user WHERE username='Tom'
这种方式容易发生SQL注入攻击,所以不建议使用。
示例4:
<select id="getUserByName" resultMap="userResult">
SELECT * FROM user WHERE username=#{username}
</select>
根据用户名查询数据时使用#{},MyBatis会自动对参数做转义处理,避免SQL注入攻击,如果传入的参数是username=Tom,则最终执行的SQL语句类似于:
SELECT * FROM user WHERE username='Tom'
这种方式会自动完成参数的转义处理,避免了SQL注入攻击的风险。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:MyBatis中${} 和 #{} 有什么区别小结 - Python技术站