预准备语句,其中包含 IN 子句中的参数列表

2022-08-31 08:30:42

如何在 JDBC 中为 preparedStatement 中的 in 子句设置值,同时执行查询。

例:

connection.prepareStatement("Select * from test where field in (?)");

如果这个 in-clause 可以包含多个值,我该怎么做。有时我事先知道参数列表,有时我事先不知道。如何处理这种情况?


答案 1

我所做的是为每个可能的值添加一个“?”。

var stmt = String.format("select * from test where field in (%s)",
                         values.stream()
                         .map(v -> "?")
                         .collect(Collectors.joining(", ")));

替代使用(这是10多年前的原始答案)StringBuilder

List values = ... 
StringBuilder builder = new StringBuilder();

for( int i = 0 ; i < values.size(); i++ ) {
    builder.append("?,");
}

String placeHolders =  builder.deleteCharAt( builder.length() -1 ).toString();
String stmt = "select * from test where field in ("+ placeHolders + ")";
PreparedStatement pstmt = ... 

然后愉快地设置参数

int index = 1;
for( Object o : values ) {
   pstmt.setObject(  index++, o ); // or whatever it applies 
}
   

   

答案 2

您可以使用下面的javadoc中提到的方法:setArray

http://docs.oracle.com/javase/6/docs/api/java/sql/PreparedStatement.html#setArray(int, java.sql.Array)

法典:

PreparedStatement statement = connection.prepareStatement("Select * from test where field in (?)");
Array array = statement.getConnection().createArrayOf("VARCHAR", new Object[]{"A1", "B2","C3"});
statement.setArray(1, array);
ResultSet rs = statement.executeQuery();

推荐