`
seyaa
  • 浏览: 55609 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

对hibernate的封装 HibernateTemplate

阅读更多
使用hibernate也有很久一段时间了,做了点简单的封装:
package org.jutil.hibernate.base;

import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.Transaction;

public abstract  class HibernateTemplate<T extends Object> {
	
	private static HibernateUtil util = HibernateUtil.getInstance();

	/**
	 * 获得接口中泛型的实例
	 * 
	 * @param index
	 * @return
	 */
	@SuppressWarnings("unchecked")
	private Class getGenericType(int index) {
		Type genType = getClass().getGenericSuperclass();
		if (!(genType instanceof ParameterizedType)) {
			return Object.class;
		}
		Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
		if (index >= params.length || index < 0) {
			throw new RuntimeException("Index outof bounds");
		}
		if (!(params[index] instanceof Class)) {
			return Object.class;
		}
		return (Class) params[index];
	}
	
	/**
	 * 保存对象
	 * @param entity
	 */
	public void save(Object entity) {
		Session s = null;
		Transaction tx = null;
		try {
			s = util.getSession();
			tx = s.beginTransaction();
			s.save(entity);
			tx.commit();
		} finally {
			if (s != null)
				util.closeSession(s);
		}
	}

	/**
	 * 删除对象
	 * @param entity
	 */
	public boolean delete(Object entity) {
		Session s = null;
		Transaction tx = null;
		try {
			s = util.getSession();
			tx = s.beginTransaction();
			s.delete(entity);
			tx.commit();
			return true;
		}catch (Exception e) {
			return false;
		} finally {
			if (s != null)
				util.closeSession(s);
		}
	}

	/**
	 * 删除对象
	 * @param entityName
	 * @param object
	 * @return
	 */
	public boolean delete(String entityName, Object object) {
		Session s = null;
		Transaction tx = null;
		try {
			s = util.getSession();
			tx = s.beginTransaction();
			s.delete(entityName, object);
			tx.commit();return true;
		}catch (Exception e) {
			return false;
		} finally {
			if (s != null) {
				util.closeSession(s);
			}
		}
	}
	
	/**
	 * 更新对象
	 * @param entity
	 */
	public void update(Object entity) {
		Session s = null;
		Transaction tx = null;
		try {
			s = util.getSession();
			tx = s.beginTransaction();
			s.update(entity);
			tx.commit();
		} finally {
			if (s != null)
				util.closeSession(s);
		}
	}

	/**
	 * get 方式获得对象
	 * @param id 在hibernate中作为主键的值
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public T get(Serializable id) {
		Class clazz = getGenericType(0);
		Session s = null;
		try {
			s = util.getSession();
			Object obj = s.get(clazz, id);
			return (T) obj;
		} finally {
			if (s != null)
				util.closeSession(s);
		}
	}
	
	/**
	 * get 方式获得对象
	 * @param id 在hibernate中作为主键的值
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public T get(Class clazz ,Serializable id) {
		Session s = null;
		try {
			s = util.getSession();
			Object obj = s.get(clazz, id);
			return (T) obj;
		} finally {
			if (s != null)
				util.closeSession(s);
		}
	}
	
	/**
	 * get 方式获得对象
	 * @param id 在hibernate中作为主键的值
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public T get(String entityName,Serializable id) {
		Session s = null;
		try {
			s = util.getSession();
			Object obj = s.get(entityName, id);
			return (T) obj;
		} finally {
			if (s != null)
				util.closeSession(s);
		}
	}
	
	/**
	 * load 方式获得对象
	 * @param id 在hibernate中作为主键的值
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public T load(Serializable id) {
		Class clazz = getGenericType(0);
		Session s = null;
		try {
			s = util.getSession();
			Object obj = s.load(clazz, id);
			return (T) obj;
		} finally {
			if (s != null)
				util.closeSession(s);
		}
	}
	
	/**
	 * load 方式获得对象
	 * @param clazz 
	 * @param id 在hibernate中作为主键的值
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public T load(Class clazz ,Serializable id) {
		Session s = null;
		try {
			s = util.getSession();
			Object obj = s.load(clazz, id);
			return (T) obj;
		} finally {
			if (s != null)
				util.closeSession(s);
		}
	}
	
	/**
	 * load 方式获得对象
	 * @param entityName 实体类全名称
	 * @param id 在hibernate中作为主键的值
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public T load(String entityName,Serializable id) {
		Session s = null;
		try {
			s = util.getSession();
			Object obj = s.load(entityName, id);
			return (T) obj;
		} finally {
			if (s != null)
				util.closeSession(s);
		}
	}

	/**
	 * 根据(HQL: Hibernate查询语言)得到唯一对象,语句查询结果必须只有一条结果,否则抛出异常
	 * @param sql 查询语句
	 * @return T
	 */
	@SuppressWarnings("unchecked")
	public T uniqueResult(String sql){
		sqlValidate(sql);
		Query query = util.getSession().createQuery(sql);
		return (T) query.uniqueResult();
	}
	
	/**
	 * 根据(数据库的Native SQL语言)得到唯一对象,语句查询结果必须只有一条结果,否则抛出异常
	 * @param sql 查询语句
	 * @return Object[] 封装后的结果
	 */
	public Object[] uniqueResultSQL(String sql){
		sqlValidate(sql);
		SQLQuery query = util.getSession().createSQLQuery(sql);
		return  (Object[]) query.uniqueResult();
	}
	
	/**
	 * 根据(HQL: Hibernate查询语言)查询所有符合条件的记录,并将结果封装到List<T> 中
	 * @param sql 查询语句
	 * @param args 参数
	 * @return List<T> 
	 */
	@SuppressWarnings("unchecked")
	public List<T> findByQuery(String sql, Object... args) {
		try {
			sqlValidate(sql);
			Query query = util.getSession().createQuery(sql);
			for (int i = 0; i < args.length; i++) {
				query.setParameter(i, args[i]);
			}
			return query.list();
		} catch (Exception e) {
			throw new HibernateException(e.getMessage());
		}
	}

	/**
	 * 根据(Native SQL查询语言)查询所有符合条件的记录List
	 * @param sql 查询语句
	 * @param args 参数
	 * @return List 
	 */
	@SuppressWarnings("unchecked")
	public List findBySQLQuery(String sql,Object ... args) {
		try {
			sqlValidate(sql);
			SQLQuery query = util.getSession().createSQLQuery(sql);
			for (int i = 0; i < args.length; i++) {
				query.setParameter(i, args[i]);
			}
			return query.list();
		} catch (Exception e) {
			throw new HibernateException(e.getMessage());
		}
	}
	
	/**
	 *根据(Native SQL查询语言)查询所有符合条件的记录,并将结果封装到List<Object[]> 中
	 * @param sql 查询语句
	 * @param args 参数
	 * @return List<Object[]> 封装后的结果
	 */
	@SuppressWarnings("unchecked")
	public List<Object[]> findBySQLQueryToList(String sql,Object ... args) {
		try {
			sqlValidate(sql);
			List<Object[]> result = new ArrayList<Object[]>(0);
			Object[] temp = null;
			SQLQuery query = util.getSession().createSQLQuery(sql);
			for (int i = 0; i < args.length; i++) {
				query.setParameter(i, args[i]);
			}
			List r = query.list();
			Iterator ite =  r.iterator();
			while(ite.hasNext()){
				temp =  (Object[]) ite.next();
				System.out.println(temp[0]+":"+temp[1]+":"+temp[2]);
				result.add(temp);
			}
			return result;
		} catch (Exception e) {
			throw new HibernateException(e.getMessage());
		}
	}

	/**
	 * 得到符合条件的总记录数
	 * @param query
	 * @return Integer
	 */
	@SuppressWarnings("unchecked")
	private Integer getTotalSize(Query query){
		List temp = query.list();
		Integer totalSize = temp.size();
		temp.clear();
		temp = null;
		return totalSize;
	}
	
	/**
	 * 根据(HQL: Hibernate查询语言)查询所有符合条件的记录,封装到Page对象中,page 中list 泛型为 T
	 * @param sql 查询语句
	 * @param pageNo 页码
	 * @param pageSize 每页大小
	 * @param args 参数
	 * @return Page 封装着分页查询结果对象和一些信息的对象
	 */
	@SuppressWarnings("unchecked")
	public Page pageQueryByPageNO(String sql,Integer pageNo,Integer pageSize,Object ...args) {
		try {
			sqlValidate(sql);
			Query query = util.getSession().createQuery(sql);
			for(int i=0;i<args.length;i++){
				query.setParameter(i, args[i]);
			}
			Integer totalSize = getTotalSize(query);
			Integer start = (pageNo-1)*pageSize;
			query.setFirstResult(start);
			query.setMaxResults(pageNo*pageSize);
			List<T> data = query.list();
			return new Page<T>(start, totalSize,pageSize, data);
		} catch (Exception e) {
			throw new HibernateException(e.getMessage());
		}
	}
	
	/**
	 * 根据(Native SQL查询语言)查询所有符合条件的记录,封装到Page对象中,page 中list 泛型为 OBject[]
	 * @param sql 查询语句
	 * @param pageNo 页码
	 * @param pageSize 每页大小
	 * @param args 参数
	 * @return Page 封装着分页查询结果对象和一些信息的对象
	 */
	@SuppressWarnings("unchecked")
	public Page pageSQLQueryByPageNO(String sql,Integer pageNo,Integer pageSize,Object ...args) {
		try {
			sqlValidate(sql);
			List<Object[]> result = new ArrayList<Object[]>(0);
			Object[] temp = null;
			SQLQuery query = util.getSession().createSQLQuery(sql);
			for (int i = 0; i < args.length; i++) {
				query.setParameter(i, args[i]);
			}
			Integer totalSize = getTotalSize(query);
			Integer start = (pageNo-1)*pageSize;
			query.setFirstResult(start);
			query.setMaxResults(pageNo*pageSize);
			List r = query.list();
			Iterator ite =  r.iterator();
			while(ite.hasNext()){
				temp =  (Object[]) ite.next();
				result.add(temp);
			}
			return new Page<Object[]>(start,totalSize,pageSize, result);
		} catch (Exception e) {
			throw new HibernateException(e.getMessage());
		}
	}

	/**
	 * 验证sql不为null||''
	 * @param sql
	 */
	private void sqlValidate(String sql) {
		if (sql == null || sql.trim().length() < 0) {
			throw new RuntimeException("sql sentence is null or is '' ");
		}
	}
	
}



HibernateUtil

package org.jutil.hibernate.base;

import java.io.File;
import java.io.InputStream;
import java.io.Serializable;
import java.net.URL;
import java.util.Properties;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.w3c.dom.Document;

@SuppressWarnings("serial")
public class HibernateUtil implements Serializable {

	private static SessionFactory factory = null;
	private static HibernateUtil util = null;
	
	public static HibernateUtil getInstance(){
		if(util == null){
			util = new HibernateUtil();
		}
		return util;
	}
	
	private HibernateUtil(){
		try {
			Configuration cfg = new Configuration().configure();
			factory = cfg.buildSessionFactory();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public static HibernateUtil getInstance(String resource,String ...files){
		if(util == null){
			util = new HibernateUtil(resource,files);
		}
		return util;
	}
	
	private HibernateUtil(String resource,String ...files){
		try {
			Configuration cfg = new Configuration();
			if(files.length>0){
				for(String f:files){
					cfg.addFile(f);
				}
			}
			factory = cfg.configure(resource).buildSessionFactory();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public static HibernateUtil getInstance(File configFile,File ...files){
		if(util == null){
			util = new HibernateUtil(configFile,files);
		}
		return util;
	}
	
	private HibernateUtil(File configFile,File ...files){
		try {
			Configuration cfg = new Configuration();
			if(files.length>0){
				for(File f:files){
					cfg.addFile(f);
				}
			}
			factory = cfg.configure(configFile).buildSessionFactory();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public static HibernateUtil getInstance(URL url,URL ...urls){
		if(util == null){
			util = new HibernateUtil(url,urls);
		}
		return util;
	}
	
	private HibernateUtil(URL url,URL ...urls){
		try {
			Configuration cfg = new Configuration();
			for(URL u :urls){
				cfg.addURL(u);
			}
			factory = cfg.configure(url).buildSessionFactory();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public static HibernateUtil getInstance(Document document,Document ...docs){
		if(util == null){
			util = new HibernateUtil(document,docs);
		}
		return util;
	}
	
	private HibernateUtil(Document document,Document ...docs){
		try {
			Configuration cfg = new Configuration();
			for(Document doc :docs){
				cfg.addDocument(doc);
			}
			factory = cfg.configure(document).buildSessionFactory();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public static HibernateUtil getInstance(InputStream inputStream,InputStream ...inputStreams){
		if(util == null){
			util = new HibernateUtil(inputStream,inputStreams);
		}
		return util;
	}
	
	private HibernateUtil(InputStream inputStream,InputStream ...inputStreams){
		try {
			Configuration cfg = new Configuration();
			cfg.addInputStream(inputStream);
			for(InputStream input :inputStreams){
				cfg.addInputStream(input);
			}
			factory = cfg.configure().buildSessionFactory();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public static HibernateUtil getInstance(Properties  extraProperties,Properties ...properties){
		if(util == null){
			util = new HibernateUtil(extraProperties,properties);
		}
		return util;
	}
	
	private HibernateUtil(Properties  extraProperties,Properties ...properties){
		try {
			Configuration cfg = new Configuration();
			cfg.addProperties(extraProperties);
			for(Properties  propertie :properties){
				cfg.addProperties(propertie);
			}
			factory = cfg.configure().buildSessionFactory();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	@SuppressWarnings("unchecked")
	public static HibernateUtil getInstance(Class persistentClass,Class ...classes){
		if(util == null){
			util = new HibernateUtil(persistentClass,classes);
		}
		return util;
	}
	
	@SuppressWarnings("unchecked")
	private HibernateUtil(Class persistentClass,Class ...classes){
		try {
			Configuration cfg = new Configuration();
			cfg.addClass(persistentClass);
			for(Class  clss :classes){
				cfg.addClass(clss);
			}
			factory = cfg.configure().buildSessionFactory();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public SessionFactory getSessionFactory() {
		return factory;
	}

	public Session getSession() {
		return factory.openSession();
	}

	public void closeSession(Session session) {
		if (session != null) {
			if (session.isOpen()) {
				session.close();
			}
		}
	}
	
}



用于分页的Page对象

package org.jutil.hibernate.base;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class Page<T> {

	private static final long serialVersionUID = 2728437513842150372L;
	private static final int DEFAULT_PAGE_SIZE = 10;
	private int start;
	private List<T> data;
	private long totalCount;
	private int pageSize = DEFAULT_PAGE_SIZE;

	public Page() {
		this(0, 0L, Page.DEFAULT_PAGE_SIZE, ((List<T>) (new ArrayList<T>())));
	}

	public Page(int pageSize) {
		this(0, 0L, pageSize, ((List<T>) (new ArrayList<T>())));
	}

	public Page(int start, long totalSize, int pageSize, List<T> data) {
		if (pageSize <= 0 || start < 0 || totalSize < 0L) {

		} else {
			this.pageSize = pageSize;
			this.start = start;
			totalCount = totalSize;
			this.data = data;
			return;
		}
	}

	public long getTotalCount() {
		return totalCount;
	}

	public long getTotalPageCount() {
		return totalCount % (long) pageSize != 0L ? totalCount/ (long) pageSize + 1L: totalCount/ (long) pageSize;
	}

	public void setResult(List<T> data) {
		this.data = data;
	}

	public List<T> getResult() {
		return data;
	}

	public int getCurrentPageNo() {
		return start / pageSize + 1;
	}

	public boolean hasNextPage() {
		return (long) getCurrentPageNo() < getTotalPageCount();
	}

	public boolean hasPreviousPage() {
		return getCurrentPageNo() > 1;
	}

	public boolean isEmpty() {
		return data == null || data.isEmpty();
	}

	public int getStartIndex() {
		return (getCurrentPageNo() - 1) * pageSize;
	}

	public int getEndIndex() {
		int endIndex = getCurrentPageNo() * pageSize - 1;
		return (long) endIndex < totalCount ? endIndex : (int) totalCount - 1;
	}

	protected static int getStartOfPage(int pageNo) {
		return getStartOfPage(pageNo, 20);
	}

	public static int getStartOfPage(int pageNo, int pageSize) {
		return (pageNo - 1) * pageSize;
	}
	
	public int getPageSize() {
		return pageSize;
	}

	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}
	
}



最后再附上所有的源码 和测试代码及配置文件。
0
2
分享到:
评论

相关推荐

    简单封装 HibernateTemplate 各项功能

    GenericHibernateDao 继承 HibernateDao,简单封装 HibernateTemplate 各项功能,简化基于Hibernate Dao 的编写。

    Spring_2000_Spring_Hibernate_HibernateTemplate

    Spring的主要特性包括依赖注入(DI)、面向切面编程(AOP)、容器管理的bean以及对其他框架的集成,比如与Hibernate的整合。 **依赖注入(DI)** Spring的核心之一是依赖注入,它允许对象在运行时通过容器获得所需...

    Spring_Spring_Hibernate_HibernateTemplate

    本篇将深入探讨Spring与Hibernate的集成,特别是Spring提供的HibernateTemplate,它是Spring对Hibernate的一种封装,简化了数据库操作。我们将围绕以下几点进行详细讲解: 1. **Spring框架基础**: Spring是一个...

    hibernate模拟hibernatetemplate

    HibernateTemplate是Spring对Hibernate的一层封装,提供了事务管理、异常转换等服务。它的主要优点在于提供了一种简洁的API,使得开发人员不必直接处理Hibernate的Session,降低了出错的可能性。 **二、模拟...

    HibernateTemplate的方法使用

    **HibernateTemplate** 是 Spring 框架中用于简化 Hibernate 使用的一个工具类。它通过 AOP(面向切面编程)的思想,封装了大量的 CRUD(创建、读取、更新、删除)操作,使得开发者能够更加专注于业务逻辑的实现,而...

    Spring整合hibernate(2)之基于HibernateTemplate的整合

    Spring和Hibernate的整合可以简化Java应用的开发,通过Spring对Hibernate的封装,开发者无需直接操作SessionFactory和Session,而是使用更简洁、易用的API,同时还能享受到Spring的事务管理能力,提高代码的可维护性...

    关于使用HibernateTemplate

    而`HibernateTemplate`作为Spring框架对Hibernate的一种封装,更是进一步降低了开发难度,提高了开发效率。 #### 二、核心价值:专注业务逻辑 `HibernateTemplate`的主要价值在于让开发者能够将更多的精力聚焦于...

    HibernateTemplate的用法总结

    本文将对HibernateTemplate的主要用法进行详细介绍。 #### 二、核心方法解析 在HibernateTemplate中,提供了多种常用的方法来实现数据访问操作(CRUD): 1. **`void delete(Object entity)`**:用于删除一个指定...

    hibernateTemplate

    `HibernateTemplate`是Spring框架提供的一个工具类,用于简化Hibernate的使用。它封装了许多常见的数据库操作,如增删改查等,同时支持分页查询以及命名查询等功能。使用`HibernateTemplate`可以减少大量模板代码的...

    第24次课-1 Spring与Hibernate的整合

    HibernateTemplate类封装了Hibernate的主要类,它提供了很多方便的操作数据的方法。 24.3 Spring对Hibernate的简化 24.3.3 HibernateTemplate概述 HibernateTemplate可将Hibernate的持久层访问模板化。创建...

    基于HIbernateTemplate的代码自动生成

    `HibernateTemplate`是Spring框架对Hibernate ORM(对象关系映射)的一种封装,它简化了与数据库交互的复杂性,而"基于HibernateTemplate的代码自动生成"正是为了进一步提升开发效率而设计的一种技术手段。...

    S2SH购物车+HibernateTemplate分页

    HibernateTemplate是Spring对Hibernate的封装,提供了一套简便的API,用于执行HQL(Hibernate Query Language)查询和CRUD(Create、Read、Update、Delete)操作。 【持久层分页】 在S2SH购物车项目中,持久层的...

    一个模拟Spring将SessionFactory注入到HibernateTemplate的小例子

    2. HibernateTemplate:这是Spring提供的一个辅助类,它封装了SessionFactory的一些常用操作,如保存、更新、删除和查询等。使用HibernateTemplate可以简化代码,避免直接与Session对象打交道,减少出错的可能性。 ...

    Spring对Hibernate及JDBC提供的支持

    Spring提供了HibernateTemplate和HibernateInterceptor等工具类,简化了事务管理,并且通过AOP(面向切面编程)实现了声明式事务,使得事务处理更加透明化。此外,Spring还允许我们方便地进行数据源配置,以及自动...

    spring整合Hibernate学习笔记.docx

    2. **使用 HibernateTemplate**: Spring 为 Hibernate 提供了一个抽象层,即 HibernateTemplate 类,它封装了 Session 的常用操作,如保存、更新、删除和查询等,同时处理了事务管理和异常转换。在 Spring 容器中...

    Spring+Hibernate实现增删改查的两种方法

    HibernateTemplate是Spring提供的一个方便的类,它简化了与Hibernate的交互,通过预定义的方法封装了常见的Hibernate操作。使用HibernateTemplate时,你需要继承Spring的HibernateDaoSupport类,并注入...

    Spring与Hibernate集成

    通过Spring对Hibernate的管理,我们可以更好地控制事务、实现解耦,同时降低出错的可能性。此外,Spring的AOP支持使得事务管理更加简单,提高了代码的可测试性。在实际项目中,这种集成方式被广泛应用,是Java EE...

    HibernateTemplate类的使用

    它封装了许多Hibernate的核心API,使得开发者无需关注Hibernate底层细节就能进行数据库操作。此外,`HibernateTemplate`还提供了自动的资源管理和异常转换功能,大大减少了开发过程中的复杂度。 #### 三、使用...

    spring-orm-hibernate4源码

    HibernateTemplate封装了常见的Hibernate操作,如查询、保存、更新和删除。HibernateDaoSupport则提供了一个抽象基类,包含HibernateTemplate实例,方便DAO层的开发。 5. **事务管理**: Spring支持编程式和声明式...

Global site tag (gtag.js) - Google Analytics