结合使用SQL IN
子句和实例的最佳解决方法java.sql.PreparedStatement
是什么,由于SQL
注入攻击安全性问题,多个值不支持该子句:一个?占位符代表一个值,而不是值列表。
考虑以下SQL语句:
SELECT my_column FROM my_table where search_column IN (?)
使用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 = ?
; …并执行它。[或UNION ALL代替那些分号。–ed]每个IN-LIST大小需要一个准备好的语句。愚蠢地慢,严格比差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 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
方法进行扩展。
问题内容: 将SQL IN子句与的实例一起使用的最佳解决方法是什么,由于SQL注入攻击安全性问题,多个值不支持该子句:一个占位符代表一个值,而不是值列表。 考虑以下SQL语句: 使用本质上是一种不可行的尝试,它是首先解决使用原因的方法?。 有哪些解决方法? 问题答案: 建议的选项是: 准备,对每个值执行它,并在客户端对结果进行UNION。只需要一个准备好的语句。缓慢而痛苦。 准备并执行它。每个IN
问题内容: 我有两个表:-表a,表b。 表一 - -ID - - 表b - -ID - - 我必须在没有 UNION 命令的情况下获得这样的输出: - - ID - - - 注意:我有一个联合的解决方案:- 我需要替代方案。 请专家建议。 问题答案: 为此,我们需要另一个具有(至少)2行的表: 然后,如果我们只想要一个查询,则可以使用( 这很有趣,请不要在生产中使用 ,这就是为什么要使用 ): 在
问题内容: Java中goto关键字的替代功能是什么? 由于Java没有goto。 问题答案: 你可以使用带标签的BREAK语句: 但是,在正确设计的代码中,你不需要GOTO功能。
问题内容: 我需要将while循环暂停特定的毫秒数。我尝试使用,但是它不准确,尤其是在循环场景中。毫秒精度在我的程序中很重要。 这是我不希望在expectedElapsedTime通过之前检查条件的算法。 问题答案: 你能指望什么? 如果您进入睡眠状态,则一旦您的进程再次可运行,就必须等待线程调度程序再次对其进行调度。 我的意思是如果您进入睡眠状态50秒钟,这并不意味着您的进程将在完全50秒钟内运
我正在寻找某种替代ImageJ(http://imagej.nih.gov/ij/)。对于那些不知道的人来说,ImageJ非常适合从用户编写的脚本中分析和创建这些tif文件。然而,我注意到在java项目中使用它(使用它的jar)是相当资源密集型的。我想知道是否有一些替代方案,也许对开发人员来说更好(不需要图形用户界面,但对内存更有效)。
问题内容: 因此,我今天编写了一种方法,该方法结合了嵌套开关语句的使用,并且代码对我来说看起来很简洁明了,但是有人告诉我,嵌套开关语句通常不是最好的处理方法,因为它们可能会使更多的语句变得混乱。切换添加的语句。这是我的代码的示例: 因此,我的问题是,从本质上讲,什么是这些switch语句的合适替代方案? 问题答案: 我建议您用对过程的调用替换每个嵌套的switch语句,然后该过程将执行嵌套的swi