自JDK1.5后,泛型在很多方面开始应用。DAO层也开始有了基于泛型的开发模式.可能也正因为如此,有不少人认为DAO作为企业级开发的一层可以去掉了,理由就是只要有一个泛型DAO就可以搞定了!而我认为哪怕只有一个DAO,也应算是一个层,层的定义不是由它下面的组件多少决定的,而是由它扮演的角色来决定的。
这里主要就泛型DAO的开发举个例子:
一、泛型DAO的接口
/**
* Generic DAO (Data Access Object) with common methods to CRUD POJOs.
*
* <p>Extend this interface if you want typesafe (no casting necessary) DAO's for your
* domain objects.
*
* @author llf
*/
public interface GenericDao <T, PK extends Serializable> {
public List<T> findByHsql(String hsql);
//为了突出上面的例子方法,以下省掉N多方法,可以在用时再扩展
}
二、定义泛型DAO的实现(这里为Hibernate实现)
/**
* 本dao类基于hibernate,所以需要在applicationContext.xml中定义SessionFacotry
* @author llf
*/
public class BaseDaoHibernate<T, PK extends Serializable> implements GenericDao<T, PK> {
private SessionFactory sessionFactory;
private Class<T> clazz;
@SuppressWarnings("unchecked")
public BaseDaoHibernate() {
//以下代码无法实现,类型转换有错,以后再分析
/*Type type = this.getClass().getGenericSuperclass();
if (type instanceof ParameterizedType) {
clazz = (Class)((ParameterizedType)type).getActualTypeArguments()[0];
} else {
throw new RuntimeException(this.getClass().getName()+ "没有指定继承的po类型");
}*/
}
/**
* 上面无参数构造方法的替代
* 以便在sevice中通过构造为dao指定实体类的类型。不然就无法实现泛型的效果了
*/
@SuppressWarnings("unchecked")
public BaseDaoHibernate(SessionFactory sessionFactory,Class clazz) {
this.sessionFactory = sessionFactory;
this.clazz = clazz;
}
public Class<T> getClazz() {
return clazz;
}
public SessionFactory getSessionFactory() {
return sessionFactory;
}
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
/**
* 从sessionFactory中取得hibernate的session对象,这是dao的关键因素
*/
public Session getSession() {
return sessionFactory.openSession();
}
/**
* 实现接口中的例子方法
*/
public List<T> findByHsql(String hsql) {
Query queryObject = getSession().createQuery(hsql);
return queryObject.list();
}
}
注:这里的无参数构造方法在很多文章中都看到了,但我无法成功运用,很遗憾!如果能成功那么就勿须在service中用用那种怪异的构造方法了。另,听说spring3.0已提供了支持泛型的HibernateTemplate,希望能早点看到。
三、在Service层注入并应用泛型DAO
/**
*
* @author Administrator
*/
@Service("userManager")
public class UserManagerImpl implements UserManager {
private GenericDao<User, String> baseDao;
/**
* 将sessionFactory注入到dao,并为泛型dao指定实体类型
* @param sessionFactory
*/
@Autowired
private void setSessionFactory(SessionFactory sessionFactory){
baseDao = new BaseDaoHibernate<User,String>(sessionFactory,User.class);
}
/**
* 用这个方法作一个查询操作的例子
*/
public List<User> getAllUsers() {
List<User> users = baseDao.findByHsql("from User user");
return users;
}
//以下省掉N多业务方法……
}
附、Spring框架配置文件(applicationContext.xml)
<?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-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<!--组件的自动扫描,主动加载-->
<context:component-scan base-package="cn.lvlf">
<context:include-filter type="regex" expression=".ssh.demo.service.*.*Manager"/>
<context:include-filter type="regex" expression=".ssh.demo.dao.*.*Hibernate"/>
<context:include-filter type="regex" expression=".ssh.demo.web.action.*Action"/>
</context:component-scan>
<!--数据源-->
<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="5"/>
<property name="maxPoolSize" value="30"/>
</bean>
<!--Hibernate的session工厂-->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="namingStrategy">
<bean class="org.hibernate.cfg.ImprovedNamingStrategy" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.cache.use_second_level_cache">false</prop>
<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
<prop key="show_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">none</prop>
</props>
</property>
<property name="packagesToScan" >
<list>
<value>cn.lvlf.ssh.demo.model</value>
</list>
</property>
</bean>
<!--定义事务管理组件-->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!--基于注解的事务声明-->
<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>
小结:
虽然我们可以用泛型DAO减少许多代码,但是Dao作为一个层,建议在必要时还是要写各自模块的dao(可以让它继承自泛型dao),这样可以保证逻辑的清晰,方便代码重构!
分享到:
相关推荐
dao接口 : PersonDAO extends GenericDao, Integer> 可以不写代码,方法已经在父类泛型dao里了,这里为了说明:可扩展添加 findByNameExact()方法 子类的附加方法。 泛型daoimpl :GenericDaoImpl, ID extends ...
### 泛型DAO层在SSH框架中的应用与详解 #### 引言 在现代软件开发中,特别是基于Java的企业级应用开发中,DAO(Data Access Object)层的设计扮演着至关重要的角色。它作为业务逻辑层与数据持久层之间的桥梁,承担...
3、此底层包含泛型DAO、Proxool连接池、国际化语言、DateUtil工具、ExcelUtil报表工具、自定义封装的弹框、批量删除、分页、上传等。 4、包含常用的工具:jquery、easy-ui、日期控件、highcharts图表控件、图片放大...
SSH中的DAO(Data Access Object)层是数据访问层,负责与数据库进行交互。在这个主题中,我们将深入探讨"ssh通用泛型DAO"的相关知识点。 首先,我们来了解"BaseHibernateDAO"。BaseHibernateDAO是基于Hibernate...
泛型DAO模式在Java Web开发中的应用 摘要: 泛型DAO模式是Java Web开发中的一种重要模式,它可以提高数据访问代码的类型安全性和可读性。该模式可以与Struts、Spring和JPA框架集成,实现用户管理系统的开发。通过...
在Java编程语言中,"泛型DAO"(Generic DAO)是一种设计模式,它允许开发者创建可重用的数据访问对象(DAOs),以处理多种不同类型的实体对象,而无需为每种对象编写单独的DAO实现。这种方法提高了代码的复用性和可...
4. **泛型DAO**: 在SSH框架中,泛型DAO是一种常见的设计模式,用于封装对数据库的基本操作,如增删查改。通过泛型,我们可以创建一个通用的DAO接口和实现,减少代码重复,提高代码复用。例如,我们可以创建一个`...
【标题】"Hibernate泛型Dao"是针对Java开发中的数据持久化框架Hibernate的一个高级应用,主要目的是为了提高代码的复用性和简洁性。在传统的Hibernate使用中,针对每个实体类,我们都需要创建一个对应的Dao(Data ...
阅读这份文档将进一步提升你对泛型DAO的理解和应用能力。 总之,Hibernate泛型DAO结合Spring模板,是Java开发中一种实用且高效的数据访问方式。它不仅减少了代码量,还提高了代码的可维护性,值得在实际项目中广泛...
而泛型DAO是一个类型安全的,代码精简的设计模式(相对于传统DAO),尤其在DAO组件数量庞大的时候,代码量的减少更加明显。 泛型DAO的核心是定义一个GenericDao接口,声明基本的CRUD操作: 用hibernate作为持久化...
在这个特定的讨论中,我们聚焦于SSH1中的一个关键概念:通用泛型DAO(Data Access Object)以及分页功能的实现。DAO层是模型层和数据访问层之间的桥梁,它的主要职责是处理数据库操作,为业务层提供无状态的数据访问...
本文将深入探讨`JdbcTemplate`通用泛型Dao实现的相关知识点,帮助开发者更好地理解和应用这一技术。 首先,让我们了解什么是`JdbcTemplate`。它是Spring框架的一部分,用于处理SQL操作。`JdbcTemplate`提供了一组...
在`我设计的泛型DAO.jpg`中,可能展示了这个设计的类图或者代码结构,进一步解释了各个组件如何协作以实现泛型DAO的功能。 总之,这种设计模式充分利用了Spring的注解驱动和Hibernate的ORM能力,降低了代码的复杂性...
6. **泛型Dao**:在Java开发中,泛型Dao(Generic Dao)是一种设计模式,用于减少重复的数据库操作代码。通过定义一个通用的Dao接口,可以实现对不同类型的实体对象进行CRUD操作,提高了代码的复用性和可维护性。...
本文探讨了在Java Web程序中应用泛型DAO模式的作用和意义。首先,文章明确了Java Web技术的定义和在互联网领域中的重要性,阐述了随着软件功能需求的不断提高,Java Web技术也在不断升级和改造。随后,文章指出泛型...
本篇文章将深入探讨泛型DAO的实现原理、优势以及如何在实际项目中应用。 首先,我们来理解什么是泛型。泛型是Java 5引入的一个重要特性,允许在类、接口和方法中使用类型参数,以创建可重用的代码并确保类型安全。...
总的来说,泛型DAO在Java Web程序中的应用,不仅可以提高代码的质量,降低出错的可能性,还能让开发者更专注于业务逻辑,而非重复的数据库操作代码。它是现代企业级应用开发中不可或缺的一部分,提升了开发效率和...
在Hibernate中,我们可以使用HibernateTemplate或SessionFactory来实现这个泛型DAO。例如: ```java public abstract class HibernateGenericDao, ID extends Serializable> implements GenericDao, ID> { ...