1. 程式人生 > >Hibernate 初相識(一)Hibernate API 詳解,配置檔案,對映檔案詳解。

Hibernate 初相識(一)Hibernate API 詳解,配置檔案,對映檔案詳解。

導航{

}

Hibernate 在三層框架中的位置。


一,第一個Hibernate 專案。 

地址:https://github.com/gengzi/Hibernate

【1】匯入jar包

解壓 Hibernate  的原始碼包 將加壓檔案中的 hibernate3.jar 匯入專案,是核心jar 包
開啟依賴的jar 包,選擇 jpa 和 required 中的jar 檔案
操作資料庫,需要對應的資料庫的驅動jar 包
下面這些都是必須要匯入的jar 包     

【2】建立我們的資料庫,和表  (資料庫名:day29hibernate_test01  表名: s_user)


[3] 編寫 javaBean 檔案和 配置檔案 

{  兩個配置檔案:(1) 對映檔案(對應javabean 物件)                           (2) 核心配置檔案
} 編寫屬性和 資料庫建立一樣的javaBean 物件。
建立一個跟 User.java  的名字一樣的  javabean名.hbm.xml  的對映檔案 { 規範要求:對映檔案的名字前面與javabean 名字一樣,在同一包下。 } 配置檔案需要匯入  dtd 約束。 約束檔案 

、  (小知識: 一般dtd 檔案中頭註釋部分,都會把約束寫出來) 在 對映檔案中 匯入 hibernate-mapping-3.0.dtd 的約束 User.hbm.xml  
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
  5. <!--配置對映-->
  6. <hibernate-mapping>
  7. <class name="cn.edu.aynu.rjxy.domain.User" table="s_user">
  8. <!--主鍵-->
  9. <
    id name="id">
  10. <!--native意思:原生-->
  11. <generator class="native"></generator>
  12. </id>
  13. <!--普通欄位-->
  14. <property name="username"></property>
  15. <property name="password"></property>
  16. </class>
  17. </hibernate-mapping>

配置核心約束檔案

位置:類路徑(classpathsrc-->WEB-INF/classes

名稱:hibernate.cfg.xml

匯入hibernate-configuration-3.0.dtd   的約束頭

hibernate.cfg.xml   

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE hibernate-configuration PUBLIC
  3. "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  4. "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
  5. <hibernate-configuration>
  6. <session-factory>
  7. <!--連線資料庫的基本四項-->
  8. <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
  9. <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/day29hibernate_test01</property>
  10. <property name="hibernate.connection.username">root</property>
  11. <property name="hibernate.connection.password">111</property>
  12. <!--新增對映檔案-->
  13. <mapping resource="cn/edu/aynu/rjxy/domain/User.hbm.xml"/>
  14. </session-factory>
  15. </hibernate-configuration>

 複製User.hbm.xml  的全路徑,需要刪掉 src 前面的內容。

【4】編寫test.java 檔案,測試專案。

  1. package cn.edu.aynu.rjxy.test;
  2. import org.hibernate.SessionFactory;
  3. import org.hibernate.cfg.Configuration;
  4. import org.hibernate.classic.Session;
  5. import cn.edu.aynu.rjxy.domain.User;
  6. publicclassTest01{
  7. publicstaticvoid main(String args[]){
  8. test();
  9. }
  10. publicstaticvoid test(){
  11. // [1]載入配置檔案獲得核心配置物件
  12. Configuration configuration =newConfiguration().configure();
  13. // [2]獲得工廠 SessionFactory,相當於連線池( build 構造)
  14. SessionFactory buildSessionFactory = configuration
  15. .buildSessionFactory();
  16. // [3]獲得會話session,相當於連結Connection
  17. Session openSession = buildSessionFactory.openSession();
  18. // 【4】 儲存一個user 資訊
  19. User user =newUser();
  20. user.setPassword("111");
  21. user.setUsername("耿帥佳");
  22. // [5] 操作
  23. openSession.save(user);
  24. // [6] 關閉資源
  25. openSession.close();
  26. buildSessionFactory.close();
  27. }
  28. }
圖片:
控制檯列印 sql 語句 。
執行結果 :

二,分析常見的Api 欄位。

【1】Hibernate  的執行過程。


【2】對Configuraction  詳解。

  1. package cn.edu.aynu.rjxy.api;
  2. import org.hibernate.cfg.Configuration;
  3. import cn.edu.aynu.rjxy.domain.User;
  4. publicclassConfiguration_test{
  5. // 詳解 Configuraction 物件
  6. publicvoid fun1(){
  7. // 1.1 呼叫configure() 方法=> 載入src下名為hibernate.cfg.xml
  8. // (呼叫configuraction() 方法 => 載入src下的 hibernate.properties)
  9. Configuration configuration =newConfiguration().configure();
  10. // <三種載入核心配置檔案的方式:>
  11. // 1.2 如果配置檔案不符合預設載入規則.我們可以呼叫
  12. // new Configuration().configure(file); 通過file載入
  13. // new Configuration().configure(path); 通過指定的路徑載入
  14. // <載入對映檔案的兩種方式:>
  15. // 1.3 可以通過Configuration物件載入 對映檔案(不推薦)(對映檔案就是:User.hbm.xml)
  16. // 手動配置(不推薦)
  17. // configuration.addClass(User.class);
  18. // configuration.addResource("cn/edu/aynu/rjxy/domain/User.hbm.xml");
  19. // 推薦hibernate.cfg.xml 使用 mapping 屬性引入配置檔案
  20. configuration.addClass(User.class);
  21. configuration.addResource("cn/edu/aynu/rjxy/domain/User.hbm.xml");
  22. // <ORM(User.hmb.xml) 對映檔案編寫規範>
  23. // 規範: 1>orm對映檔名稱與實體的簡單類名一致 (User.hbm.xml User.java )
  24. // 2>orm對映檔案 需要與實體的類在同一包下
  25. }
  26. }
圖解:

 【3】 對 SessionFactory 的詳解。


  1. package cn.edu.aynu.rjxy.api;
  2. import org.hibernate.SessionFactory;
  3. import org.hibernate.cfg.Configuration;
  4. // 對sessionFactory 的詳解
  5. publicclassSessionFactory_test{
  6. //
  7. publicvoid fun1(){
  8. // 1載入配置
  9. Configuration conf =newConfiguration().configure();
  10. // 2 根據Configuration 配置資訊建立 SessionFactory
  11. // sessionFactory 可以理解為一個連線池,連線池中包含很多連線,而session 就相當於連線池中的 connection 物件
  12. SessionFactory sf = conf.buildSessionFactory();
  13. // 3 獲得session
  14. // 3.1 openSession => 獲得一個全新的Session物件
  15. sf.openSession();
  16. // 3.2 getCurrentSession => 獲得與當前執行緒繫結的session物件
  17. // 呼叫getCurrentSession 需要加上一個配置: <property
  18. // name="hibernate.current_session_context_class">thread</property>
  19. sf.getCurrentSession();
  20. }
  21. }
圖解:

【4】詳解 Session 物件

測試我們常見的資料庫操作,增(insert),刪(delete),改(update),查(查一條,查所有,按條件查詢)(select)

(1)在資料庫中新增一條資料。

呼叫了 session 的 save() 方法(主鍵自增)
  1. User user =newUser();
  2. user.setUsername("test");
  3. user.setPassword("111");
  4. // 呼叫session 物件的 save 方法,來儲存物件到資料庫中
  5. session.save(user);
新增資料 insert 

(2)修改一條資料,需要先查詢到該物件,然後才能修改物件中的屬性

使用 update 方法
  1. // 先執行查的方法,找到需要修改的物件
  2. User user =(User) session.get(User.class,1);
  3. user.setUsername("耿帥佳--修改");
  4. session.update(user);

(3)刪除一條資料,呼叫 delete 方法。 需要先找出該物件, 才能執行刪除。

  1. // 先找出該物件
  2. User user =(User) session.get(User.class,2);
  3. // 再刪除
  4. session.delete(user);


(5) 查詢一條記錄,查詢 id 為 2 的記錄。

(5.1)get 方法兩個引數  (Class class Serializable  id)  , 第二個引數就是標識的主鍵  
  1. // 查詢 id 為 2的這一條記錄。
  2. User user =(User) session.get(User.class,2);
  3. transaction.commit();
 
(5.1)使用 load 方法來查資料庫, 它不會立即查詢資料庫,當我們使用到這個物件的時候,就會查詢資料庫。
  1. User user =(User) session.load(User.class,2);


在debug 的模式下,我們執行到提交以後,再去點選 user 物件,則會執行如下圖的查詢。

比較:get()方法  和 load() 方法 get: get方法被呼叫時立刻  傳送sql語句查詢 load : 呼叫時並沒有查詢資料庫,當我們需要使用該物件的時候,才查詢資料

(6)查詢所有,三種方式。

(6.1)使用HQL 語言進行查詢
 (6.2)使用原生的sql 語句查詢
(6.3) 使用Hibernate 獨創的物件方式查詢 => 無語句
對應控制檯的輸出:

其中的問題: 1 load方法.返回一個代理物件,獲得其內容時,會查詢資料庫,是每次訪問屬性都會查詢資料庫嗎? 答:不是每次都查.代理物件中有一個標識是否被初始化的boolean型變數. 記錄是否被初始化過. 2 代理都是要基於介面的,用load方法返回的代理,就沒有實現任何介面? 答: java中的動態代理是基於介面.  而 Hibernate 是使用javassist-3.12.0.GA.jar 產生代理物件的. 該代理與被代理物件之間的關係是繼承關係.與我們學的動態代理不是一種.所以不需要介面.

【5】 詳解 Trancastion 物件。

事務是處理一系列的資料庫的操作。
注意: 事務關閉時,就會把當前執行緒上繫結的session 關閉,並刪除

【6】 詳解Query 物件

(1)可以使用這個物件,實現分頁顯示的功能。

(2)查詢一條結果。 注意: 返回的結果只能是 一條,否則會報錯。