`
fxiaozj
  • 浏览: 55840 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Spring+Hibernate泛型DAO的自动注入(例子)

 
阅读更多
总体架构:


1.定义泛型DAO接口:
package com.integration.framework.dao;

import java.io.Serializable;
import java.util.List;

/**
 * @ClassName:IBaseGenericDAO
 * @Description:TODO(IBaseGenericDAO DAO层泛型接口,定义基本的DAO功能 )
 * @param <T>    实体类 
 * @param <PK>    主键类,必须实现Serializable接口	
 * @author zj
 * @date:Jul 9, 2012 1:32:07 PM
 * @version V1.0 
 */
public abstract interface IBaseGenericDAO<T, PK extends Serializable> {

	/**
	 * 按主键取记录 
	 * @param id 主键值   
	 * @return 记录实体对象,如果没有符合主键条件的记录,则返回null
	 */
	public abstract T get(PK id);

	/**
	 * 按主键取记录
	 * @param id 主键值
	 * @return 记录实体对象,如果没有符合主键条件的记录,则 throw DataAccessException   
	 */
	public abstract T load(PK id);

	/**
	 * 获取全部实体
	 * @return 返回一个list集合数据
	 */
	public abstract List<T> loadAll();

	/**
	 * 修改一个实体对象(UPDATE一条记录)
	 * @param entity 实体对象
	 */
	public abstract void update(T entity);

	/**
	 * 插入一个实体(在数据库INSERT一条记录)
	 * @param entity 实体对象   
	 */
	public abstract void save(T entity);

	/**
	 * 增加或更新实体
	 * @param entity 实体对象
	 */
	public abstract void saveOrUpdate(T entity);

	/**
	 * 删除指定的实体
	 * @param entity 实体对象
	 */
	public abstract void delete(T entity);

}

2.实现IBaseGenericDAO接口的Hibernate的实现类HibernateBaseGenericDAOImpl:
package com.integration.framework.dao.impl;

import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.dao.DataAccessException;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.stereotype.Repository;

import com.integration.framework.dao.IBaseGenericDAO;

/**
 * @ClassName:HibernateBaseGenericDAOImpl
 * @Description:TODO(HibernateBaseGenericDAOImpl DAO层泛型基类,实现了基本的DAO功能 利用了Spring的HibernateDaoSupport功能)
 * @param <T> 实体类 
 * @param <PK> 主键类,必须实现Serializable接口	
 * @author zj
 * @date:Jul 9, 2012 1:41:37 PM
 * @version V1.0
 */
@SuppressWarnings("all")
public class HibernateBaseGenericDAOImpl<T, PK extends Serializable> extends HibernateDaoSupport implements IBaseGenericDAO<T, PK>{

	private static Log logger = LogFactory.getLog(HibernateBaseGenericDAOImpl.class);
	
	private Class<T> entityClass;

	/**
	 * 构造方法,根据实例类自动获取实体类类型
	 */
	public HibernateBaseGenericDAOImpl() {
		this.entityClass = null;
        Class c = getClass();
        Type t = c.getGenericSuperclass();
        if (t instanceof ParameterizedType) {
            Type[] p = ((ParameterizedType) t).getActualTypeArguments();
            this.entityClass = (Class<T>) p[0];
        }
	}

	/*
	 * (non-Javadoc)
	 * @see com.integration.framework.dao.IBaseGenericDAO#delete(java.lang.Object)
	 */
	public void delete(T entity) {
		try{
			getHibernateTemplate().delete(entity);
		}catch(DataAccessException e){
			logger.error(e.getMessage(), e);
		}
	}

	/*
	 * (non-Javadoc)
	 * @see com.integration.framework.dao.IBaseGenericDAO#get(java.io.Serializable)
	 */
	public T get(PK id) {
		return (T) getHibernateTemplate().get(entityClass, id);
	}

	/*
	 * (non-Javadoc)
	 * @see com.integration.framework.dao.IBaseGenericDAO#load(java.io.Serializable)
	 */
	public T load(PK id) {
		return (T) getHibernateTemplate().load(entityClass, id);
	}

	/*
	 * (non-Javadoc)
	 * @see com.integration.framework.dao.IBaseGenericDAO#loadAll()
	 */
	public List<T> loadAll() {
		return getHibernateTemplate().loadAll(entityClass);
	}

	/*
	 * (non-Javadoc)
	 * @see com.integration.framework.dao.IBaseGenericDAO#save(java.lang.Object)
	 */
	public void save(T entity) {
		try{
			getHibernateTemplate().save(entity);
		}catch(DataAccessException e){
			logger.error(e.getMessage(), e);
		}
	}

	/*
	 * (non-Javadoc)
	 * @see com.integration.framework.dao.IBaseGenericDAO#saveOrUpdate(java.lang.Object)
	 */
	public void saveOrUpdate(T entity) {
		try{
			getHibernateTemplate().saveOrUpdate(entity);
		}catch(DataAccessException e){
			logger.error(e.getMessage(), e);
		}
	}

	/*
	 * (non-Javadoc)
	 * @see com.integration.framework.dao.IBaseGenericDAO#update(java.lang.Object)
	 */
	public void update(T entity) {
		try{
			getHibernateTemplate().update(entity);
		}catch(DataAccessException e){
			logger.error(e.getMessage(), e);
		}		
	}
}



3.定义Service泛型接口:
 package com.integration.framework.service;

import java.io.Serializable;
import java.util.List;

/**
 * @ClassName:IBaseGenericService
 * @Description:TODO(IBaseGenericService Service层泛型接口,定义基本的Service功能)
 * @param <T>    实体类 
 * @param <PK>    主键类,必须实现Serializable接口		
 * @author zhoujing
 * @date:Jul 9, 2012 2:48:56 PM
 * @version V1.0
 */
public interface IBaseGenericService<T, PK extends Serializable> {

	/**
	 * 按主键取记录 
	 * @param id 主键值   
	 * @return 记录实体对象,如果没有符合主键条件的记录,则返回null
	 */
	public abstract T get(PK id);

	/**
	 * 按主键取记录
	 * @param id 主键值
	 * @return 记录实体对象,如果没有符合主键条件的记录,则 throw DataAccessException   
	 */
	public abstract T load(PK id);

	/**
	 * 获取全部实体
	 * @return 返回一个list集合数据
	 */
	public abstract List<T> loadAll();

	/**
	 * 修改一个实体对象(UPDATE一条记录)
	 * @param entity 实体对象
	 */
	public abstract void update(T entity);

	/**
	 * 插入一个实体(在数据库INSERT一条记录)
	 * @param entity 实体对象   
	 */
	public abstract void save(T entity);

	/**
	 * 增加或更新实体
	 * @param entity 实体对象
	 */
	public abstract void saveOrUpdate(T entity);

	/**
	 * 删除指定的实体
	 * @param entity 实体对象
	 */
	public abstract void delete(T entity);
}


4.实现Service:
package com.integration.framework.service.impl;

import java.io.Serializable;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.integration.framework.dao.IBaseGenericDAO;
import com.integration.framework.service.IBaseGenericService;

/**
 * @ClassName:BaseGenericServiceImpl
 * @Description:TODO(这里用一句话描述这个类的作用)	
 * @author zhoujing
 * @date:Jul 9, 2012 5:16:46 PM
 * @version V1.0
 */
@Service
@SuppressWarnings("all")
public class BaseGenericServiceImpl<T, PK extends Serializable> implements IBaseGenericService<T, PK> {

	@Autowired
	private IBaseGenericDAO dao;
	
	public void delete(T entity) {
		dao.delete(entity);
	}

	public T get(PK id) {
		return (T)dao.get(id);
	}

	public T load(PK id) {
		return (T) dao.load(id);
	}

	public List<T> loadAll() {
		return dao.loadAll();
	}

	public void save(T entity) {
		dao.save(entity);
	}

	public void saveOrUpdate(T entity) {
		dao.saveOrUpdate(entity);
	}

	public void update(T entity) {
		dao.update(entity);
	}

}


5.配置applicationContext:
 <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="
    		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
			http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
			http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
			http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd
			http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"
			default-autowire="byName" default-lazy-init="false">
			
	<bean id="propertyConfigurer"
		class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="locations">
			<list>
				<value>classpath:/db/jdbc.properties</value>
			</list>
		</property>
	</bean>
	
	<!-- c3p0 数据源 -->
	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
        <property name="driverClass" value="${jdbc.driverClassName}"/>
        <property name="jdbcUrl" value="${jdbc.url}"/>
        <property name="user" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
        <property name="minPoolSize" value="${c3p0.minPoolSize}"/>
        <property name="maxPoolSize" value="${c3p0.maxPoolSize}"/>
        <property name="initialPoolSize" value="${c3p0.initialPoolSize}"/>
        <property name="maxIdleTime" value="${c3p0.maxIdleTime}"/>
        <property name="acquireIncrement" value="${c3p0.acquireIncrement}"/>
        <property name="testConnectionOnCheckin" value="${c3p0.testConnectionOnCheckin}"/>
        <property name="acquireRetryAttempts" value="${c3p0.acquireRetryAttempts}"/>
        <property name="acquireRetryDelay" value="${c3p0.acquireRetryDelay}"/>
        <property name="breakAfterAcquireFailure" value="${c3p0.breakAfterAcquireFailure}"/>
        <property name="idleConnectionTestPeriod" value="${c3p0.idleConnectionTestPeriod}"/>
        <property name="automaticTestTable" value="${c3p0.automaticTestTable}"/>
	</bean>	
	
	<!-- 配置sessionFactory -->
	<bean id="sessionFactory"
		class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">${hibernate.dialect}</prop>
				<prop key="hibernate.show_sql">true</prop>
				<prop key="hibernate.generate_statistics">true</prop>
                <prop key="hibernate.connection.release_mode">auto</prop>
                <prop key="hibernate.autoReconnect">true</prop>
                
                <prop key="query.substitutions">true 1, false 0, yes '1', no '1'</prop>

				<prop key="hibernate.jdbc.fetch_size">50</prop>
				<prop key="hibernate.jdbc.batch_size">25</prop>
				<prop key="hibernate.jdbc.use_scrollable_resultset">true</prop>
				<prop key="hibernate.cache.use_query_cache">true</prop>
				<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
			</props>
		</property>
		<property name="packagesToScan">
			<list>
				<value>com.integration</value>
			</list>
		</property>
	</bean>

	<!-- 事务管理 -->
	<bean id="transactionManager"
		class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		<property name="sessionFactory" ref="sessionFactory"></property>
	</bean>

	<tx:advice id="txAdvice" transaction-manager="transactionManager" >
		<tx:attributes >
		   	<tx:method name="get*" read-only="true" />
			<tx:method name="load*" read-only="true" />
			<tx:method name="query*" read-only="true" />
			<!-- other methods use the default transaction settings (see below) -->
			<tx:method name="*" rollback-for="Exception" />
		</tx:attributes >
	</tx:advice>
	
	<context:component-scan base-package="com.integration" />
	
	<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />
</beans>

6.web.xml配置:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

	<display-name>Integration</display-name>
	<!-- 指定spring配置文件的位置 -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:/context/applicationContext*.xml</param-value>
	</context-param>
	
	<!-- ============log4j begin=========-->
	<!--for Spring-loading-->
	<context-param>
		<param-name>log4jConfigLocation</param-name>
		<param-value>classpath:/log4j.properties</param-value>
	</context-param>
	<listener>
		<listener-class>
			org.springframework.web.util.Log4jConfigListener
		</listener-class>
	</listener>
	<!-- ============log4j end=========-->
	
	<!-- Struts 2 -->
	<filter>
		<filter-name>struts2</filter-name>
		<filter-class>
			org.apache.struts2.dispatcher.FilterDispatcher
		</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>struts2</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	<!-- 自动加载applicationContext -->
	<listener>
		<listener-class>
			org.springframework.web.context.ContextLoaderListener
		</listener-class>
	</listener>

	<welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  
</web-app>
  • 大小: 14.6 KB
1
0
分享到:
评论
1 楼 dongleivip 2015-07-05  
  非常感谢 写的很详细。

相关推荐

    Struts2+hibernate+spring整合泛型DAO

    总结来说,"Struts2+hibernate+spring整合泛型DAO"是一种常见的Java Web开发模式,它利用三大框架的优势,结合泛型设计,提高了代码复用,降低了维护成本,使得开发者能更专注于业务逻辑,而不是基础架构。

    Struts+Spring+Hibernate开发实例.pdf

    Struts负责视图与控制器部分,Spring负责业务逻辑层及依赖注入,Hibernate负责数据持久层。下面将详细介绍文档提及的各个知识点。 **Struts框架** Struts是基于MVC设计模式的一个Web层框架。它将Web层分为Model...

    spring hibernate 泛型DAO

    本文将深入探讨“Spring Hibernate 泛型DAO”这一主题,以及如何通过泛型DAO实现更加高效、可复用的代码。 首先,让我们理解什么是DAO(Data Access Object)模式。DAO是一种设计模式,它的主要作用是隔离业务逻辑...

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

    至于`Dao经典泛型.doc`文件,可能是更深入的关于Hibernate泛型DAO的文档,可能包含了如何配置Spring、如何处理复杂查询以及如何优化泛型DAO的更多细节。阅读这份文档将进一步提升你对泛型DAO的理解和应用能力。 ...

    Hibernate泛型Dao

    【标题】"Hibernate泛型Dao"是针对Java开发中的数据持久化框架Hibernate的一个高级应用,主要目的是为了提高代码的复用性和简洁性。在传统的Hibernate使用中,针对每个实体类,我们都需要创建一个对应的Dao(Data ...

    再发一个基于Hibernate+Spring 泛型GenericDao 的工程源码.

    Spring框架则是一个全面的企业级应用开发框架,提供了依赖注入、事务管理、AOP(面向切面编程)等功能,常与Hibernate结合使用以构建松耦合、模块化的应用程序。 泛型是Java 5引入的一个特性,允许在类、接口和集合...

    SSH2全注解整合(spring2.5+hibernate3.3+struts2.1+泛型DAO+proxool连接池)

    泛型DAO(Data Access Object)是一种设计模式,用于抽象数据访问层的操作,提供通用的CRUD(Create, Read, Update, Delete)方法。通过泛型,DAO可以适用于多种类型的实体,降低了代码重复。例如,一个BaseDAO接口...

    Hibernate泛型DAO及使用方法.doc

    本文档主要探讨了如何在Spring+Hibernate环境中创建和使用泛型DAO。 首先,我们来看一下泛型DAO接口的定义。在`com.th.huz`包下,定义了一个名为`GenericDao`的接口,它有两个泛型参数:`T`代表要操作的实体类,`PK...

    泛型dao 泛型dao 泛型dao

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

    Hibernate泛型DAO及使用方法

    而`Hibernate泛型DAO`则是为了减少代码重复性,提高代码复用性和可维护性的一种设计模式。本文将深入探讨`Hibernate泛型DAO`的实现及其使用方法。 首先,DAO(Data Access Object)模式是一种设计模式,它的主要...

    Hibernate泛型DAO及使用方法借鉴.pdf

    《Hibernate泛型DAO及使用方法借鉴》 在Java开发中,特别是使用Spring+Hibernate框架时,泛型DAO(Data Access Object)是常见的设计模式,它提供了对数据库操作的一般化接口,以提高代码的重用性和可维护性。本文...

    ssh2 + dao泛型

    Spring提供依赖注入和AOP(面向切面编程),Struts处理MVC(模型-视图-控制器)架构中的视图和控制,Hibernate则负责对象-关系映射(ORM),简化了数据库操作。SSH2的组合使得开发者能够高效、安全地构建复杂的应用...

    spring3.1+hibernate4+Jpa Dao

    综上所述,"spring3.1+hibernate4+jpa Dao"的集成是一个高效、灵活的企业级应用开发架构,它结合了Spring的IoC和AOP能力、Hibernate的ORM功能以及JPA的标准接口,通过泛型DAO实现和事务管理,为开发者提供了强大的...

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

    本文将深入探讨一种在SSH(Struts+Spring+Hibernate)框架中广泛应用的经典泛型DAO层实现方式,旨在展示其简洁性、高效性和灵活性。 #### 泛型DAO层:概念与优势 泛型DAO层通过利用Java的泛型机制,提供了一种类型...

    虚拟数据层 Struts2、Hibernate、Spring整合的泛型DAO Version 2010.9.27

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

    Spring+Hibernate实现)Hibernate公用类

    本文将详细解析如何利用Spring和Hibernate来实现一个通用的DAO(Data Access Object)层,以提高代码复用性和项目开发效率。 首先,让我们了解Spring框架。Spring是一个全面的企业级应用开发框架,提供了依赖注入...

    struts+spring+hibernate通用分页方法

    在文档"struts+spring+hibernate通用分页方法.doc"中,可能会详细阐述如何配置这些框架的整合,如何编写Action、Service、DAO以及视图层的代码,以及如何测试和优化分页性能,例如缓存策略、预加载等。 这个通用...

    Struts2 Spring3 Hibernate 注解功能 DAO 泛型 通用分页

    总的来说,"SSHWithAnnotationDemo"项目展示了如何利用现代Java技术栈的高级特性,包括Struts2、Spring3和Hibernate的注解功能,DAO层的泛型设计以及通用的分页实现,来构建一个高效、可维护的Web应用。这样的实践...

    虚拟数据层:Struts2、Hibernate、Spring整合的泛型DAO 代码

    泛型dao 即:不写重复的dao 。这个技术 能让 dao层 和 service层 不写一行代码。外国都用这个泛型DAO了 中国还是一个类一个dao的写,我生气就写了这个文章了。 在本文中,我将为您展示如何避免再三地重复 DAO 代码

    Struts+Spring+Hibernate框架技术在Web开发中的研究与应用

    具体来说,可以利用Spring AOP和动态代理技术,实现一个通用的DAO基类或接口,该基类或接口能够自动为不同的实体类生成相应的DAO实例。这种方式不仅减少了代码量,还提高了系统的可扩展性和维护性。 #### 4. 实现...

Global site tag (gtag.js) - Google Analytics