2010-10-11 57 views
2

一次又一次,我發現自己創建了一個數據庫實用程序類,它具有多個功能,它們幾乎完全相同,但對結果集的處理方式稍有不同。設計一個通用的數據庫實用程序類

例如,考慮其中有許多功能,這一切看起來像這樣一個Java類:

public void doSomeDatabaseOperation() { 
    Connection con = DriverManager.getConnection("jdbc:mydriver", "user", "pass"); 
    try { 
     Statement stmt = con.createStatement(); 
     ResultSet rs = stmt.executeQuery("SELECT whatever FROM table"); // query will be different each time 
     while (rs.next()) { 
      // handle result set - differently each time 
     } 
    } catch (Exception e) { 
     // handle 
    } finally { 
     con.close(); 
    } 
} 

現在想象一類具有這些功能的20。

正如你所看到的,噸的樣板(打開連接,嘗試-finally塊),這改變將是查詢和你處理結果集的方式嘛。這種類型的代碼以多種語言出現(考慮到您沒有使用ORM)。

你如何管理你的數據庫實用程序類,以減少代碼的重複?典型的數據庫實用程序類在您的語言/框架中看起來如何?

回答

1

我已經在我的項目之一做的方式是,我也跟着用JDBC模板所做的春天並提出了一個查詢框架。基本上創建一個公共類,它可以接受select語句或pl/sql調用並綁定參數。如果查詢返回結果集,還要傳遞Rowmapper。這個rowmapper對象將被框架調用來將每一行轉換成任何類型的對象。

示例 -

Query execute = new Query("{any select or pl/sql}", 
          // Inputs and Outputs are for bind variables. 
          new SQL.Inputs(Integer.class, ...), 
          // Outputs is only meaningful for PL/SQL since the 
          // ResultSetMetaData should be used to obtain queried columns. 
          new SQL.Outputs(String.class)); 

如果你想要的RowMapper -

Query execute = new Query("{any select or pl/sql}", 
          // Inputs and Outputs are for bind variables. 
          new SQL.Inputs(Integer.class, ...), 
          // Outputs is only meaningful for PL/SQL since the 
          // ResultSetMetaData should be used to obtain queried columns. 
          new SQL.Outputs(String.class), new RowMapper() { 

     public Object mapRow(ResultSet rs, int rowNum) throws SQLException { 
      Actor actor = new Actor(); 
      actor.setFirstName(rs.getString("first_name")); 
      actor.setSurname(rs.getString("surname")); 
      return actor; 
     }); 

最後一排類是,如果你已經通過了RowMapper的這將對對象列表輸出 -

for (Row r : execute.query(conn, id)) { 
    // Handle the rows 
} 

您可以看中並使用模板,以確保類型安全。

0

當使用.NET中,Data Access Application Block是在相當廣泛的使用,以提供以下支持:

的[數據訪問]應用程序塊 旨在實現以下 目標:

封裝用於執行最常見的數據訪問任務的邏輯 。

消除常見的編碼錯誤,例如 如未能關閉連接。

解除開發者的需求 爲通用數據編寫重複代碼 訪問任務。

減少 自定義代碼的需要。

合併最佳的 做法的數據訪問,作爲 描述的.NET數據訪問 體系結構指南。

確保 儘可能遠離應用程序塊 函數與不同類型的 數據庫一起工作。

確保應用 對一種類型的數據庫的寫入是,在 的數據訪問,與用於另一種類型的數據庫的 書面 應用方面。

有很多的例子,使用的教程太:一個google search會發現msdn.microsoft,4guysfromrolla.com,codersource.com等。

+0

不錯 - 你能提供一些代碼示例嗎? – 2010-10-11 13:31:28

+0

補充說明回答;那裏有很多樣品! – richaux 2010-10-11 19:08:09

1

聽起來像是你可以利用一個Template Method pattern這裏的。這將允許您定義所有子類將執行該操作的常用步驟(以及適用的默認實現)。然後,子類只需要重寫其不同的操作步驟:SQL查詢,DB-場到對象的字段映射等