前面時間一直忙于趕項目,忽略了Struts2+hibernate+spring這個系列只是開了個頭,所以趕緊把以前的代碼翻出來,整理了一下,就接著講DAO層吧。
首先我們一起討論一下DAO層的設計,一般來說,有這樣兩種設計:
java 代碼
- public class ADAO(){
- public void create(A a){
- ....
- }
-
- public void add(A a){
- ....
- }
-
- public void delete(A a){
- ....
- }
-
- }
-
- public class BDAO(){
- public void create(B b){
- ....
- }
-
- public void add(B b){
- ....
- }
-
- public void delete(B b){
- ....
- }
-
- public void find(B b){
- ....
- }
- }
-
- public class CDAO(C c){
- public void create(){
- ....
- }
-
- public void add(C c){
- ....
- }
-
- public void delete(C c){
- ....
- }
-
- public void find(C c){
- ....
- }
- }
這里一共設計了三個實體DAO,分別為A,B,C,這樣的好處是對象的封裝思想比較好,每個實體DAO都有自己獨立的接口方法,但缺點也顯而易見,就是重復代碼太多太多。
再看第二種設計思想,以解決前面的缺點:
java 代碼
- abstract public class BaseDAO{
- public void create(Object o){
- ....
- }
-
- public void add(Object o){
- ....
- }
-
- public void delete(Object o){
- ....
- }
-
-
- }
-
- public class ADAO entends BaseDAO{
- public void otherMethod(A a){
- .....
- }
- }
-
-
- .....
使用這種設計思想,很好的解決了前面的瓶頸,但它也有缺點,破壞了面向對象的封裝性。
兩個設計思想,我們該如何取舍呢?其實如果了解泛型的話,就迎刃而解了,于是,就有了第三種解決方案如下:
java 代碼
- abstract public class DAO {
- public void create (T t)){
- ...
- }
-
- public void delete (T t)){
- ...
- }
-
- public void update (T t)){
- ...
- }
-
- ...
- }
-
- public class ADAO extends BaseDAO {
- public void otherMethod (A a){
- ...
- }
- }
注:關于泛型的知識,不是本文所要講的,如有不解,可查找有關文檔尋求幫助。
應該說,我個人比較喜歡第三種解決方案,由于這個項目使用了spring,于是大家應該又能想到讓它繼承于Spring的HibernateDaoSupport
,提供分頁函數(shù)和若干便捷查詢方法,并對返回值作了泛型類型轉換。
經過討論后,大家應該有了比較好的思路了,具體代碼礙于篇幅,下一篇貼出。