MVC三層結構訪問數據庫

1.      分爲3層:

product代表類別,是數據模型。

productManager提供服務,提供各種方法

productDAO(是一個接口,可以衍生出product MySQLDAO, product Oracle DAO等等)是數據訪問層,和存儲系統打交道,不一定是數據庫,可以是文件系統等等。

 

產品列表(分頁)

產品添加

產品搜索(分頁)

 

productManager的功能:

1.      列表List<Product> getProducts()

2.      分頁列表 List<Product> getProducts(int pageNo, int pageSize)

3.      搜索 List<Product>  findProducts ?getProducts(int id, String name, String desc , ……)

4.      刪除 deleteProductByCategoryId(int categoryId)

delteProductById(int[] idArray)

 

product很整潔,只有自己的屬性,並只有set,get方法。

 

從需求上來說,productDAO提供的方法應該和productManager方法差不多。但是不一定是一一對應的。productDAO是徹底的和數據庫(文件系統)打交道的類。其實可以有,各種各樣的manager:比如權限manager,比如adminManger什麼的。。。

 

而productManager應該提供各種各樣的方法,可以提供很多重載的方法,來滿足用戶的不同的需求。比如查詢某個產品可以有各種各樣的查詢條件,productManager可以提供多個方法,但是對productDAO而言,其實就是一個數據庫訪問方法,而只是傳遞不同的參數。

 

Jsp頁面向productManager提出請求,所以productManager向jsp頁面提供服務。

ProductManager向productDAO提出請求,所以productDAO向ProductManager提供服務。

請求的方向爲:

JSP > productManager > productDAO> Database

 

最好的設計(主要是在DAO,把DAO寫成一個接口,然後給出不同的數據庫的實現):

ProductManager當中的方法的返回值可以是:

 

Return productDAO.xxxx() //注意,這裏的xxx()方法是一個靜態方法。

 

靜態方法和動態方法的區別:

如果是靜態方法,在ProductManager當中,調用的方式爲productDAO.xxxx()。

如果是動態方法,在ProductManager當中,調用的方式爲先new一個productDAO的對象,然後再調用對象的方法。

區別在於,如果是使用動態方法,對象一直在內存當中存在。當jsp做出相同的二次請求,可以提高效率,直接在內存當中把對象取出來,從而不需要再次訪問數據庫了。也就是說,在這種情況下,相當於成爲一個緩存的作用。耗內存,但是提高效率,用空間換時間。

緩存可以放在ProductManager,也可以放到productDAO,根據需求而定。

往往ProductManager應該寫成單例類。

 

 

productDAO應該聲明成一個接口。

通過這個接口可以衍生出product MySQLDAO, product Oracle DAO從而可以對應不同的數據庫。而productManager當中是調用productDAO,不是具體的某個數據庫的DAO,從而提高代碼的複用性。那麼就不需要重寫DAO類,用某個數據庫,就加上一個特定數據庫的DAO類(這個類實現productDAO接口)就可以了。在ProductManager當中,set哪個接口就是用哪個數據庫,還可以把這個set寫到配置文件當中,直接修改一下配置文件就完事,特方便。這個叫面向接口的編程,也叫控制反轉。

dao應該只和數據庫打交道,不參與業務邏輯。

 

工廠模式:

專門用一個類來產生各種DAO,product,user,category。

然後可以有多個工廠類,mysqlfactory對應mysql。Oraclefactory對應oracle。

 

單例模式:

把構造方法寫成private的。

並通過一個靜態的getInstance()方法來訪問這個對象。

 

    private ProductMgr() {}

   

    publicstatic ProductMgr getInstance() {

       if(mgr == null) {

           mgr = new ProductMgr();

       }

       returnmgr;

    }

 

訪問的方式爲:

ProductMgr.getInstance().add(p);

ProductMgr.getInstance().delete(p);

……

 

tips:

小技巧:在無法判斷在sql當中是否需要where語句的時候,可以在後面加上where 1=1。

sql = “select * from product where 1=1 ” 再需要用sql加上別的字符串的時候,就可以直接sql + “id =” + id. 不然就不知道,是否需要where部分。

如果是在做某些查詢的時候,是不需要where部分的。那麼就麻煩,採用了where 1=1 就可以方便的加上別的條件了。

發佈了65 篇原創文章 · 獲贊 19 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章