Kira-2006
-僅僅是一陣風也罷了,偏偏是這樣永恒, 僅僅是一場夢也罷了,偏偏是如此的真實,
BlogJava
首頁
新隨筆
新文章
聯系
聚合
管理
posts - 4,comments - 7,trackbacks - 0
<
2025年7月
>
日
一
二
三
四
五
六
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
常用鏈接
我的隨筆
我的文章
我的評論
我的參與
最新評論
留言簿
(2)
給我留言
查看公開留言
查看私人留言
隨筆檔案
(3)
2008年4月 (2)
2006年3月 (1)
文章分類
(8)
design pattern
hibernate(6)
hsql(2)
java
文章檔案
(10)
2008年5月 (4)
2008年4月 (4)
2006年9月 (1)
2006年3月 (1)
中國通信建設集團設計院有限公司第三分公司
中國通信建設集團設計院有限公司第三分公司
搜索
最新評論
1.?re: Hibernate---SQL中datetime的映射[未登錄]
aaa
--s
2.?re: hsqldb編寫批處理文件啟動自己創建的數據庫
評論內容較長,點擊標題查看
--懸殊
3.?re: Hibernate---SQL中datetime的映射
type="timestamp"
--cwjcsu@126.com
4.?re: myeclipse自帶Struts缺少jar文件,datasource配置
@隔葉黃鶯
容器的數據源是什么意思呀?如果在struts1.3中手工加入數據源,會出錯嗎?
--tayoto
5.?re: myeclipse自帶Struts缺少jar文件,datasource配置
Struts 不建議在 struts-config.xml 中配置數據源,用容器的數據源吧。
所以 Struts1.3開始廢除了在struts-config.xml中配置數據源。
--隔葉黃鶯
閱讀排行榜
1.?Hibernate---SQL中datetime的映射(2760)
2.?myeclipse自帶Struts缺少jar文件,datasource配置(1270)
3.?一個計算機系學生的困惑?(346)
評論排行榜
1.?Hibernate---SQL中datetime的映射(2)
2.?myeclipse自帶Struts缺少jar文件,datasource配置(2)
3.?一個計算機系學生的困惑?(2)
深入淺出Hibernate筆記--1.2.1持久化設計與解耦
解耦合的設計目標:
1. 應用層解耦合--應用邏輯與數據邏輯相分離。
2. 資源層解耦合--邏輯結構與物理結構相分離。
DAO模式:
即Data Accessor模式和Active Domain Object模式。
Data Accessor模式:實現數據訪問和業務邏輯的分離。
Active Domain Object:實現了業務數據的對象化封裝。
Domain Object:簡單來講就是對領域內涉及的各個數據對象,反映到代碼,就是一個擁有相關屬性的getter,setter方法的java Bean。
DAO模式通過對業務邏輯蹭提供數據抽象層接口,實現了以下目標:
1. 數據存儲邏輯的分離:通過對數據訪問邏輯進行抽象,為上層結構提供抽象化的數據訪問接口。
2. 數據訪問底層實現的分離:數據訪問劃分為抽象層和實現層,從而分離了數據使用和數據訪問的底層實現細節。
3. 資源管理和調用的分離。
4.數據抽象:DAO模式通過對底層數據的封裝,為業務層提供了一個面向對象的接口,使得業務邏輯開發人員可以面向業務中的實體進行編程。
DAO = Data+Accessor+Domain Object
DAO模式的進一步改良
Factory模式的引入:
由于需要針對不同的數據庫訪問機制分別提供各個版本的Data Accessor實現,自然我們會想到通過java interface定義一個調用接口,然后針對這個調用接口實現不同數據庫的Data Accessor。通過接口作為調用界面和實現規范,可以避免對具體實現的依賴。
public
interface
CustomerDAO
{
public
Customer getCustomer(String custID);
public
void
save(Customer customer);
}
作為最常見的創建模式,Factory模式在這里起到連接接口和實現的橋梁作用,通過Factory模式,我們可以根據具體的需要加載相應的實現,并將此實現作為所對應接口的一個實例提供給業務層使用。
CustomerDAO custDAO
=
(CustomerDAO)DAOFactory.getDAO(CustomerDAO.
class
);
Customer customer
=
custDAO.getCustomer(custoemrID);
業務邏輯層通過接口調用底層實現,具體的DAO實現類不會出現在我們的業務代碼中。而具體實現類在配置文件中加以配置,之后DAOFactory.getDAO方法通過讀取配置文件獲得當前我們期望使用的實現類的類名,再通過java Class動態加載機制加載返回。
從而我們的代碼不依賴于某個特定的實現類,只需要在部署的時候在配置文件中指定當前采用的實現類即可。
public
class
DAOFactory
{
private
static
HashMap daoMap
=
null
;
//
根據指定的Class來獲取DAO實例
public
static
Object getDAO(Class daoInterface)
{
initial();
Object dao
=
daoMap.get(daoInterface);
if
(
null
==
dao)
{
throw
new
DAOException(
"
No implementation found of DAO interface =>
"
+
daoInterface.getName());
}
return
dao;
}
//
初始化DAOFactory,加載DAO interface和
//
implementation到daoMap中
public
static
sychronized
void
initial()
{
if
(
null
==
daoMap)
{
//
根據配置文件中加載DAO實現配置
daoMap
=
DAOConfig.load();
}
}
}
//
DAOConfig類實現了配置文件的讀取功能,并根據配文
//
件中的內容加載指定的接口和實現
public
class
DAOConfig
{
private
static
Logger logger
=
LogManager.getLogger(DAOConfig.
class
);
private
static
final
String DAO_CONFIG_FILE
=
"
dao.xml
"
;
private
static
final
String DAO_CONFIG_SECTION
=
"
DAO
"
;
public
static
synchronized
HashMap load()
{
HashMap map
=
new
HashMap();
JFigLocator jfigLocator
=
JFig.getInstance(jfigLocator);
Properties prop
=
daoConfig.getSectionAsProperties(DAO_CONFIG_SECTION);
Enumeration enumSection
=
prop.Keys();
while
(enumSection.hasMoreElements())
{
String daoIface
=
(String)enumSectioni.nextElement();
String daoImpl
=
(String)prop.getProperty(daoIface);
try
{
Class iface
=
ClassToolKit.loadClass(daoIface);
Class impl
=
ClassToolKit.loadClass(daoImpl);
//
將接口作為索引,實現作為值。
map.put(iface,impl);
}
catch
(ClassNotFoundException e)
{
logger.debug(
"
No Class Found =>
"
+
e);
}
}
return
map;
}
}
ClassToolKit.loadClass方法實現了類文件的動態加載:
public
class
ClassToolKit
{
public
static
Class loadClass(String className)
throws
ClassNotFoundException
{
Class cls
=
null
;
try
{
//
首先嘗試用當前ClassLoader加載
cls
=
Thread.currentThread().getContextClassLoader().loadClass(className);
}
catch
(Exception e)
{
e.printStackTrace();
}
if
(cls
==
null
)
{
//
如果通過當前ClassLoader加載失敗,使
//
用系統ClassLoader加載
cls
=
Class.forName(className);
}
return
cls;
}
}
這樣,通過接口與實現的分離,并結合DAOFactory動態加載實現類,我們就實現了底層訪問實現的參數化配置功能。從而為增強產品的部署能力提供了強有力的支持。
經過Factory模式的改造,業務層代碼進行相應的修改:
public
BigDecimal calcAmount(String customerID,BigDecimal amount)
{
//
根據客戶ID獲得客戶記錄
CustomerDAO customerDAO
=
(CustomerDAO)DAOFactory.getDAO(CustomerDAO.
class
);
Customercustomer
=
customerDAO.getCustomer(customerID);
//
根據客戶等級獲得打折比率
PromotionDAO promoDAO
=
(PromotionDAO)DAOFactory.getDAO(PromotionDAO.
class
);
Promotion promotion
=
promoDAO.getPromotion(customer.getLevel());
//
累計客戶總消費額,并更新數據庫
customer.setSumAmount(customer.getSumAmount().add(amount));
customerDAO.save(customer);
//
返回打折后金額
return
amount.multiply(promotion.getRatio());
}
這段代碼中混雜了數據訪問層的內容,如DAOFactory.getDAO方法的調用。
Proxy模式的引入
為了保持業務邏輯代碼的簡潔,將Factory模式帶來的Bad Smell排除在系統外,引入Proxy模式。
Proxy模式的作用:通過提供一個中間層(Proxy),將上層調用接口與下層實現相銜接。
經過Proxy模式改進后的業務層代碼:
public
BigDecimal calcAmount(String customerID,BigDecimal amount)
{
Customer customer
=
CustomerProxy.getCustomer(customerID);
Promotion promotion
=
PromotionProxy.getPromotion(customer.getLevel());
customer.setSumAmount(customer.getSumAmount.add(amount));
CustomerProxy.save(customer);
return
amount.multiply(promotion.getRatio());
}
public
class
CustomerProxy
{
//
get Customer Object by CustomerID
public
static
Customer getCustomer(String customerID)
{
customerDAO custDAO
=
(CustomerDAO)DAOFactory.getDAO(CustomerDAO.
class
);
return
custDAO.getCustomer(customerID);
}
//
Save Customer Object to DataBase
public
static
void
save(Customer customer)
{
CustomerDAO custDAO
=
(CUstomerDAO)DAOFactory.getDAO(CustomerDAO.
class
);
custDAO.save(customer);
}
}
posted on 2008-05-02 19:33
Kira-2006
閱讀(406)
評論(0)
編輯
收藏
所屬分類:
hibernate
新用戶注冊
刷新評論列表
只有注冊用戶
登錄
后才能發表評論。
網站導航:
博客園
IT新聞
Chat2DB
C++博客
博問
管理
相關文章:
深入淺出Hibernate讀書筆記--Hibernate常見優化策略
深入淺出Hibernate學習筆記--Criteria Query
深入淺出Hibernate學習筆記--數據關聯
深入淺出Hibernate筆記--1.2.1持久化設計與解耦
Hibernate生成器
Copyright ©2025 Kira-2006 Powered By
博客園
模板提供:
滬江博客
主站蜘蛛池模板:
久久国产成人亚洲精品影院
|
一级毛片aa高清免费观看
|
亚洲综合一区二区国产精品
|
好大好深好猛好爽视频免费
|
免费一区二区三区
|
eeuss影院免费直达入口
|
亚洲精品亚洲人成在线观看麻豆
|
国产亚洲av片在线观看18女人
|
一区二区免费国产在线观看
|
亚洲尤码不卡AV麻豆
|
男女啪啪永久免费观看网站
|
亚洲精品免费在线
|
7x7x7x免费在线观看
|
www视频在线观看免费
|
91香蕉国产线在线观看免费
|
sihu国产精品永久免费
|
美女视频黄a视频全免费网站一区 美女视频黄a视频全免费网站色
|
精品国产免费观看久久久
|
xxxxwww免费
|
国产无遮挡又黄又爽免费视频
|
日本特黄特黄刺激大片免费
|
四虎在线播放免费永久视频
|
亚洲精品tv久久久久
|
亚洲精品亚洲人成在线观看
|
亚洲精品无码成人AAA片
|
亚洲香蕉成人AV网站在线观看
|
久久精品国产亚洲av麻
|
亚洲情A成黄在线观看动漫软件
|
亚洲一区二区三区亚瑟
|
av大片在线无码免费
|
日韩一区二区三区免费体验
|
无码欧精品亚洲日韩一区夜夜嗨
|
亚洲深深色噜噜狠狠爱网站
|
免费能直接在线观看黄的视频
|
日韩欧毛片免费视频
|
亚洲精品一级无码鲁丝片
|
亚洲国产成人无码av在线播放
|
国产成人亚洲午夜电影
|
91大神免费观看
|
国产美女无遮挡免费视频
|
亚洲精品午夜久久久伊人
|