就是比如
在Action中有一个HQL语句: "FROM Table WHERE condition='xxx'"
这样的语句必须换为:"FROM Table WHERE condition=?"
然后再传参吗?
这两种效果好像一样啊、当然我说的是WHERE之后参数为常用的数据类型、比如int、String
如果有日期之类的话、就另说了
希望详细解释一下、 对答案要求不高、 关键是解释的合理。 人云亦云的就算了
你可以试试 , :D
用问号的话
JDBC会把问号里面的内容对上的,并不是简单的字符串拼接
?的值是xxx' and '1' ='1
JDBC会把你的值转会成xxx\' and \'1\' =\'1
至于转换规则可能比我上面写的还多,有兴趣你可以数据库真正执行的SQL语句是什么内容就知道了
加?可以防止SQL注入攻击,使用预编译提高SQL多交执行的效率
SQL注入攻击:
FROM Table WHERE condition='xxx'
如果XXX的值为:xxx' and '1' ='1
则HQL语句 就变成
FROM Table WHERE condition='xxx' and '1' ='1'
用?号占位,是预编译的。你传什么任何字符串,都不会影响整个sql语句的结构。你传“xxx' and '1' ='1”的话,会把这个完整字符串作为condition的条件。
使用占位符是一个好习惯,不要轻易动态的拼装sql/hql语句。
不需要太多的理由!
如果你觉得安全不需要考虑太多的话! 拼装的SQL 效率会更好!
从黑猫白猫角度出发,两种都可以实现。从安全性角度来说,“?”这种方式更好。
"程序崩溃" :o
会用的人,拼SQL也一般不会拼出程序崩溃;不会用的人,就算用?写,也有可能写出让人崩溃的代码。
一个工具,给不同的人能用出不同的效果
?是预编译的,从安全性与执行效率都会更好
如果SQL语句是固定的,建议用?占位符
[quote]"程序崩溃"
会用的人,拼SQL也一般不会拼出程序崩溃;不会用的人,就算用?写,也有可能写出让人崩溃的代码。
一个工具,给不同的人能用出不同的效果[/quote] :idea:
"但是、那种明明很简单的HQL语句、 condition也很简单"难道这种查询用占位符很复杂吗?越是简单,越要用占位符。
hql这种占位符的方式,底层也是JDBC的PrepareStatement,一来预编译可以提升查询效率,二来可以防止sql注入,可谓是既高效有安全的极品,没有不用的道理啊。