TL; DR : Каков рекомендуемый подход для повторного использования PreparedStatement
объектов в Java, не внося путаницы в код?
- Если я хочу использовать их повторно, я должен определить их все в начале кода, и это станет беспорядком.
- Если я не создаю их, пока мне не нужно, я могу сохранить код чистым и чистым, но тогда я могу не использовать объекты.
У меня есть такой метод:
PreparedStatement psQuery = conn.prepareStatement("select ...");
PreparedStatement psChild = conn.prepareStatement("select ... where parent = ? and ...");
ResultSet rsQuery = psQuery.executeQuery();
while (rsQuery.next()) {
psChild.setInt(1, rsQuery.getInt("id"));
psChild.executeQuery();
...
}
Сначала я создаю два preparedStatement
, а затем использую их каждый раз, когда мне нужно выполнить эти конкретные c SQL запросов. Я не определяю psChild
внутри моего l oop, потому что тогда я буду создавать новый подготовленный оператор в каждой итерации, вместо того, чтобы просто повторно использовать его.
Теперь мой код гораздо сложнее. Я на самом деле использую 13 различных preparedStatement
экземпляров, и код распространяется на несколько сотен строк. Я бы очень хотел бы разбить его на разные методы, но я не уверен, как это правильно сделать. Я могу придумать два варианта. Во-первых, я делаю это прямо сейчас, разбив только на методы:
PreparedStatement psQuery = conn.prepareStatement("select ...");
PreparedStatement psChild = conn.prepareStatement("select ... where parent = ? and ...");
ResultSet rsQuery = psQuery.executeQuery();
while (rsQuery.next()) {
processChildren(rsQuery.getInt("id"), psChild);
}
Проблема в том, что я получаю processChildren
с этой подписью:
private static void processChild(
...,
final PreparedStatement psFoo,
final PreparedStatement psBar,
final PreparedStatement psDoc,
final PreparedStatement psGrumpy,
final PreparedStatement psHappy,
final PreparedStatement psSleepy,
final PreparedStatement psDopey,
final PreparedStatement psBashful,
final PreparedStatement psSneezy,
final PreparedStatement psYetAnotherOne,
final PreparedStatement psAndAnotherOne,
final PreparedStatement psLastOne,
...) {
Не совсем отлично.
Другой вариант - создать каждое подготовленное утверждение в методе, где оно мне понадобится. Это было бы намного чище, но это то же самое, что создавать их внутри l oop: я бы их не использовал повторно.
Существует еще одна опция, чтобы объявить переменные как атрибуты класса, таким образом Я мог бы сначала создать их, а затем повторно использовать без необходимости загромождать сигнатуры «метода детей». Но это кажется еще более неправильным, точно так же, как использование глобальной переменной. Хуже того, 13 «глобальных» переменных - все они с одинаковым классом и очень похожими именами. Как бы я это ни делал!
Как я могу продолжить?
Примечание: я знаю о гораздо лучших решениях для персистентности, таких как JPA. Я не ищу альтернативу подготовленным заявлениям, я только хочу знать, каков обычный подход в таких случаях, как мой.
Редактировать : Кажется, я упрощенный мой пример. Это ближе к тому, что мне нужно сделать:
- Получить все записи из базы данных 1.
- Для каждой из них (сначала l oop):
- Проверьте, существует ли он в другой базе данных 2.
- Если его нет, создайте его в базе данных 2 и:
- Извлеките все дочерние элементы из базы данных 1.
- Для каждого из детей (второй l oop):
- Проверьте, существует ли дочерний элемент в базе данных 2.
- Если его нет, вставьте его.
Итак, у меня есть два уровня вложенных циклов, от которых я не могу избавиться. И создание готовых операторов снова и снова внутри циклов кажется плохой идеей.