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

 
在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 支持。个人看法。
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值