结合使用SQL IN子句和实例的最佳解决方法java.sql.PreparedStatement是什么,由于SQL注入攻击安全性问题,多个值不支持该子句:一个?占位符代表一个值,而不是值列表。
SQL IN
java.sql.PreparedStatement
SQL
考虑以下SQL语句:
SELECT my_column FROM my_table where search_column IN (?)
使用preparedStatement.setString( 1, "'A', 'B', 'C'" );本质上是一种不可行的尝试,它是首先解决使用原因的解决方法?。
preparedStatement.setString( 1, "'A', 'B', 'C'" )
有哪些解决方法?
建议的选项是:
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 = ?
WHERE search_column IN (?,?,?)
SELECT my_column FROM my_table WHERE search_column IN (1,2,3,4,5,6,6,6,6,6)
这些地方已经用同样合理的替代方法回答了重复的问题,但仍然没有一个超级好:
在IN子句中带有参数列表的PreparedStatement 如何在准备好的语句上设置参数列表? 如果使用的是JDBC4,并且服务器支持x = ANY(y),则正确答案的用法PreparedStatement.setArray如下:
PreparedStatement
PreparedStatement IN子句替代项? 不过,似乎没有任何办法可以setArray处理IN列表。
有时,SQL语句是在运行时加载的(例如,从属性文件中加载),但是需要可变数量的参数。在这种情况下,首先定义查询:
query=SELECT * FROM table t WHERE t.column IN (?)
接下来,加载查询。然后在运行参数之前确定参数的数量。一旦知道参数计数,请运行:
sql = any( sql, count );
例如:
/** * Converts a SQL statement containing exactly one IN clause to an IN clause * using multiple comma-delimited parameters. * * @param sql The SQL statement string with one IN clause. * @param params The number of parameters the SQL statement requires. * @return The SQL statement with (?) replaced with multiple parameter * placeholders. */ public static String any(String sql, final int params) { // Create a comma-delimited list based on the number of parameters. final StringBuilder sb = new StringBuilder( new String(new char[params]).replace("\0", "?,") ); // Remove trailing comma. sb.setLength(Math.max(sb.length() - 1, 0)); // For more than 1 parameter, replace the single parameter with // multiple parameter placeholders. if (sb.length() > 1) { sql = sql.replace("(?)", "(" + sb + ")"); } // Return the modified comma-delimited list of parameters. return sql; }
对于某些不支持通过JDBC 4规范传递数组的数据库,此方法可以促进将slow = ?转换为faster IN (?)子句条件,然后可以通过调用该any方法进行扩展。
slow = ?
faster IN (?)
any