Есть ли способ подготовить оператор SQL в Java без использования объекта подключения? - PullRequest
3 голосов
/ 01 марта 2010

Я довольно новичок в JDBC, так что это, вероятно, очень простой вопрос.

Мне нужно выполнить несколько операторов SQL, поэтому я пытаюсь написать общий метод "runSQLResultSet", который принимает оператор String sql и возвращает ResultSet. Я хочу, чтобы он позаботился об открытии соединения с базой данных, выполнении оператора, сохранении ResultSet в CachedRowSetImpl объекте (чтобы оно сохранялось после закрытия соединения) и закрытии соединения. Я создал метод, который делает это, и он работает.

Моя проблема сейчас в том, что я хочу использовать его для динамических операторов, построенных с переменными. Я оглянулся, и мне кажется, что я должен изменить свой метод на PreparedStatement вместо простого String. Затем я могу построить PreparedStatement на другой стороне и передать его методу. Проблема в том, что я не могу создать PreparedStatement без объекта Connection. Я могу открыть соединение перед подготовкой оператора, но это противоречит моей цели: вынести обработку базы данных в метод runSQLResultSet. Мне нужен способ построить оператор SQL с динамическими компонентами без объекта подключения и передать его методу, который затем выполнит его. Есть ли способ сделать это с PreparedStatement? Есть ли другой объект оператора, который я могу использовать вместо этого? Иначе - есть ли лучший способ сделать это?

Ответы [ 4 ]

2 голосов
/ 01 марта 2010
public ResultSet excuteStatement(String statement, Object... params){
  statement = conn.prepareStatement(statement);
  int i = 1;
  for (Object o:params){
    statement.setObject(i++,o);
  }
  ResultSet rs = statement.executeQuery();
  return rs;
}
1 голос
/ 01 марта 2010

Вы не можете создать его без подключения к БД. PreparedStatement будет предварительно скомпилирован в БД и, следовательно, действительно нуждается в открытом соединении.

Вместо этого вы можете просто рассмотреть возможность динамического построения строки SQL. Генерация PreparedStatement заполнителей (? вещей) в цикле и использование String#format() для помещения их в строку SQL. Вы также можете просто передать переменные в ваш метод runSQLResultSet и создать вместо них.

Согласно комментариям, вот пример:

try {
    connection = database.getConnection();
    statement = connection.prepareStatement(SQL);
    setValues(statement, values);

    // ...

.

public static void setValues(PreparedStatement preparedStatement, Object... values) throws SQLException {
    for (int i = 0; i < values.length; i++) {
        preparedStatement.setObject(i + 1, values[i]);
    }
}
0 голосов
/ 01 марта 2010

Если я вас правильно понял, вы хотите использовать один и тот же запрос с разными переменными, вставленными в запрос. Вы можете сделать так, чтобы ваш метод возвращал ResultSet, как это делается в настоящее время, и передавал переменные в качестве параметров метода.

тогда вы можете поместить параметры в запрос внутри метода.

public ResultSet getResult(String param1, String param2){
 statement = conn.prepareStatement(yourQuery);// conn must be an open connection
 statement.setString(1,param1);
 statement.setString(2,param2);
 ResultSet rs = statement.execusteQuery();
 return rs;
}

Это основной пример того, как вы могли бы сделать что-то подобное, если бы я правильно понял ваш вопрос.

0 голосов
/ 01 марта 2010

вам не хватает концепции пула соединений базы данных, вы никогда не должны создавать экземпляры соединений напрямую, пул управляет соединениями базы данных под прикрытием. Вы можете взглянуть на мой проект с открытым исходным кодом SQL Construction Kit , чтобы узнать, как можно облегчить работу с JDBC и создать динамические операторы SQL с использованием шаблонов Factory и Builder.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...