Kira-2006
-僅僅是一陣風也罷了,偏偏是這樣永恒, 僅僅是一場夢也罷了,偏偏是如此的真實,
BlogJava
首頁
新隨筆
新文章
聯系
聚合
管理
posts - 4,comments - 7,trackbacks - 0
<
2025年5月
>
日
一
二
三
四
五
六
27
28
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
常用鏈接
我的隨筆
我的文章
我的評論
我的參與
最新評論
留言簿
(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的映射(2754)
2.?myeclipse自帶Struts缺少jar文件,datasource配置(1262)
3.?一個計算機系學生的困惑?(343)
評論排行榜
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
閱讀(401)
評論(0)
編輯
收藏
所屬分類:
hibernate
新用戶注冊
刷新評論列表
只有注冊用戶
登錄
后才能發表評論。
網站導航:
博客園
IT新聞
Chat2DB
C++博客
博問
管理
相關文章:
深入淺出Hibernate讀書筆記--Hibernate常見優化策略
深入淺出Hibernate學習筆記--Criteria Query
深入淺出Hibernate學習筆記--數據關聯
深入淺出Hibernate筆記--1.2.1持久化設計與解耦
Hibernate生成器
Copyright ©2025 Kira-2006 Powered By
博客園
模板提供:
滬江博客
主站蜘蛛池模板:
亚洲成a人片在线观看播放
|
国产亚洲一区二区手机在线观看
|
国产精品成人观看视频免费
|
亚洲精品国产精品乱码在线观看
|
国产精品hd免费观看
|
亚洲AV中文无码乱人伦在线视色
|
污网站在线免费观看
|
heyzo亚洲精品日韩
|
人体大胆做受免费视频
|
综合亚洲伊人午夜网
|
日本免费大黄在线观看
|
亚洲一区精品中文字幕
|
亚洲一级免费视频
|
精品亚洲国产成人
|
国产zzjjzzjj视频全免费
|
国产亚洲精品欧洲在线观看
|
亚洲成?Ⅴ人在线观看无码
|
好湿好大好紧好爽免费视频
|
久久精品视频亚洲
|
美女视频黄的全免费视频网站
|
亚洲精品无AMM毛片
|
免费一级毛片清高播放
|
国产成人无码区免费内射一片色欲
|
v片免费在线观看
|
精品国产_亚洲人成在线高清
|
日本免费大黄在线观看
|
亚洲av最新在线观看网址
|
亚洲日韩VA无码中文字幕
|
亚洲欧洲免费视频
|
亚洲不卡影院午夜在线观看
|
亚洲精品国产精品国自产观看
|
国产猛男猛女超爽免费视频
|
亚洲啪啪免费视频
|
亚洲 国产 图片
|
蜜桃AV无码免费看永久
|
亚洲1区2区3区精华液
|
久久噜噜噜久久亚洲va久
|
成人免费无码大片a毛片
|
中国一级特黄高清免费的大片中国一级黄色片
|
成人午夜免费视频
|
亚洲国产精品午夜电影
|