Почему мне нужно соединение для создания PreparedStatements?

Это проблема динамического программирования, которая может быть смоделирована даже как проблема самой длинной подпоследовательности. Рассмотрим координаты городов к северу от реки a1, a2, a3..aN. Теперь найдите соответствующие города на юге реки и отметьте их как a1, a2, a3..aN. Тогда решением проблемы будет самая длинная общая последовательность последовательностей, образованных алиами на севере и юге реки.

7
задан Community 23 May 2017 в 12:22
поделиться

4 ответа

Зачем мне нужно соединение для создания PreparedStatements?

Потому что в большинстве RDBMS операторы подготавливаются для каждого соединения.

Подготовленные операторы фактически являются кэшированными планами выполнения, которые не принимают во внимание ваши разрешения, кодировки, параметры сортировки и т. д.

Все это делается во время синтаксического анализа запроса.

Есть ли способ делать то, что я хочу, без использования ] String.format ()

Не понимаю, зачем вам здесь String.format () .

Вы можете реализовать свой запрос как класс, создать соединение и подготовить запрос в конструктор класса и затем выполнить его в методе.

Параметризованный запрос обычно выглядит следующим образом:

SELECT  *
FROM    table
WHERE   col1 = ?
        AND col2 = ?

, где связанные параметры будут заменены на ? во время выполнения запроса.

Если вам нужен статический метод:

  • Создайте статический дескриптор соединения.
  • Создайте статическую хеш-таблицу подготовленных запросов, используя параметризованный текст запроса в виде ключа и дескриптор подготовленного запроса в виде значения .
  • Каждый раз, когда вы хотите выполнить запрос, найдите его дескриптор (или создайте его, если он не был найден) и используйте, чтобы связать параметры и выполнить запрос.
14
ответ дан 6 December 2019 в 14:09
поделиться

Я абстрагируюсь от всего JDBC, имея класс, который я вызываю QueryRunner, который имеет метод выполнения, который принимает sql, список объектов, представляющих параметры, и объект, который будет обрабатывать ResultSet. Если вы используете метод setObject из JDBC для установки параметров, он определит соответствующие типы БД для использования на основе базового объекта. Вот часть моего кода. У меня есть еще один метод, который обертывает этот и получает соединение.

public void executeNoCommit(Connection conn,
                            String sql, 
                            List params, 
                            ResultSetProcessor processor) throws SQLException {
    PreparedStatement stmt = null;
    ResultSet rs = null;
    int updateCount = 0;
    Iterator it;
    int paramIndex = 1;
    boolean query;

    try {
        stmt = conn.prepareStatement(sql);

        if (params != null) {
            it = params.iterator();
            while (it.hasNext()) {
                stmt.setObject(paramIndex, it.next());
                paramIndex++;
            }
        }

        query = stmt.execute();
        if (query) {
            rs = stmt.getResultSet();
        }
        else {
            updateCount = stmt.getUpdateCount();
        }

        processor.process(rs, updateCount);
    }
    finally {
        if (rs != null) {
            try {
                rs.close();
            }
            catch (SQLException e) {
                log.error(e);
            }
        }

        if (stmt != null) {
            try {
                stmt.close();
            }
            catch (SQLException e) {
                log.error(e);
            }
        }
    }
}
0
ответ дан 6 December 2019 в 14:09
поделиться

Почему бы вашей «прикладной» логике не использовать созданный вами уровень данных, который может представлять такой метод интерфейса?

Затем ваш уровень данных может обрабатывать создание соединений, подготовку операторов и т. Д. ., все в этом методе executeNonQuery .

Я думаю, что если вы пытаетесь самостоятельно объединить параметры в своем запросе / заявлении в строку, то вы стреляете себе в ногу и фактически не используете функциональные возможности параметров PreparedStatements. Не уверен, зачем вам это нужно.

Возможно, вы также захотите изучить использование API, такого как Spring, который имеет серию классов JdbcTemplate , которые могут абстрагировать всю обработку соединения от вы, но по-прежнему позволяете работать с параметрами в Map .

1
ответ дан 6 December 2019 в 14:09
поделиться

Вероятно, вам понадобится что-то вроде пакета DbUtils в библиотеках Apache Commons: [ http://commons.apache.org/dbutils/index.html] [1]

Класс QueryRunner позволяет выполнять операторы sql без необходимости вручную создавать PreparedStatements или даже иметь открытое соединение в этом отношении. Со страницы примеров:

QueryRunner run = new QueryRunner( dataSource );
try
{
    // Create an object array to hold the values to insert
    Object[] insertParams = {"John Doe", new Double( 1.82 )};
    // Execute the SQL update statement and return the number of
    // inserts that were made
    int inserts = run.update( "INSERT INTO Person (name,height) VALUES (?,?)",
                              insertParams );

    // Now it's time to rise to the occation...
    Object[] updateParams = {new Double( 2.05 ), "John Doe"};
    int updates = run.update( "UPDATE Person SET height=? WHERE name=?",
                              updateParams );
}
catch(SQLException sqle) {
    // Handle it
}

Таким образом, он в основном прозрачно обрабатывает создание подготовленных операторов, и единственное, что вам действительно нужно знать, это DataSource. Это также работает так же хорошо для операторов без обновления / вставки, то есть простых запросов выбора, а возможность создавать ResultSetHandlers дает вам возможность преобразовать ResultSet во что-то вроде полностью подготовленного bean-компонента или Map с ключами - имена столбцов, а значения - фактические значения строк. Очень полезно, когда можно.

0
ответ дан 6 December 2019 в 14:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: