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

Hibernate实现通用DAO

阅读更多
package com.myerp.dao;

import java.io.Serializable;
import java.util.LinkedHashMap;
import java.util.List;

import javax.annotation.Resource;

import org.hibernate.Query;
import org.hibernate.SessionFactory;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import com.myerp.dto.QueryResult;

public abstract class SimpleDaoSupport<T> extends HibernateDaoSupport {

	private Class<T> entityClass;
	
	protected SimpleDaoSupport(Class<T> entityClass) {
		this.entityClass = entityClass;
	}
	
	/**
	 * 将sessionFactory注入Spring的模板
	 */
	@Resource(name="sessionFactory")
	protected void setSF(SessionFactory sf) {
		setSessionFactory(sf);
	}
	
	public void save(T transientInstance) {
		getHibernateTemplate().save(transientInstance);
	}

	public void delete(T persistentInstance) {
		getHibernateTemplate().delete(persistentInstance);
	}
	
	public void delete(Serializable id) {
		getSession().delete(load(id));
		
	}

	public void update(T persistentInstance) {
		getHibernateTemplate().update(persistentInstance);
	}
	
	public void merge(T persistentInstance) {
		getHibernateTemplate().merge(persistentInstance);
	}
	
	public T findById(Serializable id) {
		return (T) getHibernateTemplate().get(entityClass.getName(), id);
	}
	public T load(Serializable id) {
		return (T) getSession().load(entityClass, id);
	}

	public List<T> findByExample(T instance) {
		return getHibernateTemplate().findByExample(instance);
	}

	public List<T> findByProperty(String propertyName, Object value) {
		String queryString = "from "+ entityClass.getSimpleName() +" as model where model." + propertyName + "= ?";
		return getHibernateTemplate().find(queryString, value);
	}

	public List<T> findAll() {
		String queryString = "from " + entityClass.getSimpleName();
		return getHibernateTemplate().find(queryString);
	}
	/**
	 * 执行HQL语句
	 */
	public void execute(String hql) {
		getSession().createQuery(hql).executeUpdate();
	}
	/**
	 * 指定过滤条件的分页数据
	 */
	public QueryResult<T> findScrollData(int start, int maxResults, List<String> whereClause){
		return this.findScrollData(start, maxResults, whereClause, null);
	}
	/**
	 * 无任何条件的分页
	 */
	public QueryResult<T> findScrollData(int pageNo, int pageSize){
		return this.findScrollData(pageNo, pageSize, null, null);
	}
	/**
	 * 有排序规则的分页数据
	 */
	public QueryResult<T> findScrollData(int pageNo, int pageSize, LinkedHashMap<String, String> orderbyClause) {
		return this.findScrollData(pageNo, pageSize, null, orderbyClause);
	}
	/**
	 * 分页查询数据
	 * @param start 开始记录
	 * @param end 结束记录
	 * @param whereClause 过滤条件
	 * @param orderbyClause 排序子句
	 * @return 查询结果, 里面包含了指定页的记录和总共的页数
	 */
	public QueryResult<T> findScrollData(int pageNo, int pageSize, List<String> whereClause, LinkedHashMap<String, String> orderbyClause) {
		int start = pageNo > 0 ?(pageNo - 1) * pageSize : 0;
		QueryResult<T> qr = new QueryResult<T>();
		Query q = getSession().createQuery("select count(*) from " + entityClass.getSimpleName() + " entity " + buildWhereClause(whereClause));
		int count = Integer.parseInt(q.uniqueResult() + "");
		if(start >= count) start = count - 1 - pageSize;
		q = getSession().createQuery("from " + entityClass.getSimpleName() + " entity " + buildWhereClause(whereClause) + buildOrderByClause(orderbyClause));
		q.setFirstResult(start).setMaxResults(pageSize);
		qr.setPageNo(pageNo).setPageSize(pageSize).setRecordCount(count).setRecords(q.list());
		return qr;
	}
	
	/**
	 * 建立排序子句
	 */
	protected String buildOrderByClause(LinkedHashMap<String, String> orderbyClause) {
		StringBuilder orderby = new StringBuilder("");
		if(orderbyClause != null && orderbyClause.size() > 0) {
			orderby.append(" order by ");
			for(String prop : orderbyClause.keySet()) {
				orderby.append(" entity.").append(prop).append(" ").append(orderbyClause.get(prop)).append(",");
			}
			orderby.deleteCharAt(orderby.length()-1);
		}
		return orderby.toString();
	}
	
	/**
	 * 根据过滤条件收集器建立where子句
	 */
	protected String buildWhereClause(List<String> whereClause) {
		StringBuilder where = new StringBuilder("");
		if(whereClause != null && whereClause.size() > 0) {
			where.append(" ").append("where ");
			for(String str : whereClause) {
				where.append(" entity.").append(str).append(" and ");
			}
			where.delete(where.lastIndexOf("and"), where.length()-1);
		}
		return where.toString();
	}
}













2
0
分享到:
评论

相关推荐

    hibernate4 通用dao,service

    标题中的“hibernate4 通用dao,service”指的是在Java开发中使用Hibernate框架实现的通用数据访问对象(DAO)和业务服务层(Service)。Hibernate是一个流行的对象关系映射(ORM)工具,它允许开发者使用面向对象的...

    Hibernate_通用DAO模式,一个写好的dao层

    本资源“Hibernate_通用DAO模式”提供了一种适用于不同类型表单的DAO实现,基于SSH(Struts2、Spring、Hibernate)框架,特别强调简洁、易懂和高可移植性。 首先,SSH框架是Java Web开发中的经典组合,Struts2负责...

    Hibernate的通用dao

    **三、Hibernate通用DAO实现** 1. **接口定义**:首先,定义一个通用的DAO接口,如`BaseDao&lt;T&gt;`,其中T代表任何数据实体类型。接口中包含增删改查(CRUD)的基本方法,如`save()`, `update()`, `delete()`, `...

    Hibernate 原生通用DAO

    **Hibernate原生通用DAO**是基于Hibernate框架设计的一种简化数据访问操作的方式,它模仿了Spring框架中的`HibernateTemplate`类,旨在提供一个简单易用的DAO(Data Access Object)层,方便开发人员进行数据库操作...

    hibernate spring通用dao

    spring集成hibernate通用dao,泛型,server都可以调用

    本人写的Hibernate超级通用DAO

    《深入浅出Hibernate通用DAO设计与实践》 在软件开发中,数据访问对象(DAO)是用于处理数据库操作的重要组件,它可以将业务逻辑与数据访问层进行解耦,提高代码的可复用性和可维护性。本文将围绕“Hibernate超级...

    HibernateDao 通用

    HibernateDao 通用HibernateDao 通用HibernateDao 通用HibernateDao 通用HibernateDao 通用HibernateDao 通用HibernateDao 通用HibernateDao 通用HibernateDao 通用HibernateDao 通用HibernateDao 通用HibernateDao ...

    Hibernate通用Dao设计。

    综上所述,Hibernate通用DAO设计的核心在于抽象出共性的数据库操作,并通过泛型和继承等面向对象设计原则,达到代码复用的目的。这样不仅可以降低开发难度,还能提升系统的可维护性,对于大型项目尤其重要。通过学习...

    基于泛型的通用Dao接口和hibernate的实现

    基于泛型的通用Dao接口和Hibernate的实现 基于泛型的通用Dao接口是指使用泛型来实现数据访问对象(DAO)的接口,主要是在使用 Hibernate 或 JPA 时使用。泛型可以使得DAO接口更灵活、更通用。 泛型Dao接口的优点:...

    Hibernate通用Dao

    通用dao,简单全面,所有dao都可以继承这个dao.

    hibernate不是泛型的通用DAo1

    "hibernate不是泛型的通用DAo1"这个标题暗示了我们讨论的是一种非泛型化的DAO实现,可能是因为开发者想要避免强制继承和泛型模板。 在描述中提到,开发者在网上寻找的大多数DAO实现都是泛型的,需要继承来使用。...

    Hibernate泛型Dao

    在传统的Hibernate使用中,针对每个实体类,我们都需要创建一个对应的Dao(Data Access Object)接口及其实现类,这无疑增加了大量重复的代码。泛型Dao的出现,就是为了解决这个问题,它允许开发者通过泛型来定义一...

    Java源代码一个简单的通用DAO实现(基于hibernate)

    Java源代码 一个简单的通用DAO实现 (基于hibernate)面向应用层按POJO类缓存hibernate的session对象.使用举例: DAO dao = DAOFactory.getDAO(POJO.class);//获得一个全局类单例的DAO实例 dao.save(pojo); 你也可以...

    hibernate通用dao

    **hibernate通用DAO(Data Access Object)**是软件开发中的一个重要概念,它主要用于数据库操作的抽象,使得业务逻辑层可以无需关注具体的SQL语句,从而实现数据访问的解耦。在Java EE应用中,Hibernate作为一款...

    Haha.Hibernate SprintSideExt 通用HibernateDAO

    Haha.Hibernate SprintSideExt 通用HibernateDAO 文章资源 详见:http://blog.csdn.net/lijun7788/article/details/6658847

    java ssh通用DAO另类实现示例

    总结:这个另类的Java SSH通用DAO实现利用了动态代理和Hibernate的特性,降低了代码复杂度,提高了代码复用性。它使得DAO层的维护变得更加简单,同时保持了良好的封装性和扩展性。在实际项目中,这样的设计可以显著...

    Struts2 Spring3 Hibernate 注解功能 DAO 泛型 通用分页

    总的来说,"SSHWithAnnotationDemo"项目展示了如何利用现代Java技术栈的高级特性,包括Struts2、Spring3和Hibernate的注解功能,DAO层的泛型设计以及通用的分页实现,来构建一个高效、可维护的Web应用。这样的实践...

    Hibernate泛型DAO接口,大部分通用都已包括

    `DaoUtil`类初始化了一个`SessionFactory`实例,并提供了一个获取`Session`的静态方法,方便在DAO实现类中使用。 总的来说,"Hibernate泛型DAO接口,大部分通用都已包括"意味着我们已经定义了一套完整的、适用于多...

    Hibernate封装dao层

    为了进一步提高代码的复用性,可以使用泛型来创建通用的DAO接口和实现。例如,`BaseDao&lt;T&gt;`,其中T代表实体类类型,这样就可以在不改变基本结构的情况下,为不同的实体类创建DAO。 6. **查询方法**: - 使用HQL...

Global site tag (gtag.js) - Google Analytics