`
seyaa
  • 浏览: 54610 次
  • 性别: 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 的编写。

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

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

    Hibernate使用技巧汇总

    HibernateTemplate对Hibernate Session操作进行了封装,而 HibernateTemplate.execute方法则是一封装机制的核心 *在spring的配置文件里,移植了整个hibernate.cfg.xml的内容。

    struts2.3.x+spring3.1.x+hibernate3.6 demo

    第二 spring3.1 不知道为什么不没有了HibernateTemplate的封装,又是一个很悲剧的事情! 谷歌百度后,说spring3.1还没有对hibernate4.1开始支持,具体情况不知道,有知道告诉我一下!呵呵 不懂! 我这里有测试的demo...

    Spring_Hibernate集成

    Hibernate Session的轻量级封装 * 默认情况下运行期异常才会回滚(包括继承了RuntimeException子类),普通异常是不会滚的 * 编写业务逻辑方法时,最好将异常一直向上抛出,在表示层(struts)处理 * 关于事务...

    ssh(structs,spring,hibernate)框架中的上传下载

     TfileDAOHibernate通过扩展Spring提供的Hibernate支持类HibernateDaoSupport而建立,HibernateDaoSupport封装了HibernateTemplate,而HibernateTemplate封装了Hibernate所提供几乎所有的的数据操作方法,如execute...

    AnyFo - Util - AnyFoDao :Spring + Hibernate整合通用的DAO层类

    本类封装了Spring提供的HibernateTemplate,从提供了对数据的各种操作,因此,本类尤其适合用Spring + Hibernate整合后进行系统开 发时使用。 AnyFoAction功能概述 AnyFoDao中的那个类,提供多个方法来对...

    Spring2.5和Hibernate3集成--学习spring aop ioc

    * HibernateTemplate是对session的轻量级的封装 * 默认事务回滚异常是RuntiimeException(包括所有继承RuntimeException的子类).普通异常不回滚 * 在编写业务逻辑方法时,最好将异常一直往上抛出,由表示层处理...

    基于SpringJDBC的轻量级ORM框架sborm.zip

    4、分表操作的支持:对于分表操作和常规的使用没有区别,只是指定分表规则,mybatis好像也可以通过制定参数实现分表处理,没搞清楚hibernate对这个是怎么处理的(hibernate好像是bean和表一对一绑定的)? ...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    在数据库处理方面,不需要在数据层借助存储过程及数据库服务器端函数封装过多的业务逻辑,因此数据库系统采用相对精巧的MySQL[6]。 该在线博客系统服务器端如果需要布置到其他主机上,则该主机必备条件如下: 1. ...

    开源框架 Spring Gossip

    JDBC 宣告式交易管理 交易的属性介绍 TransactionAttributeSource、 TransactionAttribute Hibernate 支援 Spring 整合了对 Hibernate 的设定,并提供有 HibernateTemplate 等类别,让您在结合 ...

Global site tag (gtag.js) - Google Analytics