Цель состоит в том, чтобы написать метод удобства, который возвращает ResultSet из запроса JDBC с помощью простой формы вызова на стороне клиента.Как подготовить аргумент типа: List <Entry <? extends Класс <?>,? >>
я написал что-то вроде этого:
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<?>, ?>>
Боковое примечание: ваш форматтер должен принимать не менее 150 символов в строке. Это, как правило, причина, почему ИМО. – sp00m
Причина, почему ... что? :) Вы имеете в виду «формат кода с большим количеством символов в строке»/«более широкий», в основном? – Robottinosino
ИМХО, вы просто усложняете свою жизнь целым материалом QueryParameter. Почему бы вам не использовать нечто вроде 'execute (sqlQuery," AnswerRequest ", 42)' вместо этого? Я как-то написал что-то вроде этого, и он работает (с 4 различными БД). – maaartinus