`

Hibernate 数据库操作 模板基类 实现类GenericHibernateDao

阅读更多

package com.ddhome.dao.hibernate;

import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.sql.SQLException;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;

import org.apache.commons.beanutils.PropertyUtils;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.LockMode;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Example;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import com.ddhome.dao.GenericDao;

/**
* GenericHibernateDao 继承 HibernateDao,简单封装 HibernateTemplate 各项功能,
* 简化基于Hibernate Dao 的编写。
*
* @author TXC
*/
@SuppressWarnings("unchecked")
public class GenericHibernateDao<T extends Serializable, PK extends Serializable>
        extends HibernateDaoSupport implements GenericDao<T, PK> {
    // 实体类类型(由构造方法自动赋值)
    private Class<T> entityClass;

    // 构造方法,根据实例类自动获取实体类类型
    public GenericHibernateDao() {
        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];
        }
    }

    // -------------------- 基本检索、增加、修改、删除操作 --------------------

    // 根据主键获取实体。如果没有相应的实体,返回 null。
    public T get(PK id) {
        return (T) getHibernateTemplate().get(entityClass, id);
    }

    // 根据主键获取实体并加锁。如果没有相应的实体,返回 null。
    public T getWithLock(PK id, LockMode lock) {
        T t = (T) getHibernateTemplate().get(entityClass, id, lock);
        if (t != null) {
            this.flush(); // 立即刷新,否则锁不会生效。
        }
        return t;
    }

    // 根据主键获取实体。如果没有相应的实体,抛出异常。
    public T load(PK id) {
        return (T) getHibernateTemplate().load(entityClass, id);
    }

    // 根据主键获取实体并加锁。如果没有相应的实体,抛出异常。
    public T loadWithLock(PK id, LockMode lock) {
        T t = (T) getHibernateTemplate().load(entityClass, id, lock);
        if (t != null) {
            this.flush(); // 立即刷新,否则锁不会生效。
        }
        return t;
    }

    // 获取全部实体。
    public List<T> loadAll() {
        return (List<T>) getHibernateTemplate().loadAll(entityClass);
    }

    // loadAllWithLock() ?

    // 更新实体
    public void update(T entity) {
        getHibernateTemplate().update(entity);
    }

    // 更新实体并加锁
    public void updateWithLock(T entity, LockMode lock) {
        getHibernateTemplate().update(entity, lock);
        this.flush(); // 立即刷新,否则锁不会生效。
    }

    // 存储实体到数据库
    public void save(T entity) {
        getHibernateTemplate().save(entity);
    }

    // saveWithLock()?

    // 增加或更新实体
    public void saveOrUpdate(T entity) {
        getHibernateTemplate().saveOrUpdate(entity);
    }

    // 增加或更新集合中的全部实体
    public void saveOrUpdateAll(Collection<T> entities) {
        getHibernateTemplate().saveOrUpdateAll(entities);
    }

    // 删除指定的实体
    public void delete(T entity) {
        getHibernateTemplate().delete(entity);
    }

    // 加锁并删除指定的实体
    public void deleteWithLock(T entity, LockMode lock) {
        getHibernateTemplate().delete(entity, lock);
        this.flush(); // 立即刷新,否则锁不会生效。
    }

    // 根据主键删除指定实体
    public void deleteByKey(PK id) {
        this.delete(this.load(id));
    }

    // 根据主键加锁并删除指定的实体
    public void deleteByKeyWithLock(PK id, LockMode lock) {
        this.deleteWithLock(this.load(id), lock);
    }

    // 删除集合中的全部实体
    public void deleteAll(Collection<T> entities) {
        getHibernateTemplate().deleteAll(entities);
    }

    // -------------------- HSQL ----------------------------------------------

    // 使用HSQL语句直接增加、更新、删除实体
    public int bulkUpdate(String queryString) {
        return getHibernateTemplate().bulkUpdate(queryString);
    }

    // 使用带参数的HSQL语句增加、更新、删除实体
    public int bulkUpdate(String queryString, Object[] values) {
        return getHibernateTemplate().bulkUpdate(queryString, values);
    }

    // 使用HSQL语句检索数据
    public List find(String queryString) {
        return getHibernateTemplate().find(queryString);
    }

    // 使用带参数的HSQL语句检索数据
    public List find(String queryString, Object[] values) {
        return getHibernateTemplate().find(queryString, values);
    }

    // 使用带命名的参数的HSQL语句检索数据
    public List findByNamedParam(String queryString, String[] paramNames,
            Object[] values) {
        return getHibernateTemplate().findByNamedParam(queryString, paramNames,
                values);
    }

    // 使用命名的HSQL语句检索数据
    public List findByNamedQuery(String queryName) {
        return getHibernateTemplate().findByNamedQuery(queryName);
    }

    // 使用带参数的命名HSQL语句检索数据
    public List findByNamedQuery(String queryName, Object[] values) {
        return getHibernateTemplate().findByNamedQuery(queryName, values);
    }

    // 使用带命名参数的命名HSQL语句检索数据
    public List findByNamedQueryAndNamedParam(String queryName,
            String[] paramNames, Object[] values) {
        return getHibernateTemplate().findByNamedQueryAndNamedParam(queryName,
                paramNames, values);
    }

    // 使用HSQL语句检索数据,返回 Iterator
    public Iterator iterate(String queryString) {
        return getHibernateTemplate().iterate(queryString);
    }

    // 使用带参数HSQL语句检索数据,返回 Iterator
    public Iterator iterate(String queryString, Object[] values) {
        return getHibernateTemplate().iterate(queryString, values);
    }

    // 关闭检索返回的 Iterator
    public void closeIterator(Iterator it) {
        getHibernateTemplate().closeIterator(it);
    }

    // -------------------------------- Criteria ------------------------------

    // 创建与会话无关的检索标准
    public DetachedCriteria createDetachedCriteria() {
        return DetachedCriteria.forClass(this.entityClass);
    }

    // 创建与会话绑定的检索标准
    public Criteria createCriteria() {
        return this.createDetachedCriteria().getExecutableCriteria(
                this.getSession());
    }

    // 检索满足标准的数据
    public List findByCriteria(DetachedCriteria criteria) {
        return getHibernateTemplate().findByCriteria(criteria);
    }

    // 检索满足标准的数据,返回指定范围的记录
    public List findByCriteria(DetachedCriteria criteria, int firstResult,
            int maxResults) {
        return getHibernateTemplate().findByCriteria(criteria, firstResult,
                maxResults);
    }

    // 使用指定的实体及属性检索(满足除主键外属性=实体值)数据
    public List<T> findEqualByEntity(T entity, String[] propertyNames) {
        return findEqualByEntity(entity,propertyNames,-1,-1);
    }
   
// 使用指定的实体及属性检索(满足除主键外属性=实体值)数据 实现分页
    public List<T> findEqualByEntity(T entity, String[] propertyNames,int fromIdx,int fetchCount) {
        Criteria criteria = this.createCriteria();
        Example exam = Example.create(entity);
        exam.excludeZeroes();
        String[] defPropertys = getSessionFactory().getClassMetadata(
                entityClass).getPropertyNames();
        for (String defProperty : defPropertys) {
            int ii = 0;
            for (ii = 0; ii < propertyNames.length; ++ii) {
                if (defProperty.equals(propertyNames[ii])) {
                    criteria.addOrder(Order.asc(defProperty));
                    break;
                }
            }
            if (ii == propertyNames.length) {
                exam.excludeProperty(defProperty);
            }
        }
        if(fromIdx > -1)
        criteria.setFirstResult(fromIdx);
        if(fetchCount > -1)
        criteria.setMaxResults(fetchCount);
        criteria.add(exam);
        return (List<T>) criteria.list();
    }

    public T findUniqueEqualByEntity(T entity, String[] propertyNames) {
    List<T> result = findEqualByEntity(entity,propertyNames,0,1);
    if(result == null || result.isEmpty())
    return null;
    return result.get(0);
}
    // 使用指定的实体及属性检索(满足属性 like 串实体值)数据
    public List<T> findLikeByEntity(T entity, String[] propertyNames) {
        Criteria criteria = this.createCriteria();
        for (String property : propertyNames) {
            try {
                Object value = PropertyUtils.getProperty(entity, property);
                if (value instanceof String) {
                    criteria.add(Restrictions.like(property, (String) value,
                            MatchMode.ANYWHERE));
                    criteria.addOrder(Order.asc(property));
                } else {
                    criteria.add(Restrictions.eq(property, value));
                    criteria.addOrder(Order.asc(property));
                }
            } catch (Exception ex) {
                // 忽略无效的检索参考数据。
            }
        }
        return (List<T>) criteria.list();
    }

    // 使用指定的检索标准获取满足标准的记录数
    public Integer getRowCount(DetachedCriteria criteria) {
        criteria.setProjection(Projections.rowCount());
        List list = this.findByCriteria(criteria, 0, 1);
        return (Integer) list.get(0);
    }

    // 使用指定的检索标准检索数据,返回指定统计值(max,min,avg,sum)
    public Object getStatValue(DetachedCriteria criteria, String propertyName,
            String StatName) {
        if (StatName.toLowerCase().equals("max"))
            criteria.setProjection(Projections.max(propertyName));
        else if (StatName.toLowerCase().equals("min"))
            criteria.setProjection(Projections.min(propertyName));
        else if (StatName.toLowerCase().equals("avg"))
            criteria.setProjection(Projections.avg(propertyName));
        else if (StatName.toLowerCase().equals("sum"))
            criteria.setProjection(Projections.sum(propertyName));
        else
            return null;
        List list = this.findByCriteria(criteria, 0, 1);
        return list.get(0);
    }

    // -------------------------------- Others --------------------------------

    // 加锁指定的实体
    public void lock(T entity, LockMode lock) {
        getHibernateTemplate().lock(entity, lock);
    }

    // 强制初始化指定的实体
    public void initialize(Object proxy) {
        getHibernateTemplate().initialize(proxy);
    }

    // 强制立即更新缓冲数据到数据库(否则仅在事务提交时才更新)
    public void flush() {
        getHibernateTemplate().flush();
    }

public List find(final String queryString, final Object[] values, final int start, final int limit) {
return (List) getHibernateTemplate().execute(new HibernateCallback(){

public Object doInHibernate(Session arg0)
throws HibernateException, SQLException {
Query query = arg0.createQuery(queryString);
if(values != null)
{
for(int i = 0;i<values.length;i++)
{
query.setParameter(i, values[i]);
}
}
if(start > -1)
query.setFirstResult(start);
if(limit > -1)
query.setMaxResults(limit);
return query.list();
}

});
}

public int getRow(final String queryString, final Object[] values) {
return (Integer) getHibernateTemplate().execute(new HibernateCallback(){
public Object doInHibernate(Session arg0)
throws HibernateException, SQLException {
Query query = arg0.createQuery(queryString);
if(values != null)
{
for(int i = 0;i<values.length;i++)
{
query.setParameter(i, values[i]);
}
}
return query.uniqueResult();
}

});
}

public T findUniqueByCriteria(DetachedCriteria criteria) {
List list = this.findByCriteria(criteria, 0, 1);
if(list == null || list.size() == 0)
return null;
return (T)list.get(0);
}

}

分享到:
评论

相关推荐

    MFC数据库基类模板

    MFC数据库基类模板是开发者常用的一种工具,它帮助程序员快速地创建数据库相关的类,以实现对数据库的增、删、改、查等基本操作,从而避免重复编写大量繁琐的代码。 MFC数据库支持的主要库有两个:ODBC(Open ...

    C# 数据库操作基类

    C# 数据库操作基类 包括存储过程和事务处理

    基于连接池数据库操作基类

    文件名称"MyLib.Data"可能是一个包含这个基类和其他相关数据库操作类的库或命名空间。在这个库中,可能会有针对不同数据库类型的子类,如SqlDataPool、OracleDataPool等,它们继承自基类并实现特定数据库的连接和...

    C#数据库操作基类

    c#数据操作基类如何将Sql Server 表的结构导出到Word或Excel

    vc数据库操作基类ADO C++

    - **封装常见操作**:基类可能已经封装了连接数据库、执行SQL、处理Recordset等常见操作,简化子类的实现。 - **多态性**:基类可以定义虚函数,允许子类重写以满足特定需求。 - **错误处理**:基类可能包含统一...

    数据库操作基类

    数据库操作基类是编程中一个重要的设计模式,它通常用于封装数据库访问的通用逻辑,提供一个统一的接口供其他类使用。这样的设计可以提高代码的可重用性、可维护性和可扩展性,同时降低耦合度。在这个基类中,我们...

    C# ADO.NET数据库操作基类(不好用你拿砖头拍)

    总的来说,"SqlHelper.cs"类作为数据库操作的基类,封装了数据库连接、命令执行、参数处理等常见任务,简化了C#应用中的数据库交互。开发者可以根据实际需求扩展此类,增加更多的功能,如事务处理、数据分页等。在...

    数据库访问基类(access和MSSQL)

    数据库访问基类是软件开发中一个重要的设计模式,主要用于封装数据库操作,降低代码的耦合度,提高可维护性和可扩展性。在这个特定的案例中,我们有一个名为"数据库访问基类(access和MSSQL)"的基类,它支持两种常见...

    C#数据库操作类

    本篇文章将详细探讨“C#数据库操作类”的核心概念和功能,以及如何使用它来连接和操作不同类型的数据库。 首先,标题中的"C#数据库操作类"指的是一个专门设计用于简化C#中数据库交互的自定义类。这类类通常封装了...

    C# 数据库连接基类 DataBas

    在本主题中,"C# 数据库连接基类 DataBas" 涉及到创建一个基础类来处理数据库连接、查询以及数据操作,如增删改查(CRUD)操作。"PageDataSource" 提到了数据分页功能,这是在显示大量数据时常用的一种优化方法。 ...

    PHP基于单例模式实现的数据库操作基类

    本文实例讲述了PHP基于单例模式实现的数据库操作基类。分享给大家供大家参考,具体如下: 配置文件: &lt;?php $db = array( 'host'=&gt;'localhost', 'user'=&gt;'root', 'password'=&gt;'', 'database'=&gt;'test', ) ?&...

    .Net数据库操作基类 - 通用于Windows及Linux的Mono环境

    1、.Net数据库操作基类,支持Mysql、Sql Server、Oracle等多种数据库; 2、同一项目可以支持调用不同数据库,只需在调用前调用DataBaseOperator.Init方法; 3、采用绑定变量调用,参数通过ParamCollections对象实现...

    cshapr连接数据库--SqlHelper基类

    在C#中,为了简化数据库操作,开发者通常会创建一个名为`SqlHelper`的基类,它提供了一种方便的方式来执行SQL命令,如查询、插入、更新和删除等操作。本文将深入探讨`SqlHelper`基类及其在C#中连接和操作SQL数据库的...

    orcal连接数据库的基类for vs

    本教程将详细讲解如何在C#中使用基类来实现Oracle数据库的连接,以及如何进行JSON数据的处理和数据库操作。 一、Oracle数据库连接基础 在C#中连接Oracle数据库,我们需要引用Oracle提供的ODP.NET(Oracle Data ...

    数据库操作类和自定义类

    - `EmployeeDAL.cs`、`OrderDAL.cs`:具体的DAL实现类,实现了`DAL.cs`中定义的接口或继承的基类,实现了与数据库的交互。 理解并熟练运用这些类和架构模式,可以帮助开发者更高效地构建和维护C#应用程序。在实际...

    Hibernate操作持久化对象

    Hibernate的核心在于提供对象-关系映射(ORM)服务,使得开发者能够以面向对象的方式来管理和操作数据库中的数据,从而减少了直接使用JDBC进行数据操作时的复杂性和错误。 为什么需要Hibernate? 在传统的JDBC编程中...

    设计基类点类(Point)、直接派生类圆类(Circle)、间接派生类圆柱体类(Cylinder),将求面积的函数(area)声明成虚函数,并在主函数实现虚函数

    题目:设计基类点类(Point)、直接派生类圆类(Circle)、间接派生类圆柱体类(Cylinder),将求面积的函数(area)声明成虚函数,并在主函数实现虚函数调用,输出点类、圆类和圆柱体类面积。提示:其他数据成员和...

    c++基类派生类代码

    在C++编程中,类是面向对象编程的基础,它们用于封装数据和操作这些数据的方法。题目中的"基类"和"派生类"是面向对象编程中的重要概念,用于实现代码的复用和扩展。 首先,基类(Base Class)是其他类的基础,它...

    安卓数据库基类

    "安卓数据库基类"通常指的是为Android应用程序创建一个基础数据库操作类,它提供了一系列通用的方法来执行CRUD(Create, Read, Update, Delete)操作,使开发者可以更加便捷地进行数据库交互。这种基类的实现通常...

Global site tag (gtag.js) - Google Analytics