hibernate的使用(關於hibernate事務的必須開啓的問題)

原文鏈接

一、與數據庫的交互(增刪改查)

注意:1.寫hql語言是是對於對象操作,而不是表數據

            2.注意hibernate中的緩存

1.Hibernate 查詢方式

     Hibernate配備了一種非常強大的查詢語言,這種語言看上去很像SQL。但是不要被語法結構上的相似所迷惑,HQL(Hibernate querylauguage)被設計爲完全面向對象的查詢。   

     HQL對關鍵字的大寫小並不區分,但是對查詢的對象就要區分大小寫,因爲它是面向對象的查詢,所以查詢的是一個對象,而不是數據庫的表,在sql中如果要加條件的話就是列,而在HQL裏面條件就是對象的屬性,而且還要給對象起別名

1.Hibernate查詢HQL語句

限制查詢結果記錄數與起始記錄

[html] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. Sessionsession=HibernateSessionFactory.getSession();  
  2.   
  3. Queryquery=session.createQuery("fromCustomer");  
  4.   
  5. query.setFirstResult(10); //設置查詢記錄開始位置,索引從0開始。  
  6.   
  7. query.setMaxResults(10);//設置查詢返回的最大記錄個數。  
  8.   
  9. Listlist=query.list();  
  10.   
  11. 注意:條件查詢  
  12.   
  13. Sessionsession=HibernateSessionFactory.getSession();  
  14.   
  15. Queryquery=session.createQuery("from Customer cus where cus.name='zhou'");  

 2、取表中部分列時

(1) 單一屬性查詢。還是返回一個集合,只不過集合中存儲的不是表的實例而是對象。

[html] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. Sessionsession =null;  
  2.   
  3. sessionHibernateSessionFactory.getSession();  
  4.   
  5. Listcnames = session.createQuery("select cname from Customer").list();  
  6.   
  7. for(inti=0;i<cnames.size();i++) {  
  8.   
  9.   String name = (String)cnames.get(i);  
  10.   
  11.   System.out.println(name);  
  12.   
  13. }  

(2) 多個屬性的查詢,使用對象數組。

[html] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. Sessionsession =null;  
  2.   
  3. sessionHibernateSessionFactory.getSession();  
  4.   
  5. //查詢多個屬性,其集合元素是對象數組  
  6.   
  7. //數組元素的類型,跟實體類的屬性的類型相關  
  8.   
  9. Liststudents = session.createQuery("select sno,sname from Students").list();  
  10.   
  11. for(inti=0;i<students.size();i++) {  
  12.   
  13.   Object[] obj = (Object[])students.get(i);  
  14.   
  15.   System.out.println(obj[0] +", " + obj[1]);  
  16.   
  17. }  

 (3) 多個屬性的查詢,使用List集合裝部分列

[html] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. Sessionsession = HibernateSessionFactory.getSession();  
  2.   
  3. Queryquery = session.createQuery("select new list(cus.name,cus.phone) from Customer cus");  
  4.   
  5. Listlist = query.list();  
  6.   
  7. for(int i = 0; i < list.size(); i++) {  
  8.   
  9.   List temp=(List)list.get(i);  
  10.   
  11.   System.out.println(temp.get(0));  //0是索引  
  12.   
  13. }  

 (4) 使用Map集合裝部分列

[html] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. Sessionsession = HibernateSessionFactory.getSession();  
  2.   
  3. Queryquery = session.createQuery("select new map(cus.name,cus.phone) from Customer cus");  
  4.   
  5. Listlist = query.list();  
  6.   
  7. for(int i = 0; i < list.size(); i++) {  
  8.   
  9.   Map temp=(Map)list.get(i);  
  10.   
  11.   System.out.println(temp.get("1"));  //"1"是key  
  12. }  

 3、內連接  

[html] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. Queryquery=session.createQuery("select c.name, s.name fromStudent s join s.classes c").list();  
  2.   
  3. for(Iterator iter = students.iterator();iter.hasNext();){  
  4.   
  5.   Object[] obj = (Object[])iter.next();  
  6.   
  7.   System.out.println(obj[0] +", " + obj[1]);  
  8.   
  9. }  

4、外連接

[html] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. Queryquery=session.createQuery("select c.name, s.name fromStudent s join s.classes c").list();  
  2.   
  3. for(Iterator iter = students.iterator();iter.hasNext();){  
  4.   
  5.   Object[] obj = (Object[])iter.next();  
  6.   
  7.   System.out.println(obj[0] +", " + obj[1]);  
  8.   
  9. }</span>  

5、帶參數的查詢

[html] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. (1) ?作爲參數 如"from Customer cus where cus.name=?";  
  2.   
  3.      Session session = HibernateSessionFactory.getSession();  
  4.   
  5.     Query query = session.createQuery("fromCustomer cuswhere cus.name=?");  
  6.   
  7.      query.setParameter(0,"zhou");  
  8.   
  9.      List list = query.list();  
  10.   
  11. (2) 參數名稱  :name   如" from Customer cus where cus.name=:name";  
  12.   
  13. Sessionsession = HibernateSessionFactory.getSession();  
  14.   
  15.      Queryquery = session.createQuery("fromCustomer cuswhere cus.name=:name");  
  16.   
  17.      query.setParameter("name","zhou");  
  18.   
  19.      List list = query.list();  
  20. (3)條件查詢,使用 ?的方式傳遞參數  
  21. <p><span style="color:black;"> </span>Query <span style="color:black;">query</span><span style="color:black;"> = </span><span style="color:black;">session.createQuery</span><span style="color:black;">("SELECTs.id, s.name FROM Student s WHERE s.name </span><span style="color:#333399;">LIKE ?</span><span style="color:black;">");</span></p><p><span style="color:black;">  </span> <span style="color:black;">query</span><span style="color:#333399;">.setParameter</span><span style="color:black;">(0,“%</span><span style="color:black;"></span><span style="color:black;">%”);//</span><span style="color:black;">傳遞參數參數的索引是從</span><span style="color:black;">0</span><span style="color:black;">開始的。  </span>如條件查詢,<span style="color:#333399;">使用</span><span style="color:#333399;">":</span><span style="color:#333399;">參數</span><span style="color:#333399;">"</span><span style="color:#333399;">名稱的方式傳遞參數</span></p><p><span style="color:black;">  </span>Query <span style="color:black;">query</span><span style="color:black;"> = </span><span style="color:black;">session.createQuery</span><span style="color:black;">("SELECTs.id, s.name FROM Student s WHERE s.name </span><span style="color:#333399;">LIKE </span><span style="color:#333399;">:</span><span style="color:#333399;">myname</span><span style="color:black;">");</span></p><p><span style="color:black;">  </span><span style="color:black;">query.setParameter</span><span style="color:black;">("</span><span style="color:black;">myname</span><span style="color:black;">","</span><span style="color:black;">張三</span><span style="color:black;">");//</span><span style="color:black;">傳遞參數</span></p><p><span style="color:black;">因爲</span><span style="color:black;">setParameter</span><span style="color:black;">方法返回</span><span style="color:black;">Query</span><span style="color:black;">接口,所以可用省略方式來查詢</span></p><p><span style="color:black;">Liststudents = </span><span style="color:black;">session.createQuery</span><span style="color:black;">("SELECTs.id, s.name FROM Student s WHERE s.name </span><span style="color:#333399;">LIKE :</span><span style="color:#333399;">myname</span><span style="color:#333399;"> and s.id = :</span><span style="color:#333399;">myid</span><span style="color:black;">")</span></p><p><span style="color:black;">setParameter</span><span style="color:black;">("</span><span style="color:black;">myname</span><span style="color:black;">","%</span><span style="color:black;"></span><span style="color:black;">%").</span><span style="color:black;">setParameter</span><span style="color:black;">("</span><span style="color:black;">myid</span><span style="color:black;">",15).list();</span></p>  

6、嵌入原生sql測試

[html] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. SQLQuerysqlQuery = session.createSQLQuery("select * from t_student");  
  2.   
  3.   List students = sqlQuery.list();  
  4.   
  5.   for (Iterator iter = students.iterator();iter.hasNext();){  
  6.   
  7.   Object[] obj = (Object[])iter.next();  
  8.   
  9.   System.out.println(obj[0] +", " + obj[1]);  
  10.   
  11.   }  


2.Hibernate增加、修改方式

拿到要修改的對象,調用session.saveOrUpdate();方法

[html] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. public void addStudent(Student stud) {  
  2.         Session session=HibernateSessionFactory.getSession();  
  3.         Transaction tr=session.beginTransaction();  
  4.         try {  
  5.             session.saveOrUpdate(stud);//一個方法  
  6. //          session.update(stud);  
  7.         } catch (HibernateException e) {  
  8.             e.printStackTrace();  
  9.         }  
  10.         tr.commit();  
  11. }  

2.Hibernate刪除方式


拿到要刪除的對象,調用session.delete();方法

[html] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. public void delStudent(Student stud) {  
  2.         Session session=HibernateSessionFactory.getSession();  
  3.           
  4.         Transaction tr=session.beginTransaction();  
  5.         try {  
  6.             session.delete(stud);  
  7.             session.flush();  
  8.         } catch (Exception e) {  
  9.             System.out.println("回滾了");  
  10. //          tr.rollback();  
  11.         }  
  12.         tr.commit();//刪除沒有事務不行!  
  13.     }  


注意要添加事務:不然增刪改用不了


二、關於hibernate事務的必須開啓的問題

當我們在寫簡單的增刪改的時候,發現如果不開啓事務,數據就不會向數據庫提交這是因爲hibernate中的session對象是Connection對象的子類,對Connection的加強,

而我們在看hibernate源碼的時候發現Session對象中通過了代理,自動幫我們把setAtuoCommit(false),設置成不自動提交,所有我們在增刪改必須開啓事務,而且要提交,同時session還對rollback()進行了代理,所以在commit的時候是自動回滾


三、代碼演示

[html] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. package cn.hncu.demo.dao;  
  2.   
  3. import java.util.List;  
  4.   
  5. import org.hibernate.HibernateException;  
  6. import org.hibernate.Query;  
  7. import org.hibernate.Session;  
  8. import org.hibernate.Transaction;  
  9. import org.junit.Test;  
  10.   
  11. import cn.hncu.domain.Student;  
  12. import cn.hncu.hib.HibernateSessionFactory;  
  13.   
  14. public class DemoDaoJdbc {  
  15.     public List<Student> queryAllStudent(){  
  16.         Session session=HibernateSessionFactory.getSession();  
  17.         //無論是Load 還是 Get 都會首先查找緩存(一級緩存) 如果沒有,纔會去數據庫查找,調用Clear() 方法,可以強制清除Session緩存  
  18.         session.clear();  
  19.         Query query=session.createQuery("from Student");  
  20.         List<Student> list=query.list();  
  21.         return list;  
  22.     }  
  23.     public void delStudent(Student stud) {  
  24.         Session session=HibernateSessionFactory.getSession();  
  25.           
  26.         Transaction tr=session.beginTransaction();  
  27.         try {  
  28.             session.delete(stud);  
  29.             session.flush();  
  30.         } catch (Exception e) {  
  31.             System.out.println("回滾了");  
  32. //          tr.rollback();  
  33.         }  
  34.         tr.commit();//刪除沒有事務不行!  
  35.     }  
  36.       
  37.     @Test  
  38.     public void t(){  
  39.         Student stud=new Student();  
  40.         stud.setStudId("S003");  
  41.         delStudent(stud);  
  42.         System.out.println(queryAllStudent());  
  43.     }  
  44.   
  45.     public void addStudent(Student stud) {  
  46.         Session session=HibernateSessionFactory.getSession();  
  47.         Transaction tr=session.beginTransaction();  
  48.         try {  
  49.             session.saveOrUpdate(stud);  
  50. //          session.update(stud);  
  51.         } catch (HibernateException e) {  
  52.             e.printStackTrace();  
  53.         }  
  54.         tr.commit();  
  55.     }  
  56.   
  57.     public Student queryAStudent(Student stud) {  
  58.         Session session=HibernateSessionFactory.getSession();  
  59.         String hql="from Student s where s.studId=?";  
  60.         Query query=session.createQuery(hql);  
  61.         query.setParameter(0, stud.getStudId());  
  62.         List<Student> list=query.list();  
  63.         if(list!=null&&list.size()>0){  
  64.             return list.get(0);  
  65.         }  
  66.         return null;  
  67.     }  
  68.     public List<Student> queryStudent(Student stud) {  
  69.         Session session=HibernateSessionFactory.getSession();  
  70.         String hql="from Student s where 1=1";  
  71.         if(stud.getStudId()!=null&&stud.getStudId().trim().length()>0){  
  72.             hql+=" and s.studId='"+stud.getStudId()+"'";  
  73.         }  
  74.         if(stud.getStudName()!=null&&stud.getStudName().trim().length()>0){  
  75.             hql+=" and s.studName='"+stud.getStudName()+"'";  
  76.         }  
  77.         if(stud.getStudAge()!=null){  
  78.             hql+=" and s.studAge="+stud.getStudAge();  
  79.         }  
  80.         if(stud.getDeptId()!=null&&stud.getDeptId().trim().length()>0){  
  81.             hql+="and s.deptId='"+stud.getDeptId()+"'";  
  82.         }  
  83.         Query query=session.createQuery(hql);  
  84.         List<Student> list=query.list();  
  85.         return list;  
  86.     }  
  87. }  

HibernateSessionFactory

[html] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. package cn.hncu.hib;  
  2.   
  3. import org.hibernate.HibernateException;  
  4. import org.hibernate.Session;  
  5. import org.hibernate.SessionFactory;  
  6. import org.hibernate.cfg.Configuration;  
  7.   
  8. public class HibernateSessionFactory {  
  9.     private static final String CONFIG_FILENAME="/hibernate.cfg.xml";//文件名  
  10.     private static final ThreadLocal<Session> threadLocal=new ThreadLocal<Session>();//本地線程  
  11.     private static Configuration config=new Configuration();  
  12.     private static SessionFactory sessionFactory;//聲明一個SessionFactory對象  
  13.     static{  
  14.         try {  
  15.             config.configure(CONFIG_FILENAME);  
  16.             sessionFactory=config.buildSessionFactory();  
  17.         } catch (HibernateException e) {  
  18.             e.printStackTrace();  
  19.         }  
  20.     }  
  21.     public static SessionFactory getSessionFactory() {  
  22.         return sessionFactory;  
  23.     }  
  24.     public static Session getSession() throws HibernateException{  
  25.         Session session=threadLocal.get();  
  26.         if(session==null||!session.isOpen()){//如果這個鏈接沒開  
  27.             if (sessionFactory==null) {  
  28.                 config.configure(CONFIG_FILENAME);  
  29.                 sessionFactory = config.buildSessionFactory();  
  30.             }  
  31.             session=(sessionFactory!=null)?sessionFactory.openSession():null;//是否開放一個session  
  32.             threadLocal.set(session);//把session放入本地線程  
  33.         }  
  34.         return session;  
  35.     }  
  36.       
  37.     //關閉連接  
  38.     public static void closeSession() throws HibernateException{  
  39.         Session session=threadLocal.get();  
  40.         threadLocal.remove();  
  41.         if(session!=null){  
  42.             session.close();  
  43.         }  
  44.           
  45.     }  
  46.   
  47. }  


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章