在Hibernate中用DAO和spring对db进行CRUD

 
在Hibernate中用DAO和spring对db进行CRUD(create,read,update,delete)
1.      简单DAO
DAO处理的示意图
在Hibernate中用DAO和spring对db进行CRUD_第1张图片
两种DAO处理方式:
一个类一个DAO(推荐)
一个应用一个DAO
 
 
DAO处理的示意程序:
在构造函数中创建SessionFactory。
分别处理CRUD:
    开始session,及transaction
    操作CRUD之一
    处理exception(如有必要)
    关闭session
在Hibernate中用DAO和spring对db进行CRUD_第2张图片
简单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
在Hibernate中用DAO和spring对db进行CRUD_第3张图片
在AbstractDAO中完成在简单DAO问题分析中提到的一些问题:
类似的结构,
重复的代码。
在Hibernate中用DAO和spring对db进行CRUD_第4张图片
在具体DAO中,就显得很简单了:
在Hibernate中用DAO和spring对db进行CRUD_第5张图片
具体DAO只需要注意一个cast,具体对象(具体DAO中使用)与Object(AbstractDAO中使用)之间的转换。
 
DAO方式的一个问题:
针对每个CRUD操作都对应一个session,这种方式不优雅(前文有论述),
因此,考虑 spring
 
3.      Spring的hibernate支持
Spring能提高效率:
检查下面这段典型的DAO代码可以看到:
在Hibernate中用DAO和spring对db进行CRUD_第6张图片
真正体现功能的代码只有一行session.save(event)。
且其他的代码相对固定。
因此,引入template的概念。猜想,利用templatemethod模式来重构。
每个CRUD方法用callback函数来实现。其他固定部分用的是同一代码。
在Hibernate中用DAO和spring对db进行CRUD_第7张图片
所以,现在简单使用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的代码看。
在Hibernate中用DAO和spring对db进行CRUD_第8张图片
 
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 支持。个人看法。
 

你可能感兴趣的:(java,open,source,dao,hibernate,spring,session,exception,object)