gpt4 book ai didi

java - 如何准备 List, ?>>

转载 作者:行者123 更新时间:2023-11-29 05:58:44 24 4
gpt4 key购买 nike

目标是编写一个方便的方法,使用简单的客户端调用形式从 JDBC 查询返回结果集。

我写过这样的东西:

public class JdbcQueryManager {
public static ResultSet executePreparedStatementWithParameters(
Connection jdbcConnection, String sqlQuery,
Map.Entry<? extends Class<?>, ?>... sqlQueryParameters)
throws JdbcQueryFailureException {
return executePreparedStatementWithParameters(jdbcConnection, sqlQuery,
Arrays.asList(sqlQueryParameters), ResultSet.TYPE_FORWARD_ONLY,
ResultSet.CONCUR_READ_ONLY, ResultSet.CLOSE_CURSORS_AT_COMMIT);
}
private static ResultSet executePreparedStatementWithParameters(
Connection jdbcConnection, String sqlQuery,
List<Map.Entry<? extends Class<?>, ?>> sqlQueryParameters,
int resultSetType, int resultSetConcurrency, int resultSetHoldability)
throws JdbcQueryFailureException {
try {
PreparedStatement preparedStatement =
jdbcConnection.prepareStatement(sqlQuery, resultSetType,
resultSetConcurrency, resultSetHoldability);
for (int i = 0; i < sqlQueryParameters.size(); i++) {
int sqlQueryParameterIndex = i + 1; // SQL parameters are 1-based
Entry<? extends Class<?>, ?> sqlQueryParameter =
sqlQueryParameters.get(i);
Class<?> sqlQueryParameterClass = sqlQueryParameter.getKey();
if (sqlQueryParameterClass == Integer.class) {
int sqlQueryParameterIntegerValue =
(Integer) sqlQueryParameter.getValue();
preparedStatement.setInt(sqlQueryParameterIndex,
sqlQueryParameterIntegerValue);
} else if (sqlQueryParameterClass == String.class) {
String sqlQueryParameterStringValue =
(String) sqlQueryParameter.getValue();
preparedStatement.setString(sqlQueryParameterIndex,
sqlQueryParameterStringValue);
// TODO: accept other types, not just String and Integer
} else {
throw new JdbcQueryFailureException(new IllegalArgumentException(
sqlQueryParameterClass.getName()));
}
}
ResultSet resultSet = preparedStatement.executeQuery();
return resultSet;
} catch (SQLException sqlException) {
throw new JdbcQueryFailureException(sqlException);
}
}
}

使用这个便利类:

public class QueryParameter<T> extends AbstractMap.SimpleEntry<Class<T>, T> {
@SuppressWarnings("unchecked")
public QueryParameter(T parameterValue) {
super((Class<T>) parameterValue.getClass(), parameterValue);
}
}

能够像这样执行 JDBC SQL 语句:

ResultSet resultSet =
JdbcQueryManager.executePreparedStatementWithParameters(jdbcConnection,
sqlQuery, new QueryParameter<String>("AnswerRequest"),
new QueryParameter<Integer>(42));

...我怎样才能让它变得更好?

具体来说,我的困惑在于使用这种看似复杂、可能不需要的形式:

List<Map.Entry<? extends Class<?>, ?>>

最佳答案

传递 Map.Entry<? extends Class<?>, ?> 的列表没有任何值(value)- 你试图告诉你的方法每个参数是什么类。 不要这样做!!!

与流行的看法相反,您不需要使用各种类型的 preparedStatement.setXXX()如果您使用“基本”Java 对象(包装原语和 Dates ),只需使用 preparedStatement.setObject(index, object) 方法。然后 jdbc 驱动程序会找出要做什么!

唯一需要使用类型化 setter 的情况是您的对象不是“基本”类型之一。如果你真的需要这个,那么就使用 instanceof检查每个参数,然后你会写一些代码来提取一个字符串值来使用,但你仍然可以调用 preparedStatement.setObject(index, object)用那个字符串。


我自己写过这样的东西,我只是用了:

public static ResultSet executePreparedStatementWithParameters(
Connection jdbcConnection, String sqlQuery, Object... parameters)

而且效果很好。

关于java - 如何准备 List<Entry< 类型的参数?扩展类 <?>, ?>>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11015529/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com