2014-02-25 75 views
2

我正在研究一個將跟蹤食物訂單的小型餐館管理應用程序。我正在創建一個能夠處理所有SQL查詢的類(以便於其他隊友使用),我想知道一些最佳做法。該課程將非常專門地處理連接/斷開/插入和查詢,並且只會接受基本參數。我有以下設計問題:異常處理(應該用戶必須處理它們,我更喜歡它們不),連接(應該重新建立連接並在每個查詢上關閉或僅在完成一組查詢時關閉),並顯示結果(我應該如何最優雅地轉換ResultSet,它可以拋出異常,執行穩定的最終結果集)。JDBC訪問器類的最佳實踐

TLDR; 封裝MySQL類的最佳設計是什麼,它將使類的用戶只需要使用內置方法。

+0

謝謝大家的優秀資源,但這是一個很好的例子,可以練習好的風格,我希望可以詳細闡述設計問題。 – user3352280

回答

2

2013年,我們有足夠的框架使數據庫訪問比普通的JDBC更簡單。

請查看jOOQ瞭解更多關於更復雜的內容的類似於Active Record的API或Hibernate。如果你想品嚐未來,看看Spring Data

+0

確實有比重新發明輪子更簡單的方法,但他/她的公司有可能不允許第三方軟件。所以,我對這個問題的答案感興趣。 –

+0

這些都是優秀的資源,但我想要更多的低級「自己動手」實施。不過,我可能最終會使用這些。 – user3352280

+0

我們在2014 xD – nachokk

0

根據您的要求,我建議您使用Hibernate框架。它具有您提到的所有內置功能。此外,它還有助於將表格直接映射到簡單的POJO。

使用Hibernate,你可以在xml配置文件中設置你想要的屬性,然後你可以隨意改變它來獲得你想要的。異常處理是用戶不應該做的事--Hibernate爲此提供了特性。由於它將表映射到POJO,因此可以輕鬆處理ResultSet。

+0

我不同意這一點。 Hibernate不是簡單或輕量級的。 – duffymo

0

我會盡量提供一個自己的答案。

讓方法拋出你的api,這是一種常見的API實踐。

一個ResultSet就像一個List<HashMap<String, dataType>>

創建一個列表,並返回被填充到 HashMap中,其中字段名是關鍵,返回的數據每條記錄是 值再加入HashMap到列表。對於每條記錄,創建一個新的HashMap並重復。

您可以在resultSet上使用metaData來獲取返回的列數和返回的列的名稱。

//rs is a ResultSet 
    rs.getMetaData().getTableName(int Column); 
    rs.getMetaData().getColumnCount(); 

示例代碼選擇查詢:

private List<HashMap<String,Object>> selectQuery(sql) throws SqlException { 
     //assumption that connection is a global 
     List<HashMap<String, Object>> results = new ArrayList<HashMap<String, Object>>(); 
     HashMap<String, Object> record = null; 
     PreparedStatement pStmt = conn.prepareStatement(sql); 
     ResultSet rs = pStmt.executeQuery(); 
     while (rs.next() { 
      record = new HashMap<String, Object>(); 
      for (int i : rs.getMetaData().getColumnCount()) { 
       record.put(rs.getMetaData().getTableName(i), rs.getString(i)); 
      } 
      results.add(record); 
     } 
     rs.close(); 
     return results; 
    } 

連接 -

保持連接打開,直到他們關閉它。開發者應該知道 已經足夠好,以至於你應該總是關閉你的連接,否則 會造成泄漏。

0

這是我的看法:

類將處理連接

您應該使用連接池來獲取並管理連接。

斷開所

的連接應該按服務工作/用例中的每個單元獲取。該服務負責從關閉finally塊中的連接的池中獲取連接,並提交或回滾事務。

插入和查詢

容易做到。

非常明確,只會採取基本參數

必須採取一些必要的操作數據。你不知道基本。

我有以下設計問題:異常處理(應 用戶必須處理他們,我寧願他們不這樣做),

持久的異常千萬別泡出的服務層。它應該通知用戶發生了什麼,但不通過發送異常。用戶友好的信息是首選。

連接(應連接被重新建立和 每個查詢或只是當一組查詢完成後關閉),

連接應在最窄的範圍可能打開。將他們與工作/交易單位聯繫起來。該池分攤成本。

和顯示結果(我應該如何最優雅的轉換 的ResultSet,它可以拋出異常,做一個穩定的一組最終的結果 )。

ResultSet永遠不應該離開持久層。關閉它的責任將會丟失。您應該將所有結果集映射到對象或對象集合中並返回。

看看Spring的JDBC模板。它已經分類了大部分。

我不會推薦Hibernate。

+0

對不起,也許我不清楚。這不會離開服務級別(我認爲我的團隊中的其他開發人員是「用戶」)。你認爲我應該在我的層面上處理例外,還是讓他們「泡」到下一個最高層。 – user3352280

+0

「這取決於」。沒有足夠的信息來決定。我不會推薦一個全面的答案。我不是在設計你的系統。 – duffymo