自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 ...
3、此底层包含泛型DAO、Proxool连接池、国际化语言、DateUtil工具、ExcelUtil报表工具、自定义封装的弹框、批量删除、分页、上传等。 4、包含常用的工具:jquery、easy-ui、日期控件、highcharts图表控件、图片放大...
ssh通用泛型DAO 共包含3个类:BaseHibernateDAO,Page,QueryParameter
而泛型DAO是一个类型安全的,代码精简的设计模式(相对于传统DAO),尤其在DAO组件数量庞大的时候,代码量的减少更加明显。 泛型DAO的核心是定义一个GenericDao接口,声明基本的CRUD操作: 用hibernate作为持久化...
使用了泛型的dao,在ssh里的应用,非常的简便好用
基于hibernate5 泛型Dao实例,下载后改一下数据库 配置直接可以用
S2SH整合例子 注解配置 JSON 泛型Dao
再次打造SSH1整合下的通用泛型DAO+分页,基于HibernateTemplate,欢迎大家指正 - DAO - Java - JavaEye论坛_files
泛型DAO模式在Java Web开发中的应用
泛型DAO 完善的dao代码及criteria查询底层代码
目的,研究泛型DAO模式在java Web程序运用中的应用及其作用。方法,通过研究泛型DAO模式的设计理念及工作过程,与已经存在的DAO模式进行对比,分析其在java Web程序运用中的作用。结果:在编辑了泛型DAO模式之后的java ...
dao接口 : PersonDAO extends GenericDao, Integer> 可以不写代码,方法已经在父类泛型dao里了,这里为了说明:可扩展添加 findByNameExact()方法 子类的附加方法。 泛型daoimpl :GenericDaoImpl, ID extends ...
NULL 博文链接:https://rooi.iteye.com/blog/1032620
泛型dao 即:不写重复的dao 。这个技术 能让 dao层 和 service层 不写一行代码。外国都用这个泛型DAO了 中国还是一个类一个dao的写,我生气就写了这个文章了。 在本文中,我将为您展示如何避免再三地重复 DAO 代码
NULL 博文链接:https://287854442.iteye.com/blog/746718
Struts2.1.6+Spring2.5.6+Hibernate3.3.2+mysql整合+分页模板 能用
NULL 博文链接:https://zhaoshijie.iteye.com/blog/982232
Hibernate泛型DAO及使用方法.
Java Web程序运用中泛型DAO的作用