在Hibernate中用DAO和spring对db进行CRUD(create,read,update,delete)
1. 简单DAO
DAO处理的示意图
两种DAO处理方式:
一个类一个DAO(推荐)
一个应用一个DAO
DAO处理的示意程序:
在构造函数中创建SessionFactory。
分别处理CRUD:
开始session,及transaction
操作CRUD之一
处理exception(如有必要)
关闭session
简单DAO的问题分析:
上面的示例是关于C的,其他RUD都是类似的结构,都是在一个session中完成一次操作,即
开始session,及transaction
操作CRUD之一
处理exception(如有必要)
关闭session
因此,一个类似上面的DAO在结构上有类似性,同时就会造成一些重复代码(比如对每个操作都会有session的开始和关闭,处理exception)。
另外,面对类似如下的结构时:
Event foundEvent = eventDao.find(event.getId());
foundEvent.setDuration(30);
eventDao.update(foundEvent);
看到
find
和
update
分别用一个
session
来完成,但是这种方式显然并不优雅。
2. 分层化的DAO
在AbstractDAO中完成在简单DAO问题分析中提到的一些问题:
类似的结构,
重复的代码。
在具体DAO中,就显得很简单了:
具体DAO只需要注意一个cast,具体对象(具体DAO中使用)与Object(AbstractDAO中使用)之间的转换。
DAO方式的一个问题:
针对每个CRUD操作都对应一个session,这种方式不优雅(前文有论述),
因此,考虑
spring。
3. Spring的hibernate支持
Spring能提高效率:
检查下面这段典型的DAO代码可以看到:
真正体现功能的代码只有一行session.save(event)。
且其他的代码相对固定。
因此,引入template的概念。猜想,利用templatemethod模式来重构。
每个CRUD方法用callback函数来实现。其他固定部分用的是同一代码。
所以,现在简单使用template.saveOrUpdate等类似方法就可以实现CRUD了。
template.saveOrUpdate的实现如下:
public void saveOrUpdate(final Object entity)
throws DataAccessException {
execute(new
HibernateCallback() {
public Object doInHibernate(Session session)
throws HibernateException {
checkWriteOperationAllowed(session);
session.saveOrUpdate(entity);
return null;
}
}, true);
}
spring在execute中完成DAO的功能,结构是一样的。execute就是templatemethod模式中的template方法。对action的调用就是templatemethod中继承的必须实现的抽象方法。
public Object execute(HibernateCallback action, boolean exposeNativeSession)
throws DataAccessException
打开session
执行action,(调用HibernateCallback类的doInHibernate方法。具体来说为了实现save功能,就创建一个HibernateCallback对象,并重写doInHibernate方法,在改方法中调用save方法)。
处理exception,
关闭session。
因此,从上面看到,如果要进行复杂的对数据的处理,不是简单的CRUD,就应该重写doInHibernate方法,举例如下,对照上面template.saveOrUpdate的代码看。
spring的配置文件ApplicationContext.xml,对比hibernate的配置文件hibernate.cfg.xml:
Spring
|
Hibernate
|
在bean BasicDataSource中配置了数据库信息
|
Session-factory的property中配置数据库信息
|
在bean LocalSessionFactoryBean的mappingResources的property中配置了映射文件信息
|
在session-factory的mapping属性中配置映射文件信息
|
可以配置DAO bean
|
没有对应功能
|
4.
Spring
对
hibernate
的支持只是减轻编程负担,而不是
CRUD
使用模式。
hibernate
的
CRUD
使用模式还是应该用
DAO
模式,在
DAO
中使用
spring
支持。个人看法。