小编典典

PreparedStatement IN子句替代项?

java PreparedStatement

将SQL IN子句与的实例一起使用的最佳解决方法java.sql.PreparedStatement是什么,由于SQL注入攻击安全性问题,多个值不支持该子句:一个?占位符代表一个值,而不是值列表。

考虑以下SQL语句:

SELECT my_column FROM my_table where search_column IN (?)

使用preparedStatement.setString( 1, "'A', 'B', 'C'" );本质上是一种不可行的尝试,它是首先解决使用原因的方法?。

有哪些解决方法?


阅读 995

收藏
2020-01-10

共1个答案

小编典典

建议的选项是:

  • 准备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-LIST大小需要一个准备好的语句。愚蠢的慢,严格比差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)。任何运行良好的服务器都将在运行查询之前优化出重复值。
2020-01-10