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();
}
}
}
}