前面時(shí)間一直忙于趕項目,忽略了Struts2+hibernate+spring這個(gè)系列只是開(kāi)了個(gè)頭,所以趕緊把以前的代碼翻出來(lái),整理了一下,就接著(zhù)講DAO層吧。
首先我們一起討論一下DAO層的設計,一般來(lái)說(shuō),有這樣兩種設計:
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){
- ....
- }
- }
這里一共設計了三個(gè)實(shí)體DAO,分別為A,B,C,這樣的好處是對象的封裝思想比較好,每個(gè)實(shí)體DAO都有自己獨立的接口方法,但缺點(diǎn)也顯而易見(jiàn),就是重復代碼太多太多。
再看第二種設計思想,以解決前面的缺點(diǎn):
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){
- .....
- }
- }
-
-
- .....
使用這種設計思想,很好的解決了前面的瓶頸,但它也有缺點(diǎn),破壞了面向對象的封裝性。
兩個(gè)設計思想,我們該如何取舍呢?其實(shí)如果了解泛型的話(huà),就迎刃而解了,于是,就有了第三種解決方案如下:
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){
- ...
- }
- }
注:關(guān)于泛型的知識,不是本文所要講的,如有不解,可查找有關(guān)文檔尋求幫助。
應該說(shuō),我個(gè)人比較喜歡第三種解決方案,由于這個(gè)項目使用了spring,于是大家應該又能想到讓它繼承于Spring的HibernateDaoSupport,提供分頁(yè)函數和若干便捷查詢(xún)方法,并對返回值作了泛型類(lèi)型轉換。
經(jīng)過(guò)討論后,大家應該有了比較好的思路了,具體代碼礙于篇幅,下一篇貼出。