java sql in 替代方案,Java-PreparedStatement IN子句替代项?

小编典典

建议的选项是:

准备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)。任何运行良好的服务器都会在运行查询之前优化出重复值。

这些选项都不是超级好。

这些地方已经用同样合理的替代方法回答了重复的问题,但仍然没有一个超级好:

在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方法进行扩展。

2020-02-24

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值