`
什么世道
  • 浏览: 222810 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

Hibernte基于泛型DAO设计

阅读更多

既然Hibernate 实现了对JDBC的轻量级封装,增加了可移植性,那么在CRUD操作上是否也可将起封装,增加其扩展性。答案肯定是可以的。所以就有了今天的基于泛型DAO,网上有很多是在Spring 和 Hibernate 混合框架的泛型DAO,其实就是Spring 在对 Hibernate 的Session 做了一个封装,此博文是针对以Hibernate框架的泛型DAO设计。

 

由于我们通常要读取hibernate.cfg.xml,创建一个session factory,在取出一个session 对其进行CRUD操作,所以,这部分代码一般可以写在static块中,但为了模块化,我们将其中写在一个单独的类HibernateUtil(官方建议)中。

 

package com.feytuo.education.persistence;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.tool.hbm2ddl.SchemaExport;

/**
 * 获取会话HibernateUtil封装类
 * 
 * @author YangKang
 * 
 * @date 2014/04/27 
 * 
 * @version 1.0 
 * 
 * 
 */
public class HibernateUtil {

	private static SessionFactory sessionFactory = null; 
	/**
	 * 
	 * @return 获取当前会话工厂
	 */
	public static SessionFactory getSessionFactory() {
		if (null == sessionFactory) {
			CreateSessionFactory();
		}
		return sessionFactory;
	}

	/**
	 * 创建会话工厂
	 */
	private static void CreateSessionFactory() {
		// 第一步:读取Hibernate的配置文件 hibernamte.cfg.xml文件
		Configuration config = new Configuration().configure();
		// 第二步:创建服务注册构建器对象,通过配置对象中加载所有的配置信息
		StandardServiceRegistryBuilder regbulider = new StandardServiceRegistryBuilder()
				.applySettings(config.getProperties());
		// 创建注册服务
		ServiceRegistry sry = regbulider.build();
		// 第三步:创建会话工厂
		sessionFactory = config.buildSessionFactory(sry);
	}
	
	public static void createTables(){
		Configuration config = new Configuration().configure();
		new SchemaExport(config).create(false, true);
	}

	/**
	 * @return 获取当前会话对象
	 */
	public static Session getSession() {
		return getSessionFactory().getCurrentSession();
	}

	public static void sfClose() {
		getSessionFactory().close();
	} 
	
	public static void sessionClear() {
		getSession().clear();;
	}
}

 

 

 

接下来设计基于泛型DAO的接口

包括常用 的CRUD操作和分页功能。

 

package com.feytuo.education.persistence;

import java.util.List;

/**
 * 
 * 用hibernate框架HQL检索
 * 
 * 对数据库中表各个表的增删查改CRUD操作接口
 * 
 * @author YangKang
 * 
 * @param <T>
 *            泛型 ,实体类
 * @param <PK>
 *            泛型,实体类的主键类型
 * 
 * @date 2014/04/25
 * 
 * @version 1.0 
 * 
 * @revise 2014/04/30 V1.1
 * 
 */
public interface IBaseDAO<T, PK> {

	/**
	 * 保存指定实体
	 * 
	 * @param entity
	 *            实体对象
	 */
	public void save(T entity);

	/**
	 * 更新指定实体
	 * 
	 * @param entity
	 *            实体对象
	 */
	public void update(T entity);

	/**
	 * 删除指定实体
	 * 
	 * @param entity
	 *            实体对象
	 * 
	 */
	public void delete(T entity);

	public void saveOrUpdate(T entity);

	/**
	 * 删除实体
	 * 
	 * @param entityClass
	 *            实体类名
	 * @param id
	 *            实体的id
	 */
	public void deteleById(Class<T> entityClass, PK id);

	/**
	 * 更新实体 可用于添加 ,修改,删除操作
	 * 
	 * @param hql
	 *            执行的的hql语句
	 * @param params
	 *            参数,可有对象或多个对象,代替Hql中的"?"号
	 */
	public void execute(final String hql, final Object[] params);

	/**
	 * 获取所有实体集合
	 * 
	 * @param entityClass
	 *            实体类名
	 * @return 结果集合
	 */
	public List<T> query(Class<T> entityClass);

	
	/**
	 * 按HQL条件查询列表
	 * 
	 * @param entityClass
	 *            实体类名
	 * @param id
	 *            实体id
	 * @return 实体对象
	 */
	public T findById(Class<T> entityClass, PK id);

	/**
	 * 按具体属性内容查询
	 * 
	 * @param entityClass
	 * @param propertyName
	 * @param value
	 * @return
	 */
	public T findByProperty(Class<T> entityClass, String propertyName,
			Object value);

	/**
	 * 按hql条件查询列表
	 * 
	 * @param hql
	 *            查询语句 支持连接查询和多条件查询
	 * @param params
	 * @return
	 */
	public List<T> findByHql(String hql, Object[] params);

	/**
	 * 查询指定sql语句的分页数据集合
	 * 
	 * @param entityClass
	 * @param start
	 * @param limit
	 * @return
	 */
	public List<T> findByPage(Class<T> entityClass, int start, int limit);

	/**
	 * 查询指定sql语句的分页数据集合
	 * 
	 * @param hql
	 * @param params
	 * @param start
	 * @param limit
	 * @return
	 */
	public List<T> findByPage(String hql, Object[] params, int start, int limit); 
}

 

DAO类的实现。

package com.feytuo.education.persistence;

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

import org.hibernate.Query;
import org.hibernate.Session;

/**
 * Hibernate 框架<br />
 * 
 * 实体类的增删查改实现类
 * 
 * @author YangKang
 * 
 * @param <T>
 *            实体类名
 * @param <PK>
 *            实体类的主键类型
 * 
 * @date 2014/04/30 
 * 
 * @version 1.0 
 * 
 * @revise 2014/05/02 V1.1 
 */
public class BaseDAO<T, PK extends Serializable> implements
		IBaseDAO<T, PK> {

	/**
	 * 添加实体
	 */
	@Override
	public void save(T entity) {
		Session session = HibernateUtil.getSession();
		session.beginTransaction();
		session.save(entity);
		session.getTransaction().commit();
	}

	/**
	 * 更新实体
	 */
	@Override
	public void update(T entity) {
		Session session = HibernateUtil.getSession();
		session.beginTransaction();
		session.update(entity);
		session.getTransaction().commit();
	}

	/**
	 * 更新实体
	 */
	@Override
	public void saveOrUpdate(T entity) {
		Session session = HibernateUtil.getSession();
		session.beginTransaction();
		session.saveOrUpdate(entity);
		session.getTransaction().commit();
	}

	/**
	 * 删除实体
	 */
	@Override
	public void delete(T entity) {
		Session session = HibernateUtil.getSession();
		session.beginTransaction();
		session.delete(entity);
		session.getTransaction().commit();
	}

	/**
	 * 按id删除实体
	 */
	@Override
	public void deteleById(Class<T> entityClass, PK id) {
		Session session = HibernateUtil.getSession();
		session.beginTransaction();
		session.delete(findById(entityClass, id));
		session.getTransaction().commit();
	}

	/**
	 * 执行自定义的sql语句,实现其中的添加,更新,删除的方法
	 */
	@Override
	public void execute(String hql, Object[] params) {
		Session session = HibernateUtil.getSession();
		session.beginTransaction();
		Query query = session.createQuery(hql);
		if (null != params && params.length > 0) {
			for (int i = 0; i < params.length; i++) {
				query.setParameter(i, params[i]);
			}
		}
		// 执行hql语句
		query.executeUpdate();
		session.getTransaction().commit();
	}

	/**
	 * 获取所有实体
	 */
	@SuppressWarnings("unchecked")
	@Override
	public List<T> query(Class<T> entityClass) {
		Session session = HibernateUtil.getSession();
		session.beginTransaction();
		String hql = "from " + entityClass.getName();
		Query query = session.createQuery(hql);
		List<T> list = query.list();
		session.getTransaction().commit();
		return list;
	}

	@SuppressWarnings("unchecked")
	@Override
	public T findByProperty(Class<T> entityClass, String propertyName,
			Object value) {
		String hql = "from " + entityClass.getName() + " as model where model."
				+ propertyName + "=?";
		Session session = HibernateUtil.getSession();
		session.beginTransaction();
		Query query = session.createQuery(hql);
		query.setParameter(0, value);
		List<T> list = query.list();
		session.getTransaction().commit();
		if (null != list) {
			return list.get(0);
		} else {
			return null;
		}
	}

	/**
	 * 按实体名和id获取实体
	 * 
	 * @param entityClass
	 * @param id
	 * @return
	 */
	@SuppressWarnings("unchecked")
	@Override
	public T findById(Class<T> entityClass, PK id) {
		Session session = HibernateUtil.getSession();
		session.beginTransaction();
		T entity = (T) session.get(entityClass, id);
		session.getTransaction().commit();
		return entity;
	}

	/**
	 * 按自定义的hql取得结果集
	 */
	@Override
	@SuppressWarnings("unchecked")
	public List<T> findByHql(String hql, Object[] params) {
		Session session = HibernateUtil.getSession();
		session.beginTransaction();
		Query query = session.createQuery(hql);

		if (null != params && params.length > 0) {
			for (int i = 0; i < params.length; i++) {
				query.setParameter(i, params[i]);
			}
		}

		List<T> list = query.list();
		session.getTransaction().commit();

		return list;
	}

	/**
	 * 分页使用
	 * 
	 * @param entityClass
	 * @param start
	 * @param limit
	 * @return
	 */
	@SuppressWarnings("unchecked")
	@Override
	public List<T> findByPage(String hql, Object[] params, int start, int limit) {
		Session session = HibernateUtil.getSession();
		session.beginTransaction();
		List<T> list = null;
		try {
			Query query = session.createQuery(hql);
			if (params != null && params.length != 0) {
				for (int i = 0; i < params.length; i++) {
					query.setParameter(i, params[i]);
				}
			}

			if (limit != 0) {
				query.setFirstResult(start).setMaxResults(limit);
			}
			list = query.list();
			session.getTransaction().commit();
		} catch (Exception ef) {
			ef.printStackTrace();
			session.getTransaction().rollback();
		}

		return list;
	}

	/**
	 * 分页使用
	 * 
	 * @param entityClass
	 * @param start
	 * @param limit
	 * @return
	 */
	@SuppressWarnings("unchecked")
	@Override
	public List<T> findByPage(Class<T> entityClass, int start, int limit) {
		Session session = HibernateUtil.getSession();
		String hql = "select from o " + entityClass.getName() + " o";
		session.beginTransaction();
		Query query = session.createQuery(hql);
		query.setFirstResult(start).setMaxResults(limit);
		List<T> list = query.list();
		session.getTransaction().commit();
		return list;
	} 
}

 我在HibernateUtil 获取Session的方法是getCurrentSession(),所以在DAO实现类里是无需close session的,若使用的是openSession(),则实现类必须要close session。至于为什么要close,这和文件一样,你懂得。

在此Hibernate 基于泛型DAO类设计完成,如还有其他的需求,可在接口中扩展。

 

 

 

4
1
分享到:
评论
3 楼 zyz251314 2014-05-29  
这个springsize3里面早就有了啊
1 楼 当时我就震惊了 2014-05-29  
https://github.com/neesonqk/HibernateDao.git

相关推荐

    Hibernate泛型Dao

    【标题】"Hibernate泛型Dao"是针对Java开发中的数据持久化框架Hibernate的一个高级应用,主要目的是为了提高代码的复用性和简洁性。在传统的Hibernate使用中,针对每个实体类,我们都需要创建一个对应的Dao(Data ...

    基于hibernate的泛型Dao框架

    标题中的“基于Hibernate的泛型Dao框架”是指在Java开发中使用Hibernate ORM工具,并结合泛型设计模式构建的数据库访问对象(DAO)框架。这样的框架旨在提高代码复用性,减少重复工作,使得数据访问层的实现更加简洁...

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

    Hibernate 对泛型Dao接口的实现主要通过继承泛型Dao接口,使用 Hibernate 的 Session 对象来实现数据访问。 Hibernate 对泛型Dao接口的实现的优点: 1. 简化数据访问:Hibernate 对泛型Dao接口的实现可以简化数据...

    泛型dao 泛型dao 泛型dao

    Struts2、Hibernate、Spring整合的泛型DAO (本人评价: 代码开发效率提高30% 代码出错率减少70%) 对于大多数开发人员,系统中的每个 DAO 编写几乎相同的代码到目前为止已经成为一种习惯。虽然所有人都将这种重复...

    Hibernate泛型DAO(结合spring模板支持)

    至于`Dao经典泛型.doc`文件,可能是更深入的关于Hibernate泛型DAO的文档,可能包含了如何配置Spring、如何处理复杂查询以及如何优化泛型DAO的更多细节。阅读这份文档将进一步提升你对泛型DAO的理解和应用能力。 ...

    经典泛型dao层代码,非常好用简易

    本文将深入探讨一种在SSH(Struts+Spring+Hibernate)框架中广泛应用的经典泛型DAO层实现方式,旨在展示其简洁性、高效性和灵活性。 #### 泛型DAO层:概念与优势 泛型DAO层通过利用Java的泛型机制,提供了一种类型...

    大家看看我设计的泛型DAO(使用Spring的Anotation和Hibernate)

    本篇文章将深入探讨一个使用Spring注解和Hibernate实现的泛型DAO设计,以提高代码的复用性和可维护性。 首先,`HibernateBaseDao.java`是基础的Hibernate DAO类,它提供了对Hibernate操作的基本封装。这个类通常会...

    spring hibernate 泛型DAO

    本文将深入探讨“Spring Hibernate 泛型DAO”这一主题,以及如何通过泛型DAO实现更加高效、可复用的代码。 首先,让我们理解什么是DAO(Data Access Object)模式。DAO是一种设计模式,它的主要作用是隔离业务逻辑...

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

    本篇将详细介绍"Hibernate泛型DAO接口,大部分通用都已包括"这一主题。 首先,让我们看看DAO的概念。DAO是软件设计模式中的一种,它的主要职责是封装对数据源的访问,以提供业务逻辑层与数据存储层之间的解耦。通过...

    Hibernate泛型DAO及使用方法.doc

    而泛型DAO(Data Access Object)则是基于Hibernate进一步抽象出来的一个设计模式,用于提供更通用的数据操作方法。本文档主要探讨了如何在Spring+Hibernate环境中创建和使用泛型DAO。 首先,我们来看一下泛型DAO...

    hibernate不是泛型的通用DAo1

    例如,一个泛型DAO接口可能定义如下: ```java public interface GenericDao&lt;T&gt; { void save(T entity); T get(Long id); void update(T entity); void delete(T entity); } ``` 然后,对于一个名为`User`的实体...

    Hibernate泛型DAO及使用方法

    而`Hibernate泛型DAO`则是为了减少代码重复性,提高代码复用性和可维护性的一种设计模式。本文将深入探讨`Hibernate泛型DAO`的实现及其使用方法。 首先,DAO(Data Access Object)模式是一种设计模式,它的主要...

    泛型dao

    这尤其适用于那些基于ORM(对象关系映射)框架,如Hibernate或MyBatis的项目,它们提供了与数据库交互的基础设施,我们可以直接在泛型DAO上构建。 在实际应用中,我们可能还需要考虑一些额外的细节,如事务管理、...

    一个很好的通用泛型dao(含源码)

    而泛型DAO是一个类型安全的,代码精简的设计模式(相对于传统DAO),尤其在DAO组件数量庞大的时候,代码量的减少更加明显。 泛型DAO的核心是定义一个GenericDao接口,声明基本的CRUD操作: 用hibernate作为持久化...

    Struts2+hibernate+spring整合泛型DAO

    总结来说,"Struts2+hibernate+spring整合泛型DAO"是一种常见的Java Web开发模式,它利用三大框架的优势,结合泛型设计,提高了代码复用,降低了维护成本,使得开发者能更专注于业务逻辑,而不是基础架构。

    Hibernate泛型DAO及使用方法借鉴.pdf

    《Hibernate泛型DAO及使用方法借鉴》 在Java开发中,特别是使用Spring+Hibernate框架时,泛型DAO(Data Access Object)是常见的设计模式,它提供了对数据库操作的一般化接口,以提高代码的重用性和可维护性。本文...

    S2SH整合例子 注解配置 JSON 泛型Dao

    6. **泛型Dao**:在Java开发中,泛型Dao(Generic Dao)是一种设计模式,用于减少重复的数据库操作代码。通过定义一个通用的Dao接口,可以实现对不同类型的实体对象进行CRUD操作,提高了代码的复用性和可维护性。...

    泛型DAO,注释详细

    接下来,我们可以使用Hibernate或MyBatis等持久层框架实现这个泛型DAO。以Hibernate为例,一个简单的实现可能如下: ```java public class HibernateGenericDAO, ID extends Serializable&gt; implements GenericDAO, ...

    一个简单的Hibernate泛型Dao的实现 ---- 20160624

    本文将深入探讨如何实现一个简单的Hibernate泛型DAO(数据访问对象),以提高代码的可重用性和可维护性。 首先,我们来看`AbstractHibernateGenericDao`类,这是一个抽象类,它通常会包含一些基本的CRUD(创建、...

Global site tag (gtag.js) - Google Analytics