`

第五章Hibernate-OSIV与泛型DAO模式

阅读更多

第五章Hibernate -OSIV与泛型DAO模式

  • Open Session In View(OSIV)

        使用Servlet过滤器实现OSIV模式

  • 泛型DAO的设计与实现

            1.编写泛型DAO接口

            2.编写泛型DAO的实现类

            3.使用GenericDao接口

            4.使用GenericDaoHibernate类

  •   使用Servlet过滤器实现OSIV模式

      我们使用servlet过滤器来实现自己的OSIV模式。当用户向一个JSP页面或者Servlet发出请求的时候开启Session对象,在JSP页面或者Servlet执行之后,在关闭Session对象。

    编写HibernateSessionFilter.java

public class HibernateSessionFilter implements Filter {
	private Transaction transaction = null;
    private SessionFactory sessionFactory = null;
	public void destroy() {
		sessionFactory.close();
	}

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		try{
		Session session = sessionFactory.getCurrentSession();
		  transaction = session.beginTransaction();
		 chain.doFilter(request, response);
		 transaction.commit();
		}catch(Exception e){
			e.printStackTrace();
			try{
				if(transaction.isActive()){
					transaction.rollback();
				}
			} catch(Exception e2){
				e2.printStackTrace();
			}
		}
	}
	public void init(FilterConfig arg0) throws ServletException {
		sessionFactory = new Configuration().configure().buildSessionFactory();
	}
}

   配置web.xml

<filter>
	<filter-name>HibernateSessionFilter</filter-name>
	<filter-class>com.crazy.HibernateSessionFilter</filter-class>
</filter>
<filter-mapping>
	<filter-name>HibernateSessionFilter</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>
  •    泛型DAO的设计与实现

      1 编写泛型DAO接口

      2 编写泛型DAO的实现类

      3 GenericDao.java

      4 GenericDaoHibernate.java

public interface GenericDao<T,PK extends Serializable> {
	public T findById(PK id);
	
	public List<T> findAll();
	
	public T save(T entity);
	
	public void update(T entity);
	
	public void delete(T entity);
}
   
public class GenericDaoHibernate<T, PK extends Serializable> implements GenericDao<T,PK> {
	private Class<T> clazz;
	
	public GenericDaoHibernate(){
		clazz = (Class<T>)((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];
	}

	public void delete(T entity) {
		Session session = new Configuration().configure().buildSessionFactory().openSession();
		session.delete(entity);
	}

	public List findAll() {
		Session session = new Configuration().configure().buildSessionFactory().openSession();
		Query query = session.createQuery("from" +clazz.getName());
		return query.list();
	}

	public T findById(PK id) {
		Session session = new Configuration().configure().buildSessionFactory().openSession();
		return (T)session.get(clazz, id);
	}

	public T save(T entity) {
		Session session = new Configuration().configure().buildSessionFactory().openSession();
		session.save(entity);
		return entity;
	}

	public void update(T entity) {
		Session session = new Configuration().configure().buildSessionFactory().openSession();
		session.update(entity);
	}
}

  由于Java中的泛型采用擦拭方法,因此无法直接通过反射获取到T.class。而getGenericSuperclass()方法会返回一个ParameterizedType对象,这个对象保存负累的泛型绑定参数的类型,所以通过该对象即可获取T.class。

public interface GuestbookDao extends GenericDao <Guestbook,Integer> {
	public List<Guestbook> findAllOrderById();
}
 
public class GuestbookDaoHibernate extends GenericDaoHibernate<Guestbook,Integer> implements GuestbookDao{

	public List<Guestbook> findAllOrderById() {
		Session session = new Configuration().configure().buildSessionFactory().openSession();
		Query query = session.createQuery("from Guestbook order by id desc");
		return query.list();
	}
}
 

 

分享到:
评论

相关推荐

    Hibernate泛型Dao

    "Hibernate5"是该框架的第五个主要版本,带来了许多性能优化和新特性,例如支持JPA 2.1规范、增强的缓存机制等。"持久化"是指程序中的对象状态能够在程序运行之外被保存和恢复,是数据库操作的核心概念,而Hibernate...

    泛型dao 泛型dao 泛型dao

    Struts2、Hibernate、Spring整合的泛型DAO (本人评价: 代码开发效率提高30% 代码出错率减少70%) 对于大多数开发人员,系统中的每个 DAO 编写几乎相同的代码到目前为止已经成为一种习惯。虽然所有人都将这种重复...

    Struts2+hibernate+spring整合泛型DAO

    泛型DAO(Data Access Object)是一种设计模式,它的目标是通过泛型将业务对象与数据访问逻辑分离,使得DAO层能够适应多种类型的实体类。在Struts2+Hibernate+Spring的集成中,泛型DAO扮演着重要的角色,它使得DAO层...

    Hibernate泛型DAO(结合spring模板支持)

    在大型项目中,为了提高代码的复用性和可维护性,通常会采用DAO(数据访问对象)模式来隔离业务逻辑与数据层的交互。本篇文章将探讨如何使用Hibernate实现泛型DAO,并结合Spring模板来增强其功能。 泛型DAO是一种...

    泛型DAO模式在Java Web开发中的应用.pdf

    泛型DAO模式在Java Web开发中的应用 摘要: 泛型DAO模式是Java Web开发中的一种重要模式,它可以提高数据访问代码的类型安全性和可读性。该模式可以与Struts、Spring和JPA框架集成,实现用户管理系统的开发。通过...

    T21.13_泛型DAO模式与OSIV java 经典教程 经典教材

    T21.13_泛型DAO模式与OSIV java 经典教程 经典教材

    经典泛型dao层代码,非常好用简易

    ### 泛型DAO层在SSH框架中的应用与详解 #### 引言 在现代软件开发中,特别是基于Java的企业级应用开发中,DAO(Data Access Object)层的设计扮演着至关重要的角色。它作为业务逻辑层与数据持久层之间的桥梁,承担...

    spring hibernate 泛型DAO

    总结起来,"Spring Hibernate 泛型DAO"的主题涵盖了Spring框架的IoC容器与Hibernate的ORM能力,通过泛型和Criteria查询,我们可以实现更加高效、可复用的DAO层代码。这样的设计使得项目结构更加清晰,减少了代码冗余...

    泛型dao

    【泛型DAO】是一种在Java开发中常见的设计模式,它利用了Java泛型特性来提高代码的可重用性和类型安全性。在Java中,DAO(Data Access Object)模式是用来封装对数据库的操作,将业务逻辑与数据访问逻辑分离,使得...

    基于hibernate的泛型Dao框架

    标题中的“基于Hibernate的泛型Dao框架”是指在Java开发中使用Hibernate ORM工具,并结合泛型设计模式构建的数据库访问对象(DAO)框架。这样的框架旨在提高代码复用性,减少重复工作,使得数据访问层的实现更加简洁...

    Hibernate泛型DAO接口,大部分通用都已包括

    在实际开发中,为了提高代码的可重用性和可维护性,通常会创建泛型DAO(Data Access Object)接口来处理与数据库交互的通用逻辑。本篇将详细介绍"Hibernate泛型DAO接口,大部分通用都已包括"这一主题。 首先,让...

    黑马程序员----泛型与反射的小运用

    在Java编程语言中,泛型和反射是两个非常重要的特性,它们在软件开发中有着广泛的应用。本篇文章将深入探讨这两个概念以及它们在实际开发中的小运用。 首先,我们来看泛型(Generics)。泛型是在Java SE 5.0引入的...

    大家看看我设计的泛型DAO(使用Spring的Anotation和Hibernate)

    在IT行业中,数据库操作是应用程序的核心部分,而DAO(Data Access Object)模式是连接业务逻辑层与数据存储层的关键。本篇文章将深入探讨一个使用Spring注解和Hibernate实现的泛型DAO设计,以提高代码的复用性和可...

    一个很好的通用泛型dao(含源码)

    而泛型DAO是一个类型安全的,代码精简的设计模式(相对于传统DAO),尤其在DAO组件数量庞大的时候,代码量的减少更加明显。 泛型DAO的核心是定义一个GenericDao接口,声明基本的CRUD操作: 用hibernate作为持久化...

    Java Web程序运用中泛型DAO的作用.pdf

    本文探讨了在Java Web程序中应用泛型DAO模式的作用和意义。首先,文章明确了Java Web技术的定义和在互联网领域中的重要性,阐述了随着软件功能需求的不断提高,Java Web技术也在不断升级和改造。随后,文章指出泛型...

    黑马程序员----泛型学习注意点

    在Java编程语言中,泛型(Generic)是一个强大的特性,它允许我们在编译时检查类型安全,并且可以消除运行时的类型转换。黑马程序员提供的这篇关于泛型的学习注意点,结合了源码分析和工具应用,旨在帮助开发者深入...

    Hibernate泛型DAO及使用方法.doc

    而泛型DAO(Data Access Object)则是基于Hibernate进一步抽象出来的一个设计模式,用于提供更通用的数据操作方法。本文档主要探讨了如何在Spring+Hibernate环境中创建和使用泛型DAO。 首先,我们来看一下泛型DAO...

    基于泛型的通用Dao接口和hibernate的实现

    1. 耦合性低:泛型Dao接口可以与不同的持久层框架集成,例如 Hibernate、JPA 等。 2. 灵活性高:泛型Dao接口可以适应不同的业务需求,例如不同的数据库、不同的数据类型等。 3. 代码重用性高:泛型Dao接口可以在不同...

    C++程序设计与实践:11-模板和泛型编程.ppt

    C++程序设计与实践:模板和泛型编程 C++ 程序设计与实践中,模板和泛型编程是非常重要的概念。模板是 C++ 的泛型机制,用来实现泛型编程。泛型编程是指不依赖于任何具体类型来编写通用代码,具体类型信息的提供是在...

Global site tag (gtag.js) - Google Analytics