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 就可以方便的加上別的條件了。