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

浅析泛型DAO在SSH构架中的应用

阅读更多
自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 泛型dao 泛型dao

    dao接口 : PersonDAO extends GenericDao, Integer&gt; 可以不写代码,方法已经在父类泛型dao里了,这里为了说明:可扩展添加 findByNameExact()方法 子类的附加方法。 泛型daoimpl :GenericDaoImpl, ID extends ...

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

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

    java底层代码:泛型DAO+SSH+Proxool连接池+国际化语言

    3、此底层包含泛型DAO、Proxool连接池、国际化语言、DateUtil工具、ExcelUtil报表工具、自定义封装的弹框、批量删除、分页、上传等。 4、包含常用的工具:jquery、easy-ui、日期控件、highcharts图表控件、图片放大...

    ssh通用泛型DAO

    SSH中的DAO(Data Access Object)层是数据访问层,负责与数据库进行交互。在这个主题中,我们将深入探讨"ssh通用泛型DAO"的相关知识点。 首先,我们来了解"BaseHibernateDAO"。BaseHibernateDAO是基于Hibernate...

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

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

    泛型dao

    在Java编程语言中,"泛型DAO"(Generic DAO)是一种设计模式,它允许开发者创建可重用的数据访问对象(DAOs),以处理多种不同类型的实体对象,而无需为每种对象编写单独的DAO实现。这种方法提高了代码的复用性和可...

    SSH 泛型DAO分页

    4. **泛型DAO**: 在SSH框架中,泛型DAO是一种常见的设计模式,用于封装对数据库的基本操作,如增删查改。通过泛型,我们可以创建一个通用的DAO接口和实现,减少代码重复,提高代码复用。例如,我们可以创建一个`...

    Hibernate泛型Dao

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

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

    阅读这份文档将进一步提升你对泛型DAO的理解和应用能力。 总之,Hibernate泛型DAO结合Spring模板,是Java开发中一种实用且高效的数据访问方式。它不仅减少了代码量,还提高了代码的可维护性,值得在实际项目中广泛...

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

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

    ssh整合下的通用泛型DAO+分页

    在这个特定的讨论中,我们聚焦于SSH1中的一个关键概念:通用泛型DAO(Data Access Object)以及分页功能的实现。DAO层是模型层和数据访问层之间的桥梁,它的主要职责是处理数据库操作,为业务层提供无状态的数据访问...

    JdbcTemplate通用泛型Dao实现

    本文将深入探讨`JdbcTemplate`通用泛型Dao实现的相关知识点,帮助开发者更好地理解和应用这一技术。 首先,让我们了解什么是`JdbcTemplate`。它是Spring框架的一部分,用于处理SQL操作。`JdbcTemplate`提供了一组...

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

    在`我设计的泛型DAO.jpg`中,可能展示了这个设计的类图或者代码结构,进一步解释了各个组件如何协作以实现泛型DAO的功能。 总之,这种设计模式充分利用了Spring的注解驱动和Hibernate的ORM能力,降低了代码的复杂性...

    S2SH整合例子 注解配置 JSON 泛型Dao

    6. **泛型Dao**:在Java开发中,泛型Dao(Generic Dao)是一种设计模式,用于减少重复的数据库操作代码。通过定义一个通用的Dao接口,可以实现对不同类型的实体对象进行CRUD操作,提高了代码的复用性和可维护性。...

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

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

    泛型DAO,注释详细

    本篇文章将深入探讨泛型DAO的实现原理、优势以及如何在实际项目中应用。 首先,我们来理解什么是泛型。泛型是Java 5引入的一个重要特性,允许在类、接口和方法中使用类型参数,以创建可重用的代码并确保类型安全。...

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

    总的来说,泛型DAO在Java Web程序中的应用,不仅可以提高代码的质量,降低出错的可能性,还能让开发者更专注于业务逻辑,而非重复的数据库操作代码。它是现代企业级应用开发中不可或缺的一部分,提升了开发效率和...

    spring hibernate 泛型DAO

    在Hibernate中,我们可以使用HibernateTemplate或SessionFactory来实现这个泛型DAO。例如: ```java public abstract class HibernateGenericDao, ID extends Serializable&gt; implements GenericDao, ID&gt; { ...

Global site tag (gtag.js) - Google Analytics