Удалить шаблон из кода БД

Кажется, что каждый раз, когда я хочу выполнить запрос БД, я должен написать следующее:

Connection conn = null;
Statement stmt = null;
ResultSet rset = null;

try {
    conn = dataSource.getConnection();
    stmt = conn.prepareStatement(sql);
    // ...set stmt params
    rset = stmt.executeQuery();
    while(rset.next()) {
        // Do something interesting
    }
} finally {
    try { if (rset != null) rset.close(); } catch(SQLException e) { }
    try { if (stmt != null) stmt.close(); } catch(SQLException e) { }
    try { if (conn != null) conn.close(); } catch(SQLException e) { }
}

Это действительно лучший способ сделать это? Есть ли способ, по крайней мере, уменьшить беспорядок?

Отредактировано: как отмечалось в некоторых комментариях, этот код не был длиннымenough.

 Nick Holt02 июл. 2009 г., 09:29
@ Роберт - не то, чтобы это было хорошо, и я согласен, что нулевая проверка должна быть добавлена, но NullPointerException будет перехвачен в блоке catch (вместе с OutOfMemoryError и всеми другими исключениями времени выполнения, которые могут возникнуть).
 Nick Holt02 июл. 2009 г., 09:30
Если вы собираетесь делать код JDBC самостоятельно, стоит написать класс JDBCUtils, который имеет методы safeClose для каждого класса JDBC. Эти методы должны проверять наличие нуля и перехватывать / регистрировать SQLException.
 Robert Munteanu02 июл. 2009 г., 09:21
Кстати, вы должны проверить каждый из них на нулевое значение перед закрытием.
 Peter Štibraný02 июл. 2009 г., 09:45
Не регистрируйте только исключения, но сообщайте вызывающей стороне о том, что произошла ошибка, в противном случае вызывающая сторона не сможет отреагировать на проблему (а в некоторых случаях может захотеть). Spring JDBC Template прекрасно решает эту проблему путем преобразования исключений в иерархию исключений времени выполнения.

Ответы на вопрос(5)

Решение Вопроса

Spring JdbcTemplate за:

greatly reduced boilerplate code have a good sql exception hierarchy to handle common database problems with specific runtime exceptions (later with further Spring usage) use declarative transaction management

Если это кажется слишком тяжелым на данный момент, вы можете реализовать некоторые служебные классы и методы для «стандартной части». Изучение источника JdbcTemplate должно помочь в этом случае.

 02 июл. 2009 г., 09:41
Spring Spring исключает иерархию исключений. Поддержка Jdbc в Spring - это то, что я пытаюсь использовать, если это возможно, или, по крайней мере, копировать, если Spring отсутствует в проекте.

public class DBHelper
{
    public static Object run(string sql, List params, ResultHandler rhandler)
    {
        Connection conn = null;
        Statement stmt = null;
        ResultSet rset = null;

        try {
            conn = dataSource.getConnection();
            stmt = conn.prepareStatement(sql);
            int i = 0;
            for(Object p in params)
            {
                stmt.setObject(++i, p);
            }
            rset = stmt.executeQuery();
            return rhandler.handle(rset);
        } finally {
                try { rset.close(); } catch(Exception e) { }
                try { stmt.close(); } catch(Exception e) { }
                try { conn.close(); } catch(Exception e) { }
        }
    }
}

public interface ResultHandler
{
    public Object handle(ResultSet)
}

public class Test
{
    public static void main(String[] args)
    {
        String s = (String)DBHelper.run("select * from mytable where col = ?",
                Arrays.asList({"foo"}), 
                new ResultHandler
                {
                    public Object handle(ResultSet r)
                    {
                        r.first();
                        return r.getString("col2");
                    }
                }();
    }
}
 06 авг. 2012 г., 15:49
нужен новый ResultHandler ()
 02 июл. 2009 г., 09:48
Вы торгуете много шаблонов для гораздо меньшего количества линий шаблонов ...

я хотел бы использоватьзимовать или жеJPA to reduce the clutter...

http://static.springsource.org/spring/docs/2.0.x/reference/jdbc.html).

Или, если вы не используете Spring, скопируйте шаблон шаблона, который они используют в своем собственном коде.

DbUtils Это очень полезный фреймворк, я использовал его для небольших проектов, где Spring и Hibernate излишни. Он также может выполнять некоторое сопоставление объектов.

 31 окт. 2014 г., 20:57
Спасибо за указание на это
 03 июл. 2009 г., 08:30
+1 Хороший улов - мне это нравится! Похоже, они по существу упаковали «помощник». подход, который я описал. Я буду помнить об этом в следующий раз. :-)

Ваш ответ на вопрос