Tôi hơi ngạc nhiên khi xem tài liệu này. Đúng là bạn không thể đặt một mảng / bộ sưu tập như sau (và điều này không phụ thuộc vào cơ sở dữ liệu / trình điều khiển JDBC được sử dụng):
String sql = "SELECT col FROM tbl WHERE id IN (?)";
statement = connection.prepareStatement(sql);
statement.setArray(1, arrayOfValues); // Fail.
Nhưng truy vấn trong tài liệu được đề cập phải hoạt động. Tôi có thể nói điều này từ kinh nghiệm với ít nhất Oracle 10g XE kết hợp với ojdbc14.jar
. Tôi nghi ngờ rằng tác giả của tài liệu đã nhầm lẫn mọi thứ hoặc nó thực sự liên quan đến một phiên bản khác (cũ hơn?) Của trình điều khiển DB và / hoặc JDBC.
Phần sau sẽ hoạt động bất kể trình điều khiển JDBC được sử dụng (mặc dù bạn phụ thuộc vào DB đã sử dụng bao nhiêu mục mà mệnh đề IN có thể chứa, Oracle (vâng, một lần nữa) có giới hạn khoảng 1000 mục):
private static final String SQL_FIND = "SELECT id, name, value FROM data WHERE id IN (%s)";
public List<Data> find(Set<Long> ids) throws SQLException {
Connection connection = null;
PreparedStatement statement = null;
ResultSet resultSet = null;
List<Data> list = new ArrayList<Data>();
String sql = String.format(SQL_FIND, preparePlaceHolders(ids.size()));
try{
connection = database.getConnection();
statement = connection.prepareStatement(sql);
setValues(statement, ids.toArray());
resultSet = statement.executeQuery();
while (resultSet.next()) {
Data data = new Data();
data.setId(resultSet.getLong("id"));
data.setName(resultSet.getString("name"));
data.setValue(resultSet.getInt("value"));
list.add(data);
}
} finally {
close(connection, statement, resultSet);
}
return list;
}
public static String preparePlaceHolders(int length) {
StringBuilder builder = new StringBuilder();
for (int i = 0; i < length;) {
builder.append("?");
if (++i < length) {
builder.append(",");
}
}
return builder.toString();
}
public static void setValues(PreparedStatement preparedStatement, Object... values) throws SQLException {
for (int i = 0; i < values.length; i++) {
preparedStatement.setObject(i + 1, values[i]);
}
}
Liên quan đến TIMESTAMP
câu hỏi, chỉ cần sử dụng PreparedStatement#setTimestamp()
.