szhswl
宋針還的個人空間
BlogJava
首頁
新隨筆
新文章
聯系
管理
<
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
blog是收集資料并且作為技術交流的平臺,發布一些本人常用資料或開發經驗,希望能和大家一起討論、進步。
訪問統計
留言簿
(6)
給我留言
查看公開留言
查看私人留言
我參與的團隊
牛虻(0/0)
隨筆檔案
(8)
2008年12月 (1)
2008年7月 (1)
2007年12月 (6)
文章分類
(149)
ACEGI(6)
EXT(9)
FLEX(2)
HIBERNATE(2)
IBATIS(1)
JAVA(9)
JAVASCRIPT(28)
JQUERY(1)
ORACLE(4)
Python(2)
SOA文章(1)
SPRING(1)
SQL(13)
冷讀術
反向代理(3)
存儲過程(2)
常見問題(4)
開發測試工具(4)
搜索引擎(8)
操作系統(8)
服務器(1)
笑話(37)
經典語錄(3)
緩存技術
新聞分類
(1)
鐵血軍事(1)
相冊
上海
北京
家鄉
廣東廣州
廣東深圳
河北邢臺
浙江杭州
福建廈門
蓮花山滑雪場
長春
長春凈月潭
長春牡丹花展
黑龍江哈爾濱
收藏夾
(21)
EXT網站實例(8)
JAVA問題收藏(13)
友情鏈接
lpj的博客
三生石的博客
中文愛百科
莊陸的博客
狼的博客
我的鏈接
JAVA開源大全
我的收藏文章
搜索
積分與排名
積分 - 150066
排名 - 415
最新評論
1.?re: VSFTP配置手冊[未登錄]
太謝謝了,學習了
--隨風逝
2.?re: 選用ibatis和hibernate的區別
充分說明了面對關系數據庫ORM也是那樣的無力
--秦磊
3.?re: 選用ibatis和hibernate的區別[未登錄]
確實寫的不錯哦!很好很強大,,如果能在總結一點SSH 框架的整合的話我就覺得更完美了。。。。
--小文
4.?re: 選用ibatis和hibernate的區別
hibernate還沒有開始學呢,唉
--王鵬飛
5.?re: js觸發彈出層
有用!
--將風度養成
閱讀排行榜
1.?Java性能調優工具(6746)
2.?glassfish與tomcat一些測試數據對比(4916)
3.?搜索引擎(compass)學習筆記(3061)
4.?oracle的char類型對空格的怪異處理(2187)
5.?glassfish數據庫連接池備份日志(2011)
評論排行榜
1.?Java性能調優工具(11)
2.?glassfish與tomcat一些測試數據對比(5)
3.?搜索引擎(compass)學習筆記(4)
4.?oracle的char類型對空格的怪異處理(3)
5.?一個女程序員的男友需求說明書(1)
使用模板模式簡化DAO操作Hibernate
相信使用過Spring + Hibernate開發過的人,在寫DAO的時候都使用過Spring的HibernateDaoSupport類,然后在實現的時候就可以很輕松的使用getHibernateTemplate()方法之后就可以調用save()、delete()、update()等Hibernate的Session的操作,很簡單。比如:
getHibernateTemplate().save(user);
這樣一句話在我們沒有Spring的時候就必須使用如下的代碼才能完成:
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
session.save(user);
tx.commit();
HibernateUtil.colseSession();
這里還省去了異常處理,同時使用了HibernateUtil類來簡化從SessionFactory獲取Session,以及關閉Session等處理。
但是我們在使用Hibernate的時候不一定會使用Spring,所以我們可以模仿Spring的處理方式,做一個Hibernate的模板,使用模板模式來簡化我們的開發,其主要的目的就是為了簡化開發,使代碼達到最大話的重用。
1.我們現來實現一個Hibernate模板:
1
package
kick.hibernate;
2
3
import
net.sf.hibernate.HibernateException;
4
import
net.sf.hibernate.Session;
5
import
net.sf.hibernate.Transaction;
6
7
public
class
HibernateTemplate
{
8
public
static
Object run(HibernateCallback callback)
throws
HibernateException
{
9
Session session
=
null
;
10
Transaction tx
=
null
;
11
try
{
12
session
=
HibernateSessionutil.currentSession();
13
tx
=
session.beginTransaction();
14
Object result
=
callback.execute(session);
15
tx.commit();
16
session.flush();
17
return
result;
18
}
catch
(HibernateException e)
{
19
tx.rollback();
20
return
null
;
21
}
finally
{
22
HibernateSessionutil.closeSession();
23
}
24
}
25
這里類很簡單,就是使用一個實現HibernateCallBack接口的一個回掉類,在調用的時候根據具體的需求實現HibernateCallBack類。
2.回掉接口HibernateCallBack:
1
package
kick.hibernate;
2
3
import
net.sf.hibernate.HibernateException;
4
import
net.sf.hibernate.Session;
5
6
public
interface
HibernateCallBack
{
7
Object execute(Session session)
throws
HibernateException;
8
}
好了,到此為止我們就可以使用這個模板了,可以用如下的方式使用:
HibernateTemplate.run(new HibernateCallback() {
public Object execute(Session session) throws HibernateException {
session.save(user);
return null;
}
});
看看,是不是省去了很多代碼?^_^
不過這還沒有達到想Spring里面那樣簡單,不要著急,“面包會有的”呵呵,我們會達到的。
3.實現我們自己的HibernateSupport類:
從上面的代碼可以看出,我們要自己實現HibernateCallback接口,而每次我們實現的時候又重復代碼了。因此我們再抽象,講這些實現放到我們的HibernateSupport類里面去。看看我們上面的代碼就知道我們實現HibernateCallback接口的目的就是為了調用session.save()方法,即session的方法。代碼如下:
1
package
kick.hibernate;
2
3
import
java.io.Serializable;
4
5
import
net.sf.hibernate.HibernateException;
6
import
net.sf.hibernate.Session;
7
8
public
class
HibernateSupport
{
9
10
public
Object save(
final
Object object)
throws
HibernateException
{
11
return
HibernateTemplate.run(
new
HibernateCallBack()
{
12
13
public
Object execute(Session session)
throws
HibernateException
{
14
session.save(object);
15
return
null
;
16
}
17
18
}
);
19
}
20
public
Object save(
final
Object object,
final
Serializable id)
throws
HibernateException
{
21
return
HibernateTemplate.run(
new
HibernateCallBack()
{
22
23
public
Object execute()
throws
HibernateException
{
24
session.save(object,id);
25
return
null
;
26
}
27
28
}
);
29
}
30
31
public
Object saveOrUpdate(
final
Object object)
throws
HibernateException
{
32
return
HibernateTemplate.run(
new
HibernateCallBack()
{
33
34
public
Object execute(Session session)
throws
HibernateException
{
35
session.saveOrUpdate(object);
36
return
null
;
37
}
38
39
}
);
40
}
41
……………………………………………………………………………………
42
……………………………………………………………………………………
43
……………………………………………………………………………………
44
調用一些其他的session的方法。
}
4.抽象RootDao:
該類為抽象類,在實現自己的DAO類的時候繼承該類。該類的有一個HibernateSupport的對象,在子類中使用getHibernateTemplate()方法就可以得到該對象,然后調用它對應的方法。實現代碼如下:
1
package
kick.hibernate.dao;
2
3
import
net.sf.hibernate.Session;
4
import
kick.hibernate.HibernateTemplateImpl;
5
6
public
abstract
class
RootDao
{
7
private
HibernateSupport temp
=
null
;
8
9
/** */
/**
10
*
@return
Returns the temp.
11
*/
12
public
HibernateTemplateImpl getHibernateTemplate(Session session)
{
13
return
new
HibernateSupport();
14
}
15
}
5.使用例子:
定義一個自己的DAO類,實現代碼如下:
public class UserDaoImpl extends RootDao implements UserDaoInterface{
public void saveUser(User user) throws KickException {
getHibernateTemplate().saveOrUpdate(user);
}
……………………………………………………………………………………
實現其他的方法
……………………………………………………………………………………
}
---------------------------------------------------------------------------------------------------------------------------------
說人之短,乃護己之短。夸己之長,乃忌人之長。皆由存心不厚,識量太狹耳。能去此弊,可以進德,可以遠怨。
http://m.tkk7.com/szhswl
------------------------------------------------------------------------------------------------------ ----------------- ---------
posted on 2007-12-05 18:49
宋針還
閱讀(395)
評論(2)
編輯
收藏
所屬分類:
HIBERNATE
FeedBack:
#
re: 使用模板模式簡化DAO操作Hibernate
2008-12-25 11:26 |
yangtao
寫的很不錯 我轉載在我的blog上了 想來你會同意的吧
回復
更多評論
#
re: 使用模板模式簡化DAO操作Hibernate
2011-06-24 11:10 |
hoohoney
總結的太好了,不過RootDao作為主要作用是為了可以直接來調用HibernateSupport對象,那么
getHibernateTemplate(Session session) 方法就沒必要加參數,
些類中的HibernateSupport temp = null;屬性也就沒用了,不知道為什么加上,有其它目的?
回復
更多評論
新用戶注冊
刷新評論列表
只有注冊用戶
登錄
后才能發表評論。
網站導航:
博客園
IT新聞
Chat2DB
C++博客
博問
管理
相關文章:
使用模板模式簡化DAO操作Hibernate
優化hibernate性能的幾點建議
Copyright ©2025 宋針還 Powered By
博客園
模板提供:
滬江博客
主站蜘蛛池模板:
国内精品乱码卡1卡2卡3免费
|
日韩电影免费在线观看
|
亚洲人成网站18禁止
|
亚洲熟妇无码八V在线播放
|
一区二区三区免费在线观看
|
日韩电影免费在线观看网站
|
57pao国产成视频免费播放
|
精品日韩亚洲AV无码
|
亚洲噜噜噜噜噜影院在线播放
|
久久久久久亚洲Av无码精品专口
|
亚洲国产成人AV网站
|
亚洲av无码无线在线观看
|
97在线免费视频
|
午夜男人一级毛片免费
|
国产亚洲一区区二区在线
|
亚洲ⅴ国产v天堂a无码二区
|
中日韩亚洲人成无码网站
|
免费无码一区二区三区蜜桃
|
亚洲精品成人片在线观看精品字幕
|
亚洲AV无码国产精品色
|
久久久久久AV无码免费网站
|
免费在线观看的黄色网址
|
亚洲日本久久一区二区va
|
韩国免费A级毛片久久
|
黄页网站在线看免费
|
亚洲欧洲无卡二区视頻
|
一级毛片直播亚洲
|
国产亚洲玖玖玖在线观看
|
免费人妻无码不卡中文字幕18禁
|
免费精品国自产拍在线播放
|
中文字幕无码播放免费
|
亚洲午夜久久久久久久久久
|
美女露100%胸无遮挡免费观看
|
免费无码A片一区二三区
|
91亚洲va在线天线va天堂va国产
|
99亚偷拍自图区亚洲
|
免费人成视频在线观看视频
|
13小箩利洗澡无码视频网站免费
|
亚洲一级视频在线观看
|
亚洲人成色77777在线观看大
|
亚洲午夜精品在线
|