2012-02-20 109 views
0

我的想法正確嗎?Java JDBC數據庫訪問層

Java數據庫訪問層通常如何實現?我想我有一個類DBAL它具有的功能,如

  • 保存(obj對象)
  • 刪除(obj對象)
  • findOne(字符串類型,String列,字符串值)
  • 的findAll(字符串類型,String列,字符串值)

savedelete將接受的域對象類例如。產品,用戶...然後執行相應的動作相應地

findOnefindAll將接受type其對應於表名,然後使用柱和值用於WHERE子句。非常簡單,但我想知道這個想法是否正確?

通常我看到很多網站有DAO但不會ProductDAOUserDAO會很相似嗎?我可以將它們合併爲1類DBAL?

模擬ORM

從ORM正在添加背景。我想知道ResultSet.getObject將如何工作,它會像ORM那樣工作,我查詢用戶表,我可以找回例如List<User>

回答

4

在Java中實現數據庫訪問層的方法有很多,其他語言也適用相同的模式。最簡單的形式是表數據網關。在這種模式下,每個數據庫表都有一個網關實例。 DAL的其他模式爲錶行網關其中表中每個數據庫行都有一個網關實例。 活動記錄,其中域對象知道如何與數據庫本身交談。 數據映射器其中數據在域對象和數據庫之間移動,同時保持它們彼此獨立和映射器本身。 每種方法都有各種優點和缺點。嘗試查看我提到的模式,看看最適合您的應用的是什麼。

人們對他們的基本DAO(TDG,TRG,你有什麼)進行子類化的主要原因是爲每個域對象類型提供一個明確的,不同的類型安全接口+它使客戶更容易找到正確的數據訪問函數他們需要爲了實現一個用例。這是相同的基類是抽象的代碼......

如果你在應用程序的開始階段我會建議您使用工具來處理數據訪問(如Hibernate爲例)。這些工具非常通用,並且存在一百萬個問題,但至少您可以專注於先讓您的業務邏輯正確,然後再擔心這些應用領域之外的問題。如果事實證明問題畢竟存在,並且您的軟件看起來像是成功了,那麼您可以繼續進行數據訪問,以改善性能或您選擇的工具所帶給您的其他令人頭痛的問題。我只是這樣說,因爲製作一個好的本地數據訪問解決方案相當困難,而且這將花費你大量的時間。考慮併發問題,從數據庫ID到內存實例(s!)的映射等等。

至於你關於ResultSet的問題。不,getObject將以Result對象的形式獲取此ResultSet對象的當前行中指定列的值。因此,您必須自己進行投射,這也是爲什麼從您的域對象獲取來自ResultSet的Factory的好主意(如果沿着這條路徑)。

這是一個巨大的話題,我很抱歉,如果我不能進入所有的模式更詳細。我也努力做自己:-)如果你決定自己做,而不是使用「標準」工具,我會很樂意回答你的更多問題,在你弄清楚我提到的哪些模式後最適合你的需求。

問候。