HibernateUtil

本文介绍了一个用于简化Hibernate操作的工具类,包括如何通过线程局部模式管理Session,实现数据库查询、更新、添加及分页等功能。此外还提供了一个分页示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package com.hsp.util;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

import com.hsp.domain.Student;

/*在使用hibernate做项目时,应该保证项目中只有一个会话工厂
 只使用一个数据库只有一个sessionFactory就可以
 。一个数据库对应一个SessionFactory对象。
 */
final public class HibernateUtil {

	private static SessionFactory sf = null;

	private HibernateUtil() {
	}

	// 使用线程局部模式
	private static ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();

	static {
		sf = new Configuration().configure().buildSessionFactory();
	}

	// 获取全新的Session
	public static Session openSession() {
		return sf.openSession();
	}
//关闭sessionFactory
	public  static void SFclose(){
		sf.close();
	}
	// 获取和线程相关的Session
	public static Session getCurrentSession() {
		Session session = threadLocal.get();
		// 获取和线程相关的session
		if (session == null) {
			session = sf.openSession();
			// 把sesison对象放置到threadLocal,相当于该session已经和线程绑定。
			threadLocal.set(session);
		}
		return session;
	}

	// 提供一个统一的查询方案
	public static List executeQuery(String hql, String[] parameters) {
		Session session = null;
		Transaction tx = null;
		List list = null;
		Query query = null;
		try {
			session = HibernateUtil.getCurrentSession();
			tx = session.beginTransaction();
			query = session.createQuery(hql);
			if (parameters != null && parameters.length > 0) {
				for (int i = 0; i < parameters.length; i++) {
					query.setString(i, parameters[i]);
				}
			}
			list = query.list();
			tx.commit();
		} catch (Exception e) {
			if (tx != null) {
				tx.rollback();
			}
			e.printStackTrace();
		} finally {
			if (session != null && session.isOpen()) {
				session.close();
			}
		}
		return list;
	}

	// 提供一个统一的查询方法[带分页]
	public static List<?> executeQueryPage(String hql, String[] parameters,
			int pageSize, int pageNum) {
		Session session = null;
		Transaction tx = null;
		List list = null;
		Query query = null;
		try {
			session = HibernateUtil.getCurrentSession();
			tx = session.beginTransaction();
			query = session.createQuery(hql);
			if (parameters != null && parameters.length > 0) {
				for (int i = 0; i < parameters.length; i++) {
					query.setString(i, parameters[i]);
				}
			}
			query.setFirstResult((pageNum - 1) * pageSize).setMaxResults(
					pageSize);
			list = query.list();
			tx.commit();
		} catch (Exception e) {
			if (tx != null) {
				tx.rollback();
			}
			e.printStackTrace();
		} finally {
			if (session != null && session.isOpen()) {
				session.close();
			}
		}
		return list;
	}

	// 统一的添加方法
	public static void save(Object obj) {
		Session session = null;
		Transaction tx = null;
		List list = null;
		Query query = null;
		try {
			session = HibernateUtil.getCurrentSession();
			tx = session.beginTransaction();
			session.save(obj);
			tx.commit();
		} catch (Exception e) {
			if (tx != null) {
				tx.rollback();
			}
			e.printStackTrace();
		} finally {
			if (session != null && session.isOpen()) {
				session.close();
			}
		}
	}

	// 统一的修改删除方式    query.setString()早工具类中使用该方法而不是其他,可以避免类型转换。
	public static void exeUpdate(String hql, String[] parameters) {
		Session session = null;
		Transaction tx = null;
		List list = null;
		Query query = null;
		try {
			session = HibernateUtil.getCurrentSession();
			tx = session.beginTransaction();
			query = session.createQuery(hql);
			if (parameters != null && parameters.length > 0) {
				for (int i = 0; i < parameters.length; i++) {
					query.setString(i, parameters[i]);
				}
			}
			query.executeUpdate();
			tx.commit();
		} catch (Exception e) {
			if (tx != null) {
				tx.rollback();
			}
			e.printStackTrace();
		} finally {
			if (session != null && session.isOpen()) {
				session.close();
			}
		}
	}

	// 分页函数
	public static void showResultByPage(int pageSize) {
		// 设置分页变量
		int pageNow = 1;
		int pageCount = 1;// 计算
		int rowCount = 1;// 这个需要查询
		Session session = null;
		Transaction tx = null;
		try {
			session = HibernateUtil.getCurrentSession();
			tx = session.beginTransaction();
			// 查询出rowCount
			rowCount = Integer.valueOf(session
					.createQuery("select  count(*)  from Student ")
					.uniqueResult().toString());
			// System.out.println(rowCount);
			pageCount = (rowCount - 1) / pageSize + 1;
			// 现在我们可以循环的显示每页的信息
			for (int i = 1; i <= pageCount; i++) {
				System.out.println("**********第" + i + "页***********");
				@SuppressWarnings("unchecked")
				List<Student> list = session
						.createQuery("from Student order by sage")
						.setFirstResult((i - 1) * pageSize)
						.setMaxResults(pageSize).list();
				for (Student s : list) {
					System.out.println(s.getName());
				}
			}
			tx.commit();
		} catch (Exception e) {
			if (tx != null) {
				tx.rollback();
			}
			e.printStackTrace();
			throw new RuntimeException(e.getMessage());
		} finally {
			if (session != null && session.isConnected()) {
				session.close();
			}
		}
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值