天天看點

純JDBC系統的開發随想

前兩天,兩個個純背景應用項目在沒有充分論證的情況下使用了Spring+iBatis實作,從需求到實作、測試曆經兩天時間,實際代碼開發時間是8小時,時間比較短,因為有以前的代碼積累。再加上對架構熟爛于心,就像聊天一般的把系統實作了。

今天,迫于壓力,需要推翻重做,隻允許用JDBC,包括日志工具包,其他的一概不讓使用。我也挺郁悶的,剛做好測完了,又要推翻重來-----沉住氣,硬是花了6個小時時間把這兩個項目的背景代碼全用JDBC實作了,不是說寫JDBC代碼快,而是因為給予對需求和資料庫有了透徹了解的基礎上。

寫這些不是想發什麼牢騷,而是對JDBC有了一些思考。如果現在誰要說自己系統用JDBC所寫,很容易讓人瞧不起,感覺很低級。因為JDBC太基礎,用的好與用不好有着天壤之别。就像一把利劍,是否對你有利要看你握着劍柄還是劍刃。

着這裡,我不是因為項目用了JDBC費勁而批判什麼,而是要為JDBC正個身,把自己開發JDBC系統的體驗與大家分享,JDBC好與不好全看你怎麼用了。

本人看過無數的JDBC代碼,很多系統,有初學者的,有老手的。但沒看過很優雅分層的JDBC系統。很多代碼都是面向過程式的往下堆,看着到處的try。。。catch,操作結果集代碼,早已把業務邏輯淹沒了,這可以說是一般JDBC系統的通病。

JDBC是在開發者很郁悶,代碼不好寫,不好維護,不好分層,那用它幹啥啊,大多數開發者一般會首先考慮一個問題,自己實作一個系統,怎麼做代價更小的問題。是以JDBC在第一輪的權衡下就被Out了。

對此問題進一步分析,看看能不能找到更好的解決方式。

JDBC代碼為什麼不好寫?要管理資料庫連接配接,要複用連接配接提高性能,要将結果集與Bean自動綁定,要管理事務,要處理衆多的SQLException。

JDBC為什麼不好維護,因為代碼不好寫,寫得很爛,業務和資料混雜在一起,這樣能好維護嗎?

JDBC為什麼難以分層,跨層調用Connection誰來管理,如何做到複用,事務控制在哪層?如何送出事務?如何将業務和資料分離,還需要DAO嗎?

基于以上問題的分析,我把我實作過程中的一些經驗總結出來與大家分享,并不能算最好,也許更好的。

1、包裝一個JDBC工具類,可産靜态産生連接配接和執行各種SQL。這是最基本的,可以省去很多重複的代碼。必要的話可以自己實作各連接配接池,或者用開源的。這樣,操作資料庫的最低級代碼得到了一次大的減肥。

2、而考慮系統的分層,系統分層是很必要的,邏輯清晰,易于維護,資料和業務分離。是以應該有DAO層,其次是服務層(業務層)Service,有了這兩層,業務-資料實基本上已經實作分離了。

3、建立了層,那麼下來就是如何管理層之間的調用,主要是資料庫連接配接,這裡常常看到一個很低級也不容易發現的設計上缺陷:在DAO中建立SQL連接配接,處理SQLException、并用完後立即關閉。這表面上看似沒有錯,但不要忘記了,事務是在Service上,事務應該放到Service層上做控制。你在DAO中把這些活都幹了顯然不合理,再說很多DAO調用才形成了一個業務,顯然那樣做,一個業務的實作需要多次打開和關閉資料庫連接配接,這是導緻性能急劇下降的原因。是以得出一個結論,不要再DAO層去管理連接配接。是以可以考慮在每個Service業務中擷取資料連接配接,在業務中将Connection傳遞給DAO,在DAO中不要處理異常,上抛吧,以便業務層捕獲并處理。對比Spring的事務處理,也是将每個業務方法的資料庫連接配接都儲存在一個線程變量中,這樣既實作了連接配接複用,也友善了事務控制。

4、如何用JDBC實作進階架構的關聯查詢。典型的就是一多關系查詢。這裡可以分兩步實作,實際上Hibernate、iBatis也是分兩步來實作,看看SQL便可知道了。而且要注意兩個ResultSet嵌套時候的關系,如果是多層的,更應該注重這種層次關系。

5、以上問題都解決了,還有幾個不爽的地方,ResultSet到Bean對象集合的轉換,這個可以通過Apache Commons DBUitls來得到解決;資料庫持久化類的書寫,我寫了200行左右的工具,可以輕松解決。動态條件SQL拼裝,這個問題是非常有挑戰性的,目前我就用if。。else。。。做個簡單判定來拼裝。很麻煩,可以學習下iBatis的源碼,看看如何實作。

6、對于事務控制,目前沒有需求,但是已經也考慮到了,可以使用JDBC自己的事務管理,也可以使用cglib或者開源的工具來實作,多高的複雜度,要看你的時間來決定了。

到目前為止,我的項目也不是那麼完美,還有很多地方可以不用寫死,但是時間和精力有限。也希望和大家一塊讨論。

另外,對于MySQL資料庫,如果要連接配接多個資料庫,并且這多個資料庫在一個MySQL上,可以用一個資料庫連接配接URL就行,然後在SQL中就可以動态指定操作的是哪個資料庫上表。這樣避免為一個資料庫建立一個連接配接管理配置。

本文轉自 leizhimin 51CTO部落格,原文連結:http://blog.51cto.com/lavasoft/234158,如需轉載請自行聯系原作者