Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2038698
  • 博文数量: 414
  • 博客积分: 10312
  • 博客等级: 上将
  • 技术积分: 4921
  • 用 户 组: 普通用户
  • 注册时间: 2007-10-31 01:49
文章分类

全部博文(414)

文章存档

2011年(1)

2010年(29)

2009年(82)

2008年(301)

2007年(1)

分类: Java

2008-05-14 08:58:06

 DAO开发

注:
(1)以下两者都需在Spring XML配置文件中,注册Bean(实现类)来依赖注入SessionFactory.
(2.1)Spring 中进行事务管理的通常方式是利用AOP(面向切片编程)的方式,为普通java类封装事务控制,它是通过动态代理实现的,由于接口是延迟实例化的, spring在这段时间内通过拦截器,加载事务切片。原理就是这样,具体细节请参考jdk中有关动态代理的文档。本文主要讲解如何在spring中进行事务控制。
(2.2)动态代理的一个重要特征是,它是针对接口的,所以我们的DAO要通过动态代理来让spring接管事务,就必须在DAO前面抽象出一个接口.  当然,如果没有这样的接口,那么spring会使用CGLIB来解决问题,但这不是spring推荐的方式.

(一)直接使用Hibernate API
public class DaoImp implate Dao{
         private SessionFactory sessionFactory;
         private static String hql = "from User u where u.username=? ";

          public void setSessionFactory(SessionFactory sessionFactory){
                   return this.sessionFactory=sessionFactory;
          }

           public boolean isValidUser(String username) { 
                try{
                     List userList = sessionFactory.getCurrentSession().creatQuery(hql).setParameter(0,username).list();
                     if (userList.size() > 0) {
                     return true; 
                 } catch (HibernateException ex){
                     throw converHibernaterAccessException(ex);
                  }   
             } 
}
 
优点:与Spring框架完全分离
缺点:
   (1)无法使用Spring框架封装所提供的额外功能.如,直接使用Hibernate API 需用try...catch()处理HibernateException异常.
   (2)需在实现类中加入setSessionFactory(SessionFactory sessionFactory)属性,接收依赖注入的SessionFactory.

(二)继承 Spring 的 HibernateDaoSupport 使用 HibernateTemplate
public class DaoImp extend HibernateDaoSupport implates Dao{
         //private SessionFactory sessionFactory;
         private static String hql = "from User u where u.username=? ";

          //public void setSessionFactory(SessionFactory sessionFactory){
          //          this.sessionFactory=sessionFactory;
          //}


           public boolean isValidUser(String username) { 
              //  try{
              //     List userList = sessionFactory.getCurrentSession().creatQuery(hql).setParameter(0,username).list(); 

                     List userList = getHibernateTemplate().fnd(hql,username); 
                     if (userList.size() > 0) {
                     return true; 
               // } catch (HibernateException ex){
              //     throw converHibernaterAccessException(ex);
             //  }  
 
             }
 
           public boolean isValidUser(String username,String password) throw DataAccessException { 
                     Session session = getSession();                 
                     String[] userlist=new String[2];
                     userlist[0]=username;
                     userlist[1]=password;
                 try{
                     List userList = session.find(hql,userlist);       //Hibernate语句; 
                     if (userList.size() > 0) {
                     return true; 
                  } catch (HibernateException ex){
                     throw converHibernaterAccessException(ex);
                  }   
             } 
}

特点:对HibernateTemplate没有提供的功能,可以直接调用HibernateDaoSuppor对象的getSession()方法得到Session对象实例用try{ Hibernate API }catch (HibernateException ex )操作.
阅读(914) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~