PreparedStatement IN子句替代方案?

问题:

使用具有java.sql.PreparedStatement实例的SQL IN子句的最佳解决方法是什么?由于SQL注入攻击安全性问题,多个值不支持这种情况:一个?占位符表示一个值,而不是一个值列表。
考虑以下SQL语句:

SELECT my_column FROM my_table where search_column IN (?)

使用preparedStatement.setString( 1, "'A', 'B', 'C'" );本质上是一个非工作尝试,解决了首先使用?的原因。
有哪些解决方法可用?

回答:

可用的各种选项的分析以及每个选项的优缺点here
建议的选项是:

  • 准备SELECT my_column FROM my_table WHERE search_column = ?,为每个值执行它,并在结果客户端使用UNION。只需要一个准备好的语句。缓慢而痛苦
  • 准备SELECT my_column FROM my_table WHERE search_column IN (?,?,?)并执行它。每个IN-list列表需要一个准备好的语句。快速而明显
  • 准备SELECT my_column FROM my_table WHERE search_column = ? ; SELECT my_column FROM my_table WHERE search_column = ? ; ...并执行它。 [或使用UNION ALL代替这些分号。 –ed]需要每个大小的IN列表中一个准备好的语句。愚蠢的速度比WHERE search_column IN (?,?,?)严重得多,所以我不知道为什么博客甚至建议。
  • 使用存储过程构造结果集。
  • 准备N个不同大小的IN列表查询;说,有2,10和50个值。要搜索具有6个不同值的IN列表,请填充size-10查询,使其看起来像SELECT my_column FROM my_table WHERE search_column IN (1,2,3,4,5,6,6,6,6,6)。任何体面的服务器将在运行查询之前优化重复值。

不过,这些选项都不是很好。
这些地方的重复问题已经在同样理智的选择中得到回答,但仍然没有一个超级好的:

正确的答案,如果您使用JDBC4和支持x = ANY(y)的服务器,则使用PreparedStatement.setArray,如下所述:

不过似乎没有办法使setArray与IN列表一起工作。

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: PreparedStatement IN clause alternatives?

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

+ 59 = 65