您的位置:首页 > 其它

hibernate和泛型的应用

2013-11-11 15:13 106 查看
在我们通常的ssh框架中,我们在底层用hibernate持久层框架屏蔽了数据库复杂而又重复的操作使得代码变得简单而且明朗,真正实现了面向对象操作数据库。然而在持久层如果有多个不同的dao层,比如说一个userDao,一个newsDao,那么就需要两个service层和两个dao层,这样也是重复的工作代码示例如下:

//业务层

public interface UserService{

     public void save(User user);

      public void delete(User user);

     …………

}

@Service("userService")//声明此类是业务层的类

public class UserServiceImpl implements UserService{

     //也可以用传统的set方式将dao层对象注入到业务层

   /* private UserDao userDaoImpl;

    private void setUserDaoImpl(UserDao userDaoImpl){

            this.userDaoImpl=userDaoImpl

    }*/

     @Autowired //  or  @Resource(name="userDaoImpl")  

     private UserDao userDaoImpl;

         

     public void save(User user){

                userDaoImpl.save(user);

     }

    public void delete(User user){

                userDaoImpl.delete(user);

    }

}

//dao层

public interface UserDao{

    public void save(User user);

    public void delete(User user);

}

@Repository("userDaoImpl")//声明此类事数据持久层的类

public class UserDaoImpl extends hibernateDaoSupport implements UserDao{

    public void save(User user){

           this.getHibernateTemplate().save(user);

    }

   public void delete(User user){

           this.getHibernateTemplate().delete(this.getHibernateTemplate().load(User.class,user.getId()));

   }

}

//一个业务层和dao层就完毕,如果还有一个newsDao那么我们还要重复的写一次,很麻烦。借鉴别人的好办法用jdk1.5之后java提供的泛型来实现

设计一个不体现任何业务的接口(在此接口看不到任何和实际业务有关系的代码)

public interface GenericDao<T,PK>{

      public void save(T entity);

      public void delete(T entitty);

      public void deleteEntityById(Class<T> entity,PK id);

      public void saveOrUpdate(T entity);

     //更新方法(可以实现增加,删除,更新操作)

      public void update(final String hql,final Object[] params);

      public List<T> findByExample(T entity); 

      …………等等一些抽象的方法参数都用泛型来表示

}

//dao层

@Repository("genericDao")//声明此类事数据持久层的类

public class GenericDaoImpl<T, PK implements Serializable> extends HibernateDaoSupport implements GenericDao<T,PK>{

    public void save(T entity){

            this.getHibernateTemplate().save(entity);

   }

  public void deleteEntityById(Class<T> entitty,PK id){

           this.getHibernateTemplate().delete(findById(entity,id));

 }

 public T findById(Class<T> entity,PK id){

    return (T)this.getHibernateTemplate().get(entity,id);

 }

……

}//接口设计完毕

之后让具体的dao继承接口

public interface UserDao extends GenericDao<User, Integer> {

 

}

//具体的dao的继承实现类实现接口

public class UserDaoImpl extends GenericDaoImpl<User, Integer> implements UserDao { 

 

}

业务层的不变

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息