- 浏览: 71596 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (46)
- 行业应用 (10)
- Struts1.X学习开发应用 (7)
- Struts2学习开发应用 (2)
- Hibernate学习开发应用 (8)
- Spring2.5学习开发应用 (3)
- IBatis开发与应用 (2)
- Ajax学习开发应用 (3)
- DWR学习开发应用 (2)
- JQuery学习开发应用 (2)
- Ext学习开发应用 (2)
- WebService学习开发应用 (2)
- xfire学习应用开发 (2)
- xml学习开发应用 (2)
- java基础学习 (2)
- J2EE学习开发应用 (4)
- java Awt/Swing学习开发应用 (2)
- Java Web 学习开发应用 (17)
- J2SE基础学习 (2)
- java 网络编程学习开发应用 (2)
- 设计模式 (3)
- Oracle学习 (2)
- BD2学习 (2)
- 其他数据库 (2)
- SQL学习 (2)
- 报表工具 (6)
- 工作流 (2)
最新评论
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);
}
}
发表评论
-
birt db2 查不到结果集 报错
2011-09-07 15:22 4077在Eclipse 里预览时报这个错误。就是因为没有值,rs.n ... -
birt db2 查不到结果集 报错
2011-09-07 15:20 2835根据条件没有查询到结果,就是结果集是0的情况。错误信息:The ... -
通用的DAO查询,常见方法集合
2011-07-02 22:32 1249import java.io.*;import java.sq ... -
通用的DAO查询,常见方法集合
2011-05-27 23:40 1057import java.io.*;import java.sq ... -
Java类型、Hibernate类型、标准sql类型对应表
2010-11-20 09:46 1385核心提示:Java数据类型,Hibernate数据类型,标 ... -
Hibernate 数据库操作 模板基类 GenericDao
2010-11-18 19:21 1419package com.ddhome.dao; import ... -
c3p0、dbcp、proxool、BoneCP比较
2010-11-12 01:41 17111 c3p0、dbcp、proxool、BoneCP比较 1. ...
相关推荐
MFC数据库基类模板是开发者常用的一种工具,它帮助程序员快速地创建数据库相关的类,以实现对数据库的增、删、改、查等基本操作,从而避免重复编写大量繁琐的代码。 MFC数据库支持的主要库有两个:ODBC(Open ...
C# 数据库操作基类 包括存储过程和事务处理
文件名称"MyLib.Data"可能是一个包含这个基类和其他相关数据库操作类的库或命名空间。在这个库中,可能会有针对不同数据库类型的子类,如SqlDataPool、OracleDataPool等,它们继承自基类并实现特定数据库的连接和...
c#数据操作基类如何将Sql Server 表的结构导出到Word或Excel
- **封装常见操作**:基类可能已经封装了连接数据库、执行SQL、处理Recordset等常见操作,简化子类的实现。 - **多态性**:基类可以定义虚函数,允许子类重写以满足特定需求。 - **错误处理**:基类可能包含统一...
数据库操作基类是编程中一个重要的设计模式,它通常用于封装数据库访问的通用逻辑,提供一个统一的接口供其他类使用。这样的设计可以提高代码的可重用性、可维护性和可扩展性,同时降低耦合度。在这个基类中,我们...
总的来说,"SqlHelper.cs"类作为数据库操作的基类,封装了数据库连接、命令执行、参数处理等常见任务,简化了C#应用中的数据库交互。开发者可以根据实际需求扩展此类,增加更多的功能,如事务处理、数据分页等。在...
数据库访问基类是软件开发中一个重要的设计模式,主要用于封装数据库操作,降低代码的耦合度,提高可维护性和可扩展性。在这个特定的案例中,我们有一个名为"数据库访问基类(access和MSSQL)"的基类,它支持两种常见...
本篇文章将详细探讨“C#数据库操作类”的核心概念和功能,以及如何使用它来连接和操作不同类型的数据库。 首先,标题中的"C#数据库操作类"指的是一个专门设计用于简化C#中数据库交互的自定义类。这类类通常封装了...
在本主题中,"C# 数据库连接基类 DataBas" 涉及到创建一个基础类来处理数据库连接、查询以及数据操作,如增删改查(CRUD)操作。"PageDataSource" 提到了数据分页功能,这是在显示大量数据时常用的一种优化方法。 ...
本文实例讲述了PHP基于单例模式实现的数据库操作基类。分享给大家供大家参考,具体如下: 配置文件: <?php $db = array( 'host'=>'localhost', 'user'=>'root', 'password'=>'', 'database'=>'test', ) ?&...
1、.Net数据库操作基类,支持Mysql、Sql Server、Oracle等多种数据库; 2、同一项目可以支持调用不同数据库,只需在调用前调用DataBaseOperator.Init方法; 3、采用绑定变量调用,参数通过ParamCollections对象实现...
在C#中,为了简化数据库操作,开发者通常会创建一个名为`SqlHelper`的基类,它提供了一种方便的方式来执行SQL命令,如查询、插入、更新和删除等操作。本文将深入探讨`SqlHelper`基类及其在C#中连接和操作SQL数据库的...
本教程将详细讲解如何在C#中使用基类来实现Oracle数据库的连接,以及如何进行JSON数据的处理和数据库操作。 一、Oracle数据库连接基础 在C#中连接Oracle数据库,我们需要引用Oracle提供的ODP.NET(Oracle Data ...
- `EmployeeDAL.cs`、`OrderDAL.cs`:具体的DAL实现类,实现了`DAL.cs`中定义的接口或继承的基类,实现了与数据库的交互。 理解并熟练运用这些类和架构模式,可以帮助开发者更高效地构建和维护C#应用程序。在实际...
Hibernate的核心在于提供对象-关系映射(ORM)服务,使得开发者能够以面向对象的方式来管理和操作数据库中的数据,从而减少了直接使用JDBC进行数据操作时的复杂性和错误。 为什么需要Hibernate? 在传统的JDBC编程中...
题目:设计基类点类(Point)、直接派生类圆类(Circle)、间接派生类圆柱体类(Cylinder),将求面积的函数(area)声明成虚函数,并在主函数实现虚函数调用,输出点类、圆类和圆柱体类面积。提示:其他数据成员和...
在C++编程中,类是面向对象编程的基础,它们用于封装数据和操作这些数据的方法。题目中的"基类"和"派生类"是面向对象编程中的重要概念,用于实现代码的复用和扩展。 首先,基类(Base Class)是其他类的基础,它...
"安卓数据库基类"通常指的是为Android应用程序创建一个基础数据库操作类,它提供了一系列通用的方法来执行CRUD(Create, Read, Update, Delete)操作,使开发者可以更加便捷地进行数据库交互。这种基类的实现通常...