MyBatis--------占位符${}与#{}
一、基本区别
简单的说就是#{}传过来的参数带引号,而${}传过来的参数不带单引号。
涉及到这个问题,最初是在毕业设计项目中,进行动态排序发现的问题。看下面的SQL语句
<select id="get" resultType="..">
SELECT * from t_article
<if test="orderKey !=null and orderKey !=''">
ORDER BY #{orderKey}
</if>
</select>
我的目的是在文章表't_article'中,根据文章的点击量'click'来排序。但是传过来的参数带上了引号,因此排序无效
执行出来的SQL语句的效果是: SELETE * FROM t_article order by 'click'。
修改后的SQL语句如下,
<select id="get" resultType="..">
SELECT * from t_article
<if test="orderKey !=null and orderKey !=''">
ORDER BY ${orderKey}
</if>
</select>
很简单,就是把#{}修改成了${},这样的话,传递过来的值就不会带上引号了。
现在执行出来的SQL语句的效果是: SELETE * FROM t_article order by click。达到了预期的效果
二、#{}对SQL语句的影响
用#{}传过来的参数可以防止SQL注入,而用${}就不行了。
如何防止SQL注入:
1.对用户的输入进行校验,可以通过正则表达式,或限制长度
2.不要使用动态拼装sql,使用预编译的带占位符的SQL语句。比如使用preparedStatement
更多MyBatis使用经验
如果本文对你有帮助,不妨请我喝瓶可乐吧!
你的打赏是对我最好的支持!