Hibenate工具类(实现增/删/改/查)

自己学习的时候,顺手写的。主要为了减少重复操作!感觉还是可以的!

package com.hr.utils;

import java.util.List;

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

public class HibenateUtil {
	// 获取配置文件
	private static Configuration cfg;

	private static ThreadLocal<Session> tl = new ThreadLocal<Session>();

	// Session工厂
	private static SessionFactory factory;
	static {
		// 读取配置文件信息
		cfg = new Configuration().configure();
		// 构建会话工厂,根据会话工厂创建session
		factory = cfg.buildSessionFactory();
	}

	// 获得Session
	public static Session getSession() {
		// 返回一个根据会话工厂创建的session
		Session session = tl.get();
		if (session == null) {
			session = factory.openSession();
			tl.set(session);
		}
		return session;
	}

	// 关闭session
	public static void close(Session session) {
		session = tl.get();
		// 在session值不等于空且session值存在的情况下,关闭session
		if (session != null && session.isOpen()) {
			session.close();
			tl.set(null);
		}
	}

	/**
	 * 插入数据方法
	 */
	public static void insert(Object obj) {
		// 1.获得session工厂
		Session session = getSession();
		// 2.插入数据
		session.save(obj);
		// 3.开始并执行操作
		session.beginTransaction().commit();
		// 4.关闭session工厂
		close(session);
	}

	/**
	 * 更新数据的方法
	 */
	public static void update(Object obj) {
		// 1.获得session工厂
		Session session = getSession();
		// 2.更新数据
		session.update(obj);
		// 3.开始并执行操作
		session.beginTransaction().commit();
		// 4.关闭session工厂
		close(session);
	}

	/**
	 * 删除数据的方法
	 */
	public static void delete(Object obj) {
		// 1.获得session工厂
		Session session = getSession();
		// 2.删除数据
		session.delete(obj);
		// 3.开始并执行操作
		session.beginTransaction().commit();
		// 4.关闭session工厂
		close(session);
	}

	/**
	 * 查询(列表的形式)
	 * select t from " + sql1 + " t " + sql2 + " "
	 */
	public static List selectList(String sql1, String sql2) {
		Session session = getSession();
		String hql = null;

		// 1)需要查询的条件是uid等于5
		// 2)数据对象为User类里面的属性
		// 3)t代表User对象的所有属性
		if (sql1 != null && sql2 != null) {
			hql = "select t from " + sql1 + " t " + sql2 + " ";
		} else {
			hql = "select t from " + sql1 + " t";
		}
		Query query = session.createQuery(hql);
		List<Object> obj = query.list();
		close(session);
		return obj;
	}

	/**
	 * 查询(对象的形式,只查询指定ID)
	 */

	public static Object selectOnly(Class<?> name, int uid) {
		Session session = getSession();
		Object obj = (Object) session.get(name, uid);
		close(session);
		return obj;
	}

	/**
	 * 分页查询
	 */
	public static List PageList(String task, int page, int currsize) {
		Session session = getSession();
		Query query = session.createQuery("from " + task);
		query.setCacheable(true);
		query.setFirstResult((page - 1) * currsize);
		query.setMaxResults(currsize);
		List object = query.list();
		close(session);
		return object;
	}

	// ------------------------------------------------------------
	/**
	 * 比较合适于有多个条件,也就是where 这种,但只能填两个key值
	 */
	public static Object selectOne(String sql, String value1, String key1,
			String value2, String key2) {
		try {
			// 获得session对象
			Session session = getSession();
			// 创建sql执行
			Query query = session.createQuery(sql);
			// 把值加入
			query.setParameter(value1, key1);
			query.setParameter(value2, key2);
			// 用LIST存储数据
			List object = query.list();
			// obj存放的是头一条数据,由于目标是列表,所以进行转换
			Object obj = object.get(0);
			// 关闭session
			close(session);
			if (obj != null) {
				// 在obj不等于null的情况下,
				// 也就是查到数据的情况下。
				// 返回数据
				return obj;
			}
		} catch (Exception e) {

		}
		// 否则返回null
		return null;
	}

	/**
	 * 查询制定列表的记录总数。 用的是对象,而不是表名称。 也就是User/System这些.
	 */
	public static int selectCount(String db) {
		Session session = getSession();
		List<Integer> objlist = session.createQuery(
				"select count(*) from " + db).list();
		int obj = objlist.get(0);
		close(session);
		return obj;
	}
}

 

posted @ 2013-02-26 17:51  墨迹哥's  阅读(364)  评论(0编辑  收藏  举报