自己学习的时候,顺手写的。主要为了减少重复操作!感觉还是可以的!
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;
}
}