Hibernate的基本API的用法

lily_lee1213發表於2017-03-22

1、Configuration 配置物件

Configuration物件就是用來讀取配置檔案和orm對映檔案的!

hibernate.cfg.xml 通常使用xml配置檔案,可以配置內容更豐富。

       hibernate.properties用於配置key/value 形式的內容,key不能重複的。配置有很多的侷限性。一般不用。

1.提供構造  new Configuration() hibernate將自動載入 hibernate.properties檔案

       hibernate.properties檔案必須存放在類路徑(src)下。

2.提供方法 configure() 將載入src下的hibernate.cfg.xml 

3.擴充套件api

       configure(String)載入指定目錄下的 xml檔案

4.手動載入配置檔案

          // 手動載入指定的配置檔案

         config.addResource("com/itheima/a_hello/User.hbm.xml");     

        // 手動載入指定類,對應的對映檔案 User--> User.hbm.xml

        config.addClass(User.class);


2、 SessionFactory工廠

  SessionFactory 相當於java web連線池,用於管理所有session


SessionHibernate自己建立,放進工廠的。

所以程式設計師只需要關注如何建立工廠,和從工廠中取出Session物件就行了。

 

1、建立工廠 SessionFactory

       1、需要configuration的配置資訊

       2、直接buildSessionFactory()  【然而這個方法已經過時了

       3、獲得Session 【必須確保Session是同一個Session

              OpenSession:獲得一個全新的Session物件  一般測試的時候用這個

              getCurruentSession 獲得與當前執行緒繫結的Session物件,如果沒有,就給你一個新的。專案上線的時候用這個

 

              特別的,使用getCurruentSession的時候需要再xml裡面配置一個property。

以後學Spring 的時候可以不用thread繫結,現在學Hibernate就是用thread繫結。

 

              框架的優點就在這裡,它封裝了ThreadLocal放在getCurruentSession裡面。

 

事務是包裹業務的,所有的業務操作結束後才關閉事務(提交或回滾)

用了一個 ThreadLocal<connection> 類,執行緒本地化,來保證一個業務裡面的所有connection是同一個。



3、Session 會話

Session 相當於 JDBC的 Connection-- 會話

Hibernate中必須需要主鍵。它是通過主鍵來區別物件的。】

1、演示物件導向的增

       只需要用setName這樣的屬性操作,然後用session.save(),然後關閉資源(sessionfactory都要關閉)即可。其他的sql語句之類的不用管。

2、查詢

       使用get方法。

3、修改【主要需要用tansaction事務來操作,這樣可以及時修改】

       必須先查詢出要修改的物件,再進行修改。

4、刪除

       根據id刪除。【這裡只要set物件的主鍵就行了。】     

 

5、查詢【非常重要!】

       1get方法(上面演示過了):get方法被呼叫時,立刻傳送sql語句查詢。

       2load方法【代理物件原理】:呼叫laod的時候並沒有查詢資料,只有當我們需要使用該物件的時候,才查詢資料。【延遲載入,提高Hibernate的執行效率】

       3.1、查詢所有物件 HQL語言

              使用HQL查詢,Hibernate Query Language,是一個物件導向的查詢語言。

              “from 類名”就是查詢所有結果。

           

       3.2還有一個是session.createCriteria方法:
             
它是Hibernate獨創的物件導向的查詢,特點是無語句查詢。

 

       3.3 支援原生的sql查詢(這裡不是物件導向的查詢,所有list的泛型不能亂寫了)

              這裡的列印不能再用syso了,必須用for迴圈列印,因為這個是用obeject封裝資料資訊的。

              這裡再使用query.addEntity方法將查詢的結果封裝到指定物件中。

                            SQLQueryquery=session.createSQLQuery(“select * from t_user”);

                            Query.addEntity(User.class);

                            List<User>list=query.list()

                            Syso(List)



4、Transaction 事務

開啟事務beginTransaction()

獲得事務getTransaction() 

提交事務:commit()

回滾事務:rollback()

事務的基本操作:
//1載入配置
		Configuration  conf = new Configuration().configure();
		//2 根據Configuration 配置資訊建立 SessionFactory
		SessionFactory sf = conf.buildSessionFactory();
		//3 獲得session
		Session session = sf.openSession();
		//-------------------------------
		//開啟事務
		Transaction ts = session.beginTransaction();
		//獲得已經開啟的事務物件(很少用)
		session.getTransaction();
		
		
		//Transaction 控制如何關閉事務
		//提交
		ts.commit();
		//回滾
		ts.rollback();
		
		
		//-------------------------------
		session.close();
		sf.close();

事務的細節:【重點!!!】
//1載入配置
		Configuration  conf = new Configuration().configure();
		//2 根據Configuration 配置資訊建立 SessionFactory
		SessionFactory sf = conf.buildSessionFactory();
		//3 獲得與當前執行緒繫結的session
		Session session = sf.getCurrentSession();
		//-------------------------------
		//事務關閉時,會自動把與當前執行緒關聯的session關閉,並刪除
		session.beginTransaction().commit();
		
		//在獲得當前執行緒繫結的session時. 獲得的是新的session
		Session session2 = sf.getCurrentSession();
		
		System.out.println(session==session2);//false
		
		//-------------------------------
		session.close();
		sf.close();


5、 Query物件

Query封裝查詢細節。

Query.list():執行hql語句,當返回結果是多行的情況,用這個。

Query.uniqueResult():只返回一個物件

分頁:mysql用了limit idex,count

        Hibernate用了↓,查詢結果用list接收,列印。

//指定結果從第幾個開始拿

        query.setFirstResult(0);

        //指定拿幾個結果

        query.setMaxResults(2);


6、Criteria物件

這個方法用的不多,因為它有侷限性,所以稍作了解即可。

//Criteria 查詢 => Hibernate獨創的物件導向的查詢=> 無語句
		Criteria criteria = session.createCriteria(User.class);	
// 查詢name屬性值為tom的 記錄
		criteria.add(Restrictions.eq("name", "tom"));
		//返回一個查詢結果
		User u = (User) criteria.uniqueResult();


//Criteria 查詢 => Hibernate獨創的物件導向的查詢=> 無語句
		Criteria criteria = session.createCriteria(User.class);
//查詢名字中包含字母o的使用者
		criteria.add(Restrictions.like("name", "%o%"));
	//返回一個查詢結果
		List<User> list =	criteria.list();
		System.out.println(list);

//Criteria 查詢 => Hibernate獨創的物件導向的查詢=> 無語句
		Criteria criteria = session.createCriteria(User.class);		
		//查詢id大於3的使用者
		criteria.add(Restrictions.gt("id", 3));
		//返回一個查詢結果
		List<User> list =	criteria.list();
		System.out.println(list);

7、工具類

程式碼的重複性很強,所以封裝成一個工具類就好了。

一次伺服器開啟期間,載入一次配置就好了。

Build相當於連線池,整個專案放一個連線池就夠了。

所以這些都是程式級別的操作,所以應該放到static裡面。


public class H3Utils {
	
	// 會話工廠,整個程式只有一份。
	private static SessionFactory factory;

	static{
		//1 載入配置
		Configuration config = new Configuration().configure();
		
		//2 獲得工廠
		factory = config.buildSessionFactory();
//3 關閉虛擬機器時,釋放SessionFactory
			Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
			
			@Override
			public void run() {
				System.out.println("虛擬機器關閉,釋放資源");
				sf.close();
			}
		}));
	}
	
	
	/**
	 * 獲得一個新的session
	 * @return
	 */
	public static Session openSession(){
		return factory.openSession();
	}
	
	/**
	 * 獲得當前執行緒中繫結session
	 * * 注意:必須配置
	 * @return
	 */
	public static Session getCurrentSession(){
		return factory.getCurrentSession();
	}
	
	
}



相關文章