1. 程式人生 > >Hibernate_day02---實體類操作、物件狀態、一級快取、事務操作、API

Hibernate_day02---實體類操作、物件狀態、一級快取、事務操作、API

一、實體類編寫規則


1)實體類裡面屬性私有的

2)私有屬性使用公開的set和get方法操作

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

4)實體類屬性建議不使用基本資料型別,使用基本資料型別對應的包裝類
應用環境:可以解決區分出 值為零(score=0)和值不存在(score=null)兩種情況

八個基本資料型別對應的包裝類
		int – Integer
		char—Character、
		其餘六種都是首字母大寫 比如 double – Double

二、Hibernate主鍵生成策略


1) 實體類中有一個屬性作為唯一值,對應表中主鍵.
 
2) 在class中的不同策略(屬性值):
		1)native: 根據使用的資料庫幫選擇哪個值
		2)uuid:生成uuid值
		插圖:

在這裡插入圖片描述

演示生成策略值 uuid

1)使用uuid生成策略,實體類id屬性型別 必須 字串型別
在這裡插入圖片描述
(2)配置部分寫出uuid值
在這裡插入圖片描述

三、實體類操作


對實體類crud操作

	@Test
	public void crudTest() {
		//1 呼叫工具類得到sessionFactory
		SessionFactory sessionFactory = HibernateUtils.getSessionFactory();
		//2 獲取session
		Session session = sessionFactory.openSession();
		//3 開啟事務
		Transaction tx = session.beginTransaction();

		/*
		 * 根據id查詢   
		 *
		 * session.get(類名.class, id值); 
		 * 		引數一:實體類的class
		 * 		引數二:id值
		 */
		User user = session.get(User.class, 1);
		
		
		/*
		 * 修改:
		 * 1)先查詢,
		 * 2)再設定修改值,
		 * 3)update方法完成更新
		 */
		 User user = session.get(User.class, 2);   //查詢
		 user.setUsername("嶽不群");  //設定
		 session.update(user);  //更新修改
		
		/*
		 * 刪除:
		 * 1)先查詢,
		 * 2)delete方法刪除查詢結果
		 */
		User user = session.get(User.class, 2);  //根據id查詢物件
		session.delete(user);   //刪除查詢結果
		
		/*
		 * 新增:
		 * 1)建立物件、 
		 * 2)對物件進行屬性設定、
		 * 3)save方法完成新增
		 */
		User user = new User();
		user.setUsername("小王");
		user.setPassword("250");
		user.setAddress("日本");
	
		session.save(user);  //實現新增


		
		//5 提交事務
		tx.commit();
		//6 關閉
		session.close();
		sessionFactory.close();	
	}
}

實體類物件狀態(三種)

	1)瞬時態:物件裡面沒有id值,物件與session沒有關聯
 
	2)持久態:物件裡面有id值,物件與session關聯
 
	3)託管態:物件有id值,物件與session沒有關聯
 
saveOrUpdate方法:
	1)可以實現新增、修改兩個功能。
	2)虛擬機器將根據實體類不同狀態,執行不同功能
	
	總結:無id時,做新增。有id時,做修改

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

四、Hibernate中的快取


快取:把資料存到記憶體裡面

作用:可以直接從記憶體中讀取資料,提供讀取效率

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

Hibernate快取:是hibernate框架中提供的多種優化之一。

Hibernate快取分為兩級

一級快取:
	 1)預設開啟
	 2)使用範圍:session範圍。從session建立到session關閉的範圍
	 3)儲存資料狀態要求:必須是持久態資料

二級快取:
	 1)目前已經不使用了,被redis技術替代
	 2)預設關閉,開啟則需要配置
	 3)二級快取使用範圍,是sessionFactory範圍

驗證一級快取的存在
	做法:多次查詢相同記錄,
	現象:只有第一次會輸出sql語句查詢資料庫。則證明一級快取存在。

Hibernate一級快取特性
	根據持久態操作,自動更新資料庫。

Hibernate一級快取執行過程
在這裡插入圖片描述

五、Hibernate事務操作


事務相關概念
1) 什麼是事務
	一組不可分割的操作。統一成功或統一失敗
2) 事務特性
	原子性、一致性、隔離性、永續性
3) 不考慮隔離性產生的問題
	1)髒讀
	2)不可重複讀
	3)虛讀

4) 設定事務隔離級別(解決三種錯誤讀方式)
(1)mysql預設隔離級別 repeatable read

Hibernate事務程式碼規範寫法:

	程式碼結構:
		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)在hibernate核心配置檔案中配置**

在這裡插入圖片描述
2)呼叫sessionFactory裡面的方法得到
在這裡插入圖片描述

七、Hibernate的api使用


Query物件

使用query物件,使用hql語句
hql:hibernate query language,hibernate提供查詢語言。普通sql語句很相似
	1)hql和sql語句區別:
		- 使用sql操作表和表字段
		- 使用hql操作實體類和屬性

	2 查詢所有hql語句: from 實體類名稱

	3) Query物件使用
		1)建立Query物件
		2)呼叫query物件裡面的方法得到結果

在這裡插入圖片描述

Criteria物件

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

2 實現過程
(1)建立criteria物件
(2)呼叫物件裡面的方法得到結果

在這裡插入圖片描述

SQLQuery物件

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

2 實現過程
(1)建立物件
(2)呼叫物件的方法得到結果

返回list集合每部分是陣列
在這裡插入圖片描述
在這裡插入圖片描述
返回list中每部分是物件形式
在這裡插入圖片描述
在這裡插入圖片描述