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是收集资料并且作为技术交流的平台,发布一些本人常用资料或开发经验,希望能和大家一起讨论、进步。
访问统计
留言簿
(4)
给我留言
查看公开留言
查看私人留言
我参与的团队
牛虻(0/0)
随笔档案
(7)
2008年7月 (1)
2007年12月 (6)
文章分类
(143)
ACEGI(6)
EXT(9)
FLEX(1)
HIBERNATE(2)
IBATIS(1)
JAVA(8)
JAVASCRIPT(27)
JQUERY(1)
ORACLE(4)
SOA文章(1)
SPRING(1)
SQL(12)
冷读术
反向代理(3)
存储过程(2)
常见问题(4)
开发测试工具(4)
搜索引擎(8)
操作系统(8)
服务器(1)
笑话(37)
经典语录(3)
缓存技术
新闻分类
(1)
铁血军事(1)
相册
上海
北京
家乡
广东广州
广东深圳
河北邢台
浙江杭州
福建厦门
莲花山滑雪场
长春
长春净月潭
长春牡丹花展
黑龙江哈尔滨
收藏夹
(21)
EXT网站实例(8)
JAVA问题收藏(13)
友情链接
lpj的博客
三生石的博客
庄陆的博客
狼的博客
我的链接
JAVA开源大全
我的收藏文章
搜索
积分与排名
积分 - 29182
排名 - 327
最新评论
1. re: 选用ibatis和hibernate的区别[未登录]
非常好
--huangyi
2. re: Java性能调优工具
现在JRockit已经不需要破解了,直接去BEA网站现在License就可以了。
--水怪
3. re: Java性能调优工具
借你的地方招个人
需要java性能调优的人,onsite美国半年。
guanglian1103@hotmail.com
--mila
4. re: 选用ibatis和hibernate的区别
写的很好,非常适合初学者看。谢谢!
--thinkerhj
5. re: 选用ibatis和hibernate的区别
写的非常好。
--qqq
阅读排行榜
1. Java性能调优工具(2036)
2. 搜索引擎(compass)学习笔记(1357)
3. glassfish与tomcat一些测试数据对比(1246)
4. 关于搜索引擎查询的一点申明(782)
5. oracle的char类型对空格的怪异处理(452)
评论排行榜
1. Java性能调优工具(9)
2. glassfish与tomcat一些测试数据对比(5)
3. oracle的char类型对空格的怪异处理(3)
4. 搜索引擎(compass)学习笔记(2)
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
宋针还
阅读(60)
评论(0)
编辑
收藏
所属分类:
HIBERNATE
IT新闻
新用户注册
刷新评论列表
标题
姓名
主页
验证码
*
内容(请不要发表任何与政治相关的内容)
Remember Me?
登录
使用高级评论
新用户注册
返回页首
恢复上次提交
[使用Ctrl+Enter键可以直接提交]
相关文章:
使用模板模式简化DAO操作Hibernate
优化hibernate性能的几点建议
相关链接:
网站导航:
博客园
BlogJava
博客生活
IT博客网
C++博客
PHP博客
博客园社区
管理博客
教师博客
天文博客
汽车博客
足球博客
股票博客
电子博客
管理