獲取Session的工具類:
HibernateUtil類:
package hibernateDao;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
/*
* Hibernate工具類,簡化獲取和關閉Session
*/
public class HibernateUtil {
//線程本地變量,使用key爲當前的線程對象,value就是Session
private static final ThreadLocal<Session> tl = new ThreadLocal<>();
private static final SessionFactory sf;
//初始化
static {
Configuration cf = new Configuration().configure();
sf = cf.buildSessionFactory();
}
//獲取session
public static Session getSession() {
//先從線程本地變量中獲取當前線程對象的Session對象
Session session = tl.get();
if(session==null) {
session = sf.openSession();
//放置Session
tl.set(session);
}
return session;
}
//關閉Session
public static void closeSssion() {
//先從線程本地變量中獲取當前線程對象的Session對象
Session session = tl.get();
if(session!=null) {
session.close();
//驅逐被關閉的Session
tl.set(null);
}
}
}
通用DAO接口:
HibernateDao接口:
package hibernateDao;
import java.io.Serializable;
import java.util.List;
/*
* 通用Hibernate DAO接口
*/
public interface HibernateDao <T>{
//保存
public Serializable save(final T entity);
//更新,必須帶主鍵
public void update(final T entity);
//保存或更新
public void saveOrUpdate(final T entity);
// 刪除,必須帶有主鍵
public void delete(final T entity);
// 通過對象標識符獲取對象
public T findById(final Serializable oid);
// 返回所有對象
public List<T> findAll();
// 獲取分頁記錄
List<T> findByPage(String hql,int start, int pageSize);
// 通用查詢方法:queryName是命名查詢名字
public List<T> executeQuery(String hql, Object... params);
// 通用查詢方法:queryName是命名查詢名字
public List<T> executeNamedQuery(String queryName, Object... params);
// 通用更新方法:queryName是命名查詢名字
public int executeUpdate(String hql, Object... params);
// 通用更新方法:queryName是命名查詢名字
public int executeNamedUpdate(String hqlName, Object... params);
}
通用接口子類:
具體實現類 HibernateDaoImp可以實現自己的接口同時繼承該子類
package hibernateDao;
import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;
import org.hibernate.query.Query;
public abstract class HibernateDaoImp<T> implements HibernateDao<T> {
private Class<T> clazz;
public HibernateDaoImp() {
//獲取子類對應父類對象泛型的實際類型
Type superClass = getClass().getGenericSuperclass();
ParameterizedType type = (ParameterizedType) superClass;
Type[] types = type.getActualTypeArguments();
this.clazz = (Class<T>) types[0].getClass();
}
@Override
public Serializable save(T entity) {
Serializable uid = HibernateUtil.getSession().save(entity);
return uid;
}
@Override
public void update(T entity) {
HibernateUtil.getSession().update(entity);
}
@Override
public void saveOrUpdate(T entity) {
HibernateUtil.getSession().saveOrUpdate(entity);
}
@Override
public void delete(T entity) {
HibernateUtil.getSession().delete(entity);
}
@Override
public T findById(Serializable oid) {
T t = HibernateUtil.getSession().get(clazz, oid);
return t;
}
@Override
public List<T> findAll() {
Query<T> query = HibernateUtil.getSession().createQuery("from " + clazz.getSimpleName());
return query.getResultList();
}
@Override
public List<T> findByPage(String hql, int start, int pageSize) {
Query<T> query = HibernateUtil.getSession().createQuery(hql);
query.setFirstResult(start);
query.setMaxResults(pageSize);
return query.getResultList();
}
@Override
public List<T> executeQuery(String hql, Object... params) {
Query<T> query = HibernateUtil.getSession().createQuery(hql);
int len = params.length;
if (len != 0) {
for (int i = 0; i < len; i++) {
query.setParameter(i, params[i]);
}
}
return query.getResultList();
}
@Override
public List<T> executeNamedQuery(String queryName, Object... params) {
Query<T> query = HibernateUtil.getSession().getNamedQuery(queryName);
int len = params.length;
if (len != 0) {
for (int i = 0; i < len; i++) {
query.setParameter(i, params[i]);
}
}
return query.getResultList();
}
@Override
public int executeUpdate(String hql, Object... params) {
Query<T> query = HibernateUtil.getSession().createQuery(hql);
int len = params.length;
if (len != 0) {
for (int i = 0; i < len; i++) {
query.setParameter(i, params[i]);
}
}
return query.executeUpdate();
}
@Override
public int executeNamedUpdate(String hqlName, Object... params) {
Query<T> query = HibernateUtil.getSession().getNamedQuery(hqlName);
int len = params.length;
if (len != 0) {
for (int i = 0; i < len; i++) {
query.setParameter(i, params[i]);
}
}
return query.executeUpdate();
}
}
測試
UserInfoDaoImpl類:
package hibernateDao;
public class UserInfoDaoImpl<UserInfo> extends HibernateDaoImp<UserInfo> {
}
package hibernateDao;
import org.hibernate.Transaction;
import org.westos.hibernate.UserInfo;
public class TestDao {
public static void main(String[] args) {
UserInfoDaoImpl<UserInfo> impl = new UserInfoDaoImpl<>();
Transaction ts = HibernateUtil.getSession().beginTransaction();
UserInfo userInfo = new UserInfo("陳十","1334");
impl.save(userInfo);
ts.commit();
HibernateUtil.getSession().close();
}
}