간단한 클라이언트 측 호출 형식으로 JDBC 쿼리의 ResultSet을 반환하는 편리한 메소드를 작성하는 것이 목적입니다. 나는이 같은 것을 쓴형식의 인수를 준비하는 방법 : 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 자 이상을 받아 들여야합니다. 이것이 일반적으로 IMO가 된 이유입니다. – sp00m
그 이유는 무엇입니까? :) 기본적으로 "한 줄에 더 많은 문자가있는 형식 코드"/ "더 넓은"을 의미합니까? – Robottinosino
IMHO, 당신은 단지 전체'QueryParameter' 물건으로 당신의 삶을 복잡하게 만들고 있습니다. 왜'execute (sqlQuery, "AnswerRequest", 42)'와 같은 것을 사용하지 않습니까? 한 번 이런 식으로 썼고 그것은 작동합니다 (4 개의 다른 DB로). – maaartinus