总体架构:
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
分享到:
相关推荐
总结来说,"Struts2+hibernate+spring整合泛型DAO"是一种常见的Java Web开发模式,它利用三大框架的优势,结合泛型设计,提高了代码复用,降低了维护成本,使得开发者能更专注于业务逻辑,而不是基础架构。
Struts负责视图与控制器部分,Spring负责业务逻辑层及依赖注入,Hibernate负责数据持久层。下面将详细介绍文档提及的各个知识点。 **Struts框架** Struts是基于MVC设计模式的一个Web层框架。它将Web层分为Model...
本文将深入探讨“Spring Hibernate 泛型DAO”这一主题,以及如何通过泛型DAO实现更加高效、可复用的代码。 首先,让我们理解什么是DAO(Data Access Object)模式。DAO是一种设计模式,它的主要作用是隔离业务逻辑...
至于`Dao经典泛型.doc`文件,可能是更深入的关于Hibernate泛型DAO的文档,可能包含了如何配置Spring、如何处理复杂查询以及如何优化泛型DAO的更多细节。阅读这份文档将进一步提升你对泛型DAO的理解和应用能力。 ...
【标题】"Hibernate泛型Dao"是针对Java开发中的数据持久化框架Hibernate的一个高级应用,主要目的是为了提高代码的复用性和简洁性。在传统的Hibernate使用中,针对每个实体类,我们都需要创建一个对应的Dao(Data ...
Spring框架则是一个全面的企业级应用开发框架,提供了依赖注入、事务管理、AOP(面向切面编程)等功能,常与Hibernate结合使用以构建松耦合、模块化的应用程序。 泛型是Java 5引入的一个特性,允许在类、接口和集合...
泛型DAO(Data Access Object)是一种设计模式,用于抽象数据访问层的操作,提供通用的CRUD(Create, Read, Update, Delete)方法。通过泛型,DAO可以适用于多种类型的实体,降低了代码重复。例如,一个BaseDAO接口...
本文档主要探讨了如何在Spring+Hibernate环境中创建和使用泛型DAO。 首先,我们来看一下泛型DAO接口的定义。在`com.th.huz`包下,定义了一个名为`GenericDao`的接口,它有两个泛型参数:`T`代表要操作的实体类,`PK...
Struts2、Hibernate、Spring整合的泛型DAO (本人评价: 代码开发效率提高30% 代码出错率减少70%) 对于大多数开发人员,系统中的每个 DAO 编写几乎相同的代码到目前为止已经成为一种习惯。虽然所有人都将这种重复...
而`Hibernate泛型DAO`则是为了减少代码重复性,提高代码复用性和可维护性的一种设计模式。本文将深入探讨`Hibernate泛型DAO`的实现及其使用方法。 首先,DAO(Data Access Object)模式是一种设计模式,它的主要...
《Hibernate泛型DAO及使用方法借鉴》 在Java开发中,特别是使用Spring+Hibernate框架时,泛型DAO(Data Access Object)是常见的设计模式,它提供了对数据库操作的一般化接口,以提高代码的重用性和可维护性。本文...
Spring提供依赖注入和AOP(面向切面编程),Struts处理MVC(模型-视图-控制器)架构中的视图和控制,Hibernate则负责对象-关系映射(ORM),简化了数据库操作。SSH2的组合使得开发者能够高效、安全地构建复杂的应用...
综上所述,"spring3.1+hibernate4+jpa Dao"的集成是一个高效、灵活的企业级应用开发架构,它结合了Spring的IoC和AOP能力、Hibernate的ORM功能以及JPA的标准接口,通过泛型DAO实现和事务管理,为开发者提供了强大的...
本文将深入探讨一种在SSH(Struts+Spring+Hibernate)框架中广泛应用的经典泛型DAO层实现方式,旨在展示其简洁性、高效性和灵活性。 #### 泛型DAO层:概念与优势 泛型DAO层通过利用Java的泛型机制,提供了一种类型...
Struts2、Hibernate、Spring整合的泛型DAO (本人评价: 代码开发效率提高30% 代码出错率减少70%) 对于大多数开发人员,系统中的每个 DAO 编写几乎相同的代码到目前为止已经成为一种习惯。虽然所有人都将这种重复...
本文将详细解析如何利用Spring和Hibernate来实现一个通用的DAO(Data Access Object)层,以提高代码复用性和项目开发效率。 首先,让我们了解Spring框架。Spring是一个全面的企业级应用开发框架,提供了依赖注入...
在文档"struts+spring+hibernate通用分页方法.doc"中,可能会详细阐述如何配置这些框架的整合,如何编写Action、Service、DAO以及视图层的代码,以及如何测试和优化分页性能,例如缓存策略、预加载等。 这个通用...
总的来说,"SSHWithAnnotationDemo"项目展示了如何利用现代Java技术栈的高级特性,包括Struts2、Spring3和Hibernate的注解功能,DAO层的泛型设计以及通用的分页实现,来构建一个高效、可维护的Web应用。这样的实践...
泛型dao 即:不写重复的dao 。这个技术 能让 dao层 和 service层 不写一行代码。外国都用这个泛型DAO了 中国还是一个类一个dao的写,我生气就写了这个文章了。 在本文中,我将为您展示如何避免再三地重复 DAO 代码
具体来说,可以利用Spring AOP和动态代理技术,实现一个通用的DAO基类或接口,该基类或接口能够自动为不同的实体类生成相应的DAO实例。这种方式不仅减少了代码量,还提高了系统的可扩展性和维护性。 #### 4. 实现...