1. 程式人生 > >Hibernate_day02(轉載傳智播客的老師講義,博主只圖檢視方便)

Hibernate_day02(轉載傳智播客的老師講義,博主只圖檢視方便)

Hibernate_day02

上節內容

1 web內容回顧

 

2 hibernate概述

1orm思想

 

3 hibernate入門案例

 

4 hibernate的配置檔案

 

5 hibernate的核心api

今天內容

1 實體類編寫規則

 

2 hibernate主鍵生成策略

1native

2uuid

 

3 實體類操作

1crud操作

2)實體類物件狀態

 

4 hibernate的一級快取

 

5 hibernate的事務操作

1)事務程式碼規範寫法

 

6 hibernate其他的api(查詢)

1Query

2Criteria

3SQLQuery

 

實體類編寫規則

1 實體類裡面屬性私有的

 

2 私有屬性使用公開的setget方法操作

 

3 要求實體類有屬性作為唯一值(一般使用id值)

 

4 實體類屬性建議不使用基本資料型別,使用基本資料型別對應的包裝類

1)八個基本資料型別對應的包裝類

- int – Integer

- char—Character

- 其他的都是首字母大寫 比如 double – Double

2)比如 表示學生的分數,假如 int score;

- 比如學生得了0 int score = 0;

- 如果表示學生沒有參加考試,int score = 0;不能準確表示學生是否參加考試

  1. 解決:使用包裝類可以了, Integer score = 0,表示學生得了0分,
  2. 表示學生沒有參加考試,Integer score = null;

 

Hibernate主鍵生成策略

1 hibernate要求實體類裡面有一個屬性作為唯一值,對應表主鍵,主鍵可以不同生成策略

 

2 hibernate主鍵生成策略有很多的值

 

3 class屬性裡面有很多值

1native 根據使用的資料庫幫選擇哪個值

2uuid:之前web階段寫程式碼生成uuid值,hibernate幫我們生成uuid

 

4 演示生成策略值 uuid

1)使用uuid生成策略,實體類id屬性型別 必須 字串型別

2)配置部分寫出uuid

 

 

實體類操作

對實體類crud操作

新增操作

1 呼叫session裡面的save方法實現

 

根據id查詢

1 呼叫session裡面的get方法實現

 

修改操作

1 首先查詢,修改值

1)根據id查詢,返回物件

 

刪除操作

1 呼叫session裡面delete方法實現

 

實體類物件狀態(概念)

1 實體類狀態有三種

1)瞬時態:物件裡面沒有id值,物件與session沒有關聯

2)持久態:物件裡面有id值,物件與session關聯

 

3)託管態:物件有id值,物件與session沒有關聯

 

2 演示操作實體類物件的方法

1saveOrUpdate方法:實現新增、實現修改

 

 

 

 

Hibernate的一級快取

什麼是快取

1 資料存到資料庫裡面,資料庫本身是檔案系統,使用流方式操作檔案效率不是很高。

1)把資料存到記憶體裡面,不需要使用流方式,可以直接讀取記憶體中資料

2)把資料放到記憶體中,提供讀取效率

 

Hibernate快取

1 hibernate框架中提供很多優化方式,hibernate的快取就是一個優化方式

 

2 hibernate快取特點:

第一類 hibernate的一級快取

1hibernate的一級快取預設開啟的

2hibernate的一級快取使用範圍,是session範圍,從session建立到session關閉範圍

3hibernate的一級快取中,儲存資料必須 持久態資料

 

第二類 hibernate的二級快取

1)目前已經不使用了,替代技術 redis

2)二級快取預設不是開啟的,需要配置

3)二級快取使用範圍,是sessionFactory範圍

 

驗證一級快取存在

1 驗證方式

1)首先根據uid=1查詢,返回物件

2)其次再根據uid=1查詢,返回物件

第一步執行get方法之後,傳送sql語句查詢資料庫

第二個執行get方法之後,沒有傳送sql語句,查詢一級快取內容

 

Hibernate一級快取執行過程

 

Hibernate一級快取特性

1 持久態自動更新資料庫

 

2 執行過程(瞭解)

 

Hibernate事務操作

事務相關概念

1 什麼是事務

 

2 事務特性

 

3 不考慮隔離性產生問題

1)髒讀

2)不可重複讀

3)虛讀

 

4 設定事務隔離級別

1mysql預設隔離級別 repeatable read

 

Hibernate事務程式碼規範寫法

1 程式碼結構

try {

  開啟事務

  提交事務

}catch() {

  回滾事務

}finally {

  關閉

}

    @Test

    public void testTx() {

       SessionFactory sessionFactory = null;

       Session session = null;

       Transaction tx = null;

       try {

           sessionFactory = HibernateUtils.getSessionFactory();

           session = sessionFactory.openSession();

           //開啟事務

           tx = session.beginTransaction();

          

           //新增

           User user = new User();

           user.setUsername("小馬");

           user.setPassword("250");

           user.setAddress("美國");

          

           session.save(user);

          

           int i = 10/0;

           //提交事務

           tx.commit();

       }catch(Exception e) {

           e.printStackTrace();

           //回滾事務

           tx.rollback();

       }finally {

           //關閉操作

           session.close();

           sessionFactory.close();

       }

    }

Hibernate繫結session

1 session類似於jdbcconnection,之前web階段學過 ThreadLocal

 

2 幫實現與本地執行緒繫結session

 

3 獲取與本地執行緒session

1)在hibernate核心配置檔案中配置

2)呼叫sessionFactory裡面的方法得到

 

4 獲取與本地執行緒繫結session時候,關閉session報錯,不需要手動關閉了

 

Hibernate的api使用

Query物件

1 使用query物件,不需要寫sql語句,但是寫hql語句

1hqlhibernate query languagehibernate提供查詢語言,這個hql語句和普通sql語句很相似

2hqlsql語句區別:

- 使用sql操作表和表字段

- 使用hql操作實體類和屬性

 

2 查詢所有hql語句:

1from 實體類名稱

 

3 Query物件使用

1)建立Query物件

2)呼叫query物件裡面的方法得到結果

 

 

Criteria物件

1 使用這個物件查詢操作,但是使用這個物件時候,不需要寫語句,直接呼叫方法實現

 

2 實現過程

1)建立criteria物件

2)呼叫物件裡面的方法得到結果

 

SQLQuery物件

1 使用hibernate時候,呼叫底層sql實現

 

2 實現過程

1)建立物件

2)呼叫物件的方法得到結果

返回list集合每部分是陣列

 

返回list中每部分是物件形式

 

完成任務

1 查詢表所有記錄,把記錄顯示頁面中

1servlet裡面呼叫serviceservice呼叫dao

2)在dao裡面使用hibernate實現操作

3)在頁面中顯示所有資料

- servlet裡面把list集合放到域物件

- jsp中使用el表示式+foreach標籤獲取

 

2 複習知識

1)一對多和建表

2)多對多和建表