標籤:常量 font ram 封裝 query 其他 commit 單例 ring
封裝HibernateUtil
import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;public class HibernateUtil { //定義常量是為了實現單例,不讓隨便new //ThreadLocal<Session>不是集合,是線程鎖,為了單安全執行緒 private static final ThreadLocal<Session> lock = new ThreadLocal<Session>(); private static final SessionFactory factory = buildFactory(); private static SessionFactory buildFactory() { Configuration cfg = new Configuration().configure();//讀取 hibernate.cfg.xml 的配置資訊 return cfg.buildSessionFactory(); } public static Session getSession() { //先擷取線程鎖中的session Session session = lock.get(); if (session == null) {//如果沒有session就建立一個session賦值給lock session = factory.openSession(); lock.set(session); } return session; } public static void closeSession() { Session session = lock.get();//先擷取線程鎖中的session if (session != null) {//如果session有值,那麼關閉session session.close(); lock.set(null); //將session關閉之後再給lock賦值null,方便其他線程使用 } } }
增刪改查方法封裝,使用時是調取該類中的具體方法即可
import java.util.List;import org.hibernate.Session;import org.hibernate.query.Query;import maya.model.Sto;import maya.util.SearchItem;public class StoDAO { private Session session = null; public StoDAO() {//建構函式,引用HibernateUtil類的getSession方法 session = HibernateUtil.getSession(); }//添加。要用 事務來控制,另外,增、改也需要 public void insert(Sto data) { data = null; try { session.beginTransaction();//開始事務 data = new Sto(); data.setStorno(data.getStorno()); data.setStorname(data.getStorname()); data.setStoset(data.getStoset()); data.setStoaddr(data.getStoaddr()); data.setWindow(data.getWindow()); data.setTelno1(data.getTelno1()); session.save(data);//添加到session中 session.getTransaction().commit();//提交事務 } catch (Exception e) { session.getTransaction().rollback();//拋出異常,交易回復至開始 e.printStackTrace(); } finally { HibernateUtil.closeSession();//關閉事務 } }//刪除 public void delete(String storno) { try { Sto data = session.load(Sto.class, storno);//先查出要刪除的對象 if (data != null) { session.beginTransaction(); session.delete(data);//將刪除資訊添加至session session.getTransaction().commit();//提交事務 } } catch (Exception e) { e.printStackTrace(); session.getTransaction().rollback(); } finally { HibernateUtil.closeSession();//關閉 } }//修改 public void update(Sto data) { try { Sto sto = session.get(Sto.class, data.getStorno());//先查出要修改的對象 if (data != null) { session.beginTransaction();//開始事務 sto.setStorname(data.getStorname()); sto.setStoset(data.getStoset()); sto.setStoaddr(data.getStoaddr()); sto.setWindow(data.getWindow()); sto.setTelno1(data.getTelno1()); session.update(sto);//將修改資訊添加至session session.getTransaction().commit();//提交事務 } } catch (Exception e) { e.printStackTrace(); session.getTransaction().rollback(); } finally { session.close();//關閉 } }//查單個,不用依靠事務控制 public Sto select2(String storno) { Sto sto = null; try { sto = (Sto)session.createQuery("from Sto where storno=?") .setParameter(0, storno)//第一個問號用0來表示,第二個問號用1,以此類推 .getSingleResult(); } catch (Exception e) { e.printStackTrace(); } finally { HibernateUtil.closeSession();//調用HibernateUtil類的close方法來關閉 } return sto; }//查集合 public List<Sto> select() { List<Sto> list = null; try { list = session.createQuery("from Sto").getResultList(); } catch (Exception e) { e.printStackTrace(); } finally { HibernateUtil.closeSession(); } return list; }}
封裝HibernateUtil(靜態單例模式)和增刪改查方法