在一個(gè)單獨(dú)的DAO中混合使用Hibernate 和 JDBC
Posted on 2009-12-18 16:51 leekiang 閱讀(1000) 評(píng)論(0) 編輯 收藏 所屬分類: hibernate 、jdbc、事務(wù)、并發(fā)Hibernate 的確通過 PersistentEnum 接口提供了對(duì)標(biāo)準(zhǔn)化 的支持,這使得我們的域?qū)ο髮?shí)現(xiàn)了一個(gè)與 ShippingCompany 對(duì)象非常類似的結(jié)構(gòu)。然而,我們可能對(duì)將域?qū)ο笈c某個(gè)特定的持久化實(shí)現(xiàn)過于耦合持保守態(tài)度。如果我們計(jì)劃長期使用 Hibernate ,這可能并不是一個(gè)太大的問題,但是請(qǐng)謹(jǐn)慎考慮這個(gè)決策。如果我們使用 ibatis ,那么我們就完全沒那么幸運(yùn)了;它完全不支持標(biāo)準(zhǔn)化。謝天謝地,如果我們的 ORM 導(dǎo)致過耦合或者完全沒有這方面的支持,還有個(gè)解決方案——使用 JDBC 。
有 Spring 的支持,使用 JDBC 變得如此簡單,我們不會(huì)再因?yàn)樗膹?fù)雜性而將其的優(yōu)先級(jí)打個(gè)折扣。可是,如果我們選擇使用某個(gè)特定的 ORM 工具,那么我們就很難用基于 JDBC 的 DAO 實(shí)現(xiàn)進(jìn)行替換了——目前我們就是這樣。當(dāng)我們同時(shí)在一個(gè)類中包含了 JDBC 和 hibernate 代碼時(shí),我們就無法使用 Spring 提供的支持。因?yàn)槲覀兊?/span> DAO 只能擴(kuò)展 HibernateDaoSupport 或 JdbcDaoSupport 二者之一。幸運(yùn)的是,這里有一個(gè)優(yōu)雅的解決方案,它允許我們將 Hibernate 和 JDBC 代碼封裝在同一個(gè)類之內(nèi),而不會(huì)因此失去 Spring 的支持。這個(gè)方案的關(guān)鍵在于將 JDBC 代碼封裝在內(nèi)部類中,之后將主體 DAO 的調(diào)用委托給這個(gè)內(nèi)部類去完成。代碼清單 11-6 提供了一個(gè)示例:
代碼清單 11-16. 在一個(gè)單獨(dú)的 DAO 中混合使用 Hibernate 和 JDBC
package com.apress.prospring.ch11.canonicalization;
?
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.orm.hibernate.support.HibernateDaoSupport;
?
public class MyDao extends HibernateDaoSupport {
?
?? private MyJdbcDao innerDao;
?
?? public MyDao() {
????? innerDao = new MyJdbcDao();
?? }
?
?? public void update(MyDomainObject obj) {
????? // use Hibernate to persist the data
?? }
?
?? public MyDomainObject getById(int someId) {
????? return innerDao.getBy(someId);
?? }
?
?? private static class MyJdbcDao extends JdbcDaoSupport {
?
????? public MyDomainObject getBy(int someId) {
???????? // do some real processing
???????? return null;
????? }
?? }
}
?
盡管這只是一個(gè)簡單的實(shí)現(xiàn),我們也可以從中得到啟發(fā)。所有的 JDBC 相關(guān)代碼都被轉(zhuǎn)移到一個(gè)內(nèi)部類中,而此內(nèi)部類擴(kuò)展了 JdbcDaoSupport , 所有的 Hibernate 相關(guān)功能都留在外部,外部類仍然是 HibernateDaoSupport . 的子類。通過這個(gè)類,我們可以使用 Hibernate 完成域?qū)ο蟮某志没俏覀兛梢詫⒉樵児δ芙唤o嵌入的 JDBC DAO 去完成。
在我們的應(yīng)用中有效利用標(biāo)準(zhǔn)化 ,可以通過避免大量無謂對(duì)象的創(chuàng)建,從而極大提升內(nèi)存使用效率。如果我們必須更新標(biāo)準(zhǔn)化對(duì)象相關(guān)的數(shù)據(jù),同時(shí)我們?cè)?/span> DAO 中使用了 ORM 框架,那么我們就可以以 ORM 無關(guān)的形式引入一些 JDBC 代碼來加入標(biāo)準(zhǔn)化 支持。
來源:Pro Spring中文版 http://book.csdn.net/bookfiles/48/100481407.shtml
http://hi.baidu.com/%D3%F4%C3%C6%BB%A8%C9%FA%BD%B4/blog/item/7768d41e8c06ceffe0fe0ba6.html