szhswl
宋针还的个人空间
BlogJava
首页
新随笔
新文章
联系
管理
<
2008年12月
>
日
一
二
三
四
五
六
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
10
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开源大全
我的收藏文章
搜索
积分与排名
积分 - 148332
排名 - 416
最新评论
1. re: VSFTP配置手册[未登录]
太谢谢了,学习了
--随风逝
2. re: 选用ibatis和hibernate的区别
充分说明了面对关系数据库ORM也是那样的无力
--秦磊
3. re: 选用ibatis和hibernate的区别[未登录]
确实写的不错哦!很好很强大,,如果能在总结一点SSH 框架的整合的话我就觉得更完美了。。。。
--小文
4. re: 选用ibatis和hibernate的区别
hibernate还没有开始学呢,唉
--王鹏飞
5. re: js触发弹出层
有用!
--将风度养成
阅读排行榜
1. Java性能调优工具(6730)
2. glassfish与tomcat一些测试数据对比(4900)
3. 搜索引擎(compass)学习笔记(3052)
4. oracle的char类型对空格的怪异处理(2176)
5. glassfish数据库连接池备份日志(1995)
评论排行榜
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://www.blogjava.net/szhswl
------------------------------------------------------------------------------------------------------ ----------------- ---------
posted on 2007-12-05 18:49
宋针还
阅读(390)
评论(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新闻
知识库
C++博客
博问
管理
相关文章:
使用模板模式简化DAO操作Hibernate
优化hibernate性能的几点建议