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開源大全
我的收藏文章
搜索
積分與排名
積分 - 149987
排名 - 415
最新評論
1.?re: VSFTP配置手冊[未登錄]
太謝謝了,學習了
--隨風逝
2.?re: 選用ibatis和hibernate的區別
充分說明了面對關系數據庫ORM也是那樣的無力
--秦磊
3.?re: 選用ibatis和hibernate的區別[未登錄]
確實寫的不錯哦!很好很強大,,如果能在總結一點SSH 框架的整合的話我就覺得更完美了。。。。
--小文
4.?re: 選用ibatis和hibernate的區別
hibernate還沒有開始學呢,唉
--王鵬飛
5.?re: js觸發彈出層
有用!
--將風度養成
閱讀排行榜
1.?Java性能調優工具(6745)
2.?glassfish與tomcat一些測試數據對比(4915)
3.?搜索引擎(compass)學習筆記(3061)
4.?oracle的char類型對空格的怪異處理(2186)
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
博客園
模板提供:
滬江博客
主站蜘蛛池模板:
日韩高清免费观看
|
免费国产一级特黄久久
|
亚洲AV男人的天堂在线观看
|
韩国欧洲一级毛片免费
|
GOGOGO免费观看国语
|
亚洲综合无码一区二区三区
|
岛国片在线免费观看
|
最近中文字幕免费大全
|
亚洲18在线天美
|
国产AV无码专区亚洲AV漫画
|
3344永久在线观看视频免费首页
|
亚洲高清国产拍精品熟女
|
日韩亚洲欧洲在线com91tv
|
毛片免费全部播放一级
|
两个人看的www高清免费观看
|
国产成人精品日本亚洲直接
|
亚洲国产日韩在线观频
|
美女视频黄的全免费视频
|
九九全国免费视频
|
国产精品亚洲片在线va
|
亚洲va中文字幕无码久久不卡
|
成人免费视频软件网站
|
一区二区三区福利视频免费观看
|
亚洲JLZZJLZZ少妇
|
亚洲成av人片不卡无码
|
久久久久久久亚洲精品
|
四虎影院免费在线播放
|
69影院毛片免费观看视频在线
|
国产精品一区二区三区免费
|
亚洲色偷偷av男人的天堂
|
免费中文字幕在线观看
|
免费AA片少妇人AA片直播
|
久久精品私人影院免费看
|
日韩精品免费一线在线观看
|
特级精品毛片免费观看
|
一本一道dvd在线观看免费视频
|
日韩精品无码免费一区二区三区
|
国产亚洲漂亮白嫩美女在线
|
中文字幕在线观看亚洲视频
|
婷婷精品国产亚洲AV麻豆不片
|
欧洲人成在线免费
|