2009-07-02 5 views
6

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

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) { } 
} 

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

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

+0

Кстати, перед закрытием вы должны проверить каждое значение null. –

+0

@Robert - не то, что это хорошо, и я согласен, что нулевая проверка должна быть добавлена, но исключение NullPointerException будет обнаружено в блоке уловов (вместе с OutOfMemoryError и всеми другими исключениями rumtime, которые могут произойти). –

+0

Если вы собираетесь сделать код JDBC самостоятельно, стоит написать класс JDBCUtils, который имеет методы safeClose для каждого класса JDBC. Эти методы должны проверять значение null и catch/log SQLException. –

ответ

7

Если у вас уже есть DataSource вы можете использовать Spring JdbcTemplate для:

  • значительно снижаются код шаблонного
  • имеет хороший sql exception hierarchy для обработки общих задач базы данных с конкретными исключениями времени выполнения
  • (позже с последующей весной использование) использование декларативного управления транзакциями

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

+0

Исчерпывающая иерархия SQL Spring. Поддержка Jdbc весной - это то, что я пытаюсь использовать, если возможно, или, по крайней мере, копировать, если в проекте нет весны. –

4

Сделайте вспомогательный метод?

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"); 
        } 
       }(); 
    } 
} 
+0

Вы торгуете большим количеством шаблонов для гораздо меньшего количества шаблонов ... – Stobor

+0

новый результат Необходимость Необходима() –

5

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

+0

+1 Хороший улов - мне нравится! Похоже, что они существенно упаковали подход «помощник», который я описал. Я буду иметь в виду это в следующий раз. :-) – Stobor

+0

спасибо, что указали это – Chiseled