博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据库访问层中使用GenericDao和HibernateDaoSupport
阅读量:6005 次
发布时间:2019-06-20

本文共 6969 字,大约阅读时间需要 23 分钟。

1.参考文献

  1).

  2).

  3).

open source project:

  4).

  5).

2.问题

  含有多个pojo实体,每一个pojo都要写一个PojoDAO,非常乏味枯燥,思考有没有一种通过的DAO能够省去为每一个pojo写一个DAO。

3.GenericDao分析

  GenericDao的目的是通过他来实现通用的数据库访问层,它通过泛型来实现不同pojo也能够使用一个GenericDao来进行访问,只需要设置泛型的类型即可。首先来看一看GenericDao整体结构。

图1:GenericDao结构图

ps:2011-12-28

  今天给eclipse安装了GreenUML这个eclipse插件,在eclipse中通过如下网址:http://www.cse.buffalo.edu/faculty/alphonce/green更新插件即可。GreenUML能够根据代码生成UML图,所以我将GenericDao结构生成UML如下:

下面来解释上面每一个类或者接口的用户

  1. GenericDao<T>:泛型接口,在这里定义了Dao层的基础的CRUD(Create, read, update and delete)方法,比如sava保存实例,delete删除实例等等。
  2. HibernateDaoSupport:这个是由spring提供的一个抽象类:org.springframework.orm.hibernate3.support.HibernateDaoSupport。类里面定义了 HibernateTemplate的实例,是hibernate的ORM结构中最基础的一个类。
  3. HibernateGenericDao:这个类在我们的例子中没有定义任何方法与变量,他的主要的用处是:(1)重写(Override)HibernateDaoSupport 中定义的方法;(2)增加一些对HibernateDaoSupport类的补充。
  4. GenericDaoImplHibernate<T>:这个类继承HibernateGenericDao并实现接口GenericDao<T>
  5. FileDao:数据访问层接口,根据需求定义方法。
  6. FileDaoImpl:实例化的数据库访问层接口FileDao,并继承通用数据库访问层的类。这样如果FileDao中没有定义方法,那么就表明通用数据库访问层GenericDaoImplHibernate已经能够满足需要。

  上面的结构图看上去有点负责,其实是因为这样的接口充分考虑了系统的可扩充性。如果不考虑可扩充性的话,那么像FileDao、FileDaoImpl和HibernateGenericDao都可以去掉,直接让GenericDaoImplHibernate<T>实现GenericDao<T>接口并继承HibernateDaoSupport类就可以了。在后在使用的时候实例化Dao对象,比如:

GenericDaoImplHibernate
userDao=new GenericDaoImplHibernate
()

4.GenericDao代码实例

根据GenericDao结构图给出各个接口与类的代码。

4.1.GenericDao.java

View Code
import java.io.Serializable;import java.util.List;public interface GenericDao
{ public void save(Object o);//保存 void delete(Object o);//删除修改 void deleteById(Serializable id); public void update(Object o);// public void saveOrUpdate(Object o); public T getById(Serializable id);//查询 public List
findAll(Class
entityClass); public List
findByExample(Object o); //...}

4.2.HibernateDaoSupport.java

这个其实只需要导入spring.jar包即可,不过这里我还是贴出它的源代码,以供参考

View Code
import org.hibernate.HibernateException;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.springframework.dao.DataAccessException;import org.springframework.dao.DataAccessResourceFailureException;import org.springframework.dao.support.DaoSupport;import org.springframework.orm.hibernate3.HibernateTemplate;import org.springframework.orm.hibernate3.SessionFactoryUtils;public abstract class HibernateDaoSupport extends DaoSupport {    private HibernateTemplate hibernateTemplate;    public final void setSessionFactory(SessionFactory sessionFactory) {      this.hibernateTemplate = createHibernateTemplate(sessionFactory);    }    protected HibernateTemplate createHibernateTemplate(SessionFactory sessionFactory) {        return new HibernateTemplate(sessionFactory);    }    public final SessionFactory getSessionFactory() {        return (this.hibernateTemplate != null ? this.hibernateTemplate.getSessionFactory() : null);    }    public final void setHibernateTemplate(HibernateTemplate hibernateTemplate) {        this.hibernateTemplate = hibernateTemplate;    }    public final HibernateTemplate getHibernateTemplate() {      return this.hibernateTemplate;    }    protected final void checkDaoConfig() {        if (this.hibernateTemplate == null) {            throw new IllegalArgumentException("'sessionFactory' or 'hibernateTemplate' is required");        }    }    protected final Session getSession()        throws DataAccessResourceFailureException, IllegalStateException {        return getSession(this.hibernateTemplate.isAllowCreate());    }    protected final Session getSession(boolean allowCreate)        throws DataAccessResourceFailureException, IllegalStateException {        return (!allowCreate ?            SessionFactoryUtils.getSession(getSessionFactory(), false) :                SessionFactoryUtils.getSession(                        getSessionFactory(),                        this.hibernateTemplate.getEntityInterceptor(),                        this.hibernateTemplate.getJdbcExceptionTranslator()));    }    protected final DataAccessException convertHibernateAccessException(HibernateException ex) {        return this.hibernateTemplate.convertHibernateAccessException(ex);    }    protected final void releaseSession(Session session) {        SessionFactoryUtils.releaseSession(session, getSessionFactory());    }}

4.3.HibernateGenericDao.java

View Code
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;@SuppressWarnings("unchecked")public class HibernateGenericDao extends HibernateDaoSupport {    //空方法}

4.4.GenericDaoImplHibernate

View Code
import java.io.Serializable;import java.lang.reflect.ParameterizedType;import java.util.List;import org.hibernate.criterion.DetachedCriteria;import org.hibernate.criterion.Order;import org.springframework.util.Assert;import ssh.core.dao.GenericDao;import ssh.core.dao.support.HibernateGenericDao;@SuppressWarnings("unchecked")public class GenericDaoImplHibernate
extends HibernateGenericDao implements GenericDao
{ protected Class
entityClass; public GenericDaoImplHibernate() { entityClass = (Class
) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]; } protected Class
getEntityClass() { return entityClass; } @Override public List
findAll(Class
entityClass) { return getHibernateTemplate().loadAll(entityClass); } public List
findAll(Class
entityClass, String orderBy, boolean isAsc) { Assert.hasText(orderBy); if (isAsc) return getHibernateTemplate().findByCriteria( DetachedCriteria.forClass(entityClass).addOrder(Order.asc(orderBy))); else return getHibernateTemplate().findByCriteria( DetachedCriteria.forClass(entityClass).addOrder(Order.desc(orderBy))); } @Override public List
findByExample(Object o) { return getHibernateTemplate().findByExample(o); } @Override public T getById(Serializable id) { return (T)getHibernateTemplate().get(entityClass, id); } @Override public void deleteById(Serializable id) { delete(getById(id)); } @Override public void delete(Object o) { getHibernateTemplate().delete(o); } @Override public void save(Object o) { getHibernateTemplate().save(o); } @Override public void saveOrUpdate(Object o) { getHibernateTemplate().saveOrUpdate(o); } @Override public void update(Object o) { getHibernateTemplate().update(o); }}

4.5.UserDao

View Code
import ssh.core.dao.GenericDao;import ssh.pojo.User;public interface UserDao extends GenericDao
{}

4.6.UserDaoImpl

View Code
import com.sjtu.erp.ssh.base.dao.UserDao;import com.sjtu.erp.ssh.core.dao.impl.GenericDaoImplHibernate;import com.sjtu.erp.ssh.pojo.User;public class UserDaoImpl extends GenericDaoImplHibernate
implements UserDao { }

 

 

转载于:https://www.cnblogs.com/xwdreamer/archive/2011/12/25/2300986.html

你可能感兴趣的文章
jquery ajax从后台获取数据
查看>>
基于Windows平台TSM 6.x版本下,如何删除初始化失败的实例。
查看>>
Start Code School Today!
查看>>
Nginx下载服务生产服务器调优
查看>>
RHEL6.5_KVM_VLAN_SET
查看>>
Windows下GCC编译环境中文乱码解决方案
查看>>
linux cut
查看>>
Linux 下JDK 安装
查看>>
DNS详解之重新认识DNS一
查看>>
VC中绘图练习(第三方库)
查看>>
MySql增加用户、授权、修改密码等语句
查看>>
Esc键无法关闭modal页面
查看>>
Eclipse下JRebel插件配置
查看>>
windows溢出保护原理与绕过方法概览(转自riusksk's blog(泉哥))
查看>>
字段设计
查看>>
字节流和字符流
查看>>
Git提交新的本地分支到远程
查看>>
maven (1)
查看>>
openstack架构图
查看>>
搭建DVWA测试环境和SQL注入之SQLmap入门
查看>>