HinernateEntityDao和HibernateGenericDao都继承在spring的HibernateDaoSupport
一个提供和实体相关的操作,一个提供和实体类无关的操作。
然后以组合的方式在BaseDao中使用,这样程序中全部使用IBaseDao接口来操作数据,便于修改和维护.
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"
- xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
- <!-这个是和实体相关的dao,所以scope是prototype的每个实体对应一个对象->
- <bean id="hedao"
- class="com.hibernate.dao.extend.HibernateEntityDao" scope="prototype" lazy-init="true">
- <property name="sessionFactory">
- <ref bean="sessionFactory" />
- </property>
- </bean>
- <!-这个和具体实体无关,所有dao共享->
- <bean id="hgdao"
- class="com.hibernate.dao.generic.HibernateGenericDao">
- <property name="sessionFactory">
- <ref bean="sessionFactory" />
- </property>
- </bean>
- <!--使用泛型DAO作为抽象基类-->
- <bean id="baseDao" class="com.hibernate.dao.base.BaseDao"
- abstract="true" depends-on="hedao,hgdao">
- <property name="hedao">
- <ref bean="hedao" />
- </property>
- <property name="hgdao">
- <ref bean="hgdao" />
- </property>
- </bean>
- <!-- 配置实体Demodata的DAO -->
- <bean id="demoDao" parent="baseDao">
- <constructor-arg>
- <value>com.hibernate.entityclass.Demodata</value>
- </constructor-arg>
- </bean>
- </beans>
BaseDao.java
- package com.hibernate.dao.base;
- import java.io.Serializable;
- import java.util.List;
- import org.hibernate.Criteria;
- import org.hibernate.Query;
- import org.hibernate.criterion.Criterion;
- import org.springframework.orm.hibernate3.HibernateTemplate;
- import com.hibernate.dao.extend.HibernateEntityDao;
- import com.hibernate.dao.generic.HibernateGenericDao;
- import com.hibernate.dao.support.Page;
- /**
- * 提供hibernate dao的所有操作,<br>
- * 实现类由spring注入HibernateEntityDao和HibernateGenericDao来实现
- *
- */
- public class BaseDao<T,PK extends Serializable> implements IBaseDao<T,PK> {
- protected Class<T> entityClass;// DAO所管理的Entity类型.
- private HibernateEntityDao<T,PK> hedao;
- private HibernateGenericDao hgdao;
- public void setHedao(HibernateEntityDao<T, PK> hedao) {
- hedao.setEntityClass(entityClass);
- this.hedao = hedao;
- }
- public void setHgdao(HibernateGenericDao hgdao) {
- this.hgdao = hgdao;
- }
- /**
- *让spring提供构造函数注入
- */
- public BaseDao(Class<T> type) {
- this.entityClass = type;
- }
- public BaseDao(){}
- /**
- * 清除所有对象缓存
- */
- public void clear() {
- hgdao.clear();
- }
- /**
- * 创建Criteria对象.
- * @param criterions 可变的Restrictions条件列表
- */
- public Criteria createCriteria(Criterion... criterions) {
- return hedao.createCriteria(criterions);
- }
- /**
- * 创建Criteria对象,带排序字段与升降序字段.
- */
- public Criteria createCriteria(String orderBy, boolean isAsc,
- Criterion... criterions) {
- return hedao.createCriteria(orderBy, isAsc, criterions);
- }
- /**
- * 创建Query对象. 对于需要first,max,fetchsize,cache,cacheRegion等诸多设置的函数,可以在返回Query后自行设置.
- * 留意可以连续设置,如下:
- * <pre>
- * dao.getQuery(hql).setMaxResult(100).setCacheable(true).list();
- * </pre>
- * 调用方式如下:
- * <pre>
- * dao.createQuery(hql)
- * dao.createQuery(hql,arg0);
- * dao.createQuery(hql,arg0,arg1);
- * dao.createQuery(hql,new Object[arg0,arg1,arg2])
- * </pre>
- *
- * @param values 可变参数.
- */
- public Query createQuery(String hql, Object... values) {
- return hgdao.createQuery(hql, values);
- }
- /**
- * @param hql 查询sql
- * @param start 分页从哪一条数据开始
- * @param pageSize 每一个页面的大小
- * @param values 查询条件
- * @return page对象
- */
- public Page dataQuery(String hql, int start, int pageSize, Object... values) {
- return hgdao.dataQuery(hql, start, pageSize, values);
- }
- /**
- * 消除与 Hibernate Session 的关联
- * @param entity
- */
- public void evit(T entity) {
- hedao.evict(entity);
- }
- /**
- * 执行本地sql语句获得标量数值列表
- */
- @SuppressWarnings("unchecked")
- public List executeNativeSql(String sql) {
- return hgdao.executeNativeSql(sql);
- }
- /**
- * 根据hql查询,直接使用HibernateTemplate的find函数.
- * @param values 可变参数
- */
- @SuppressWarnings("unchecked")
- public List find(String hql, Object... values) {
- return hgdao.find(hql, values);
- }
- /**
- * 根据属性名和属性值查询对象.
- * @return 符合条件的对象列表
- */
- public List<T> findBy(String propertyName, Object value) {
- return