一、Hibernate體系結構
二、Hibernate-api詳解
2.1、Configuration配置對象
Configuration是用來加載配置文件的
我們Hibernate中主要有兩個配置文件,第一個是核心的配置文件,第二個是映射文件。
2.2、SessionFactory工廠
SessionFactory 相當於java web連接池,用於管理所有session
獲得方式:config.buildSessionFactory();
sessionFactory hibernate緩存配置信息 (數據庫配置信息、映射文件,預定義HQL語句 等)
SessionFactory線程安全,可以是成員變量,多個線程同時訪問時,不會出現線程並發訪問問題。
SessionFactory與連接池的區別
getCurrentSession()方法
2.3、session對象
用來操作數據庫的。Sesion相當於JDBC中的Connection。我們通過session操作PO對象實現增刪改查。
2.3.1、增
2.3.2、改
2.3.3、刪
2.3.4、查
A.使用session中的get方法查詢
結果:
B.使用session中的load方法
load方法.返回一個代理對象,獲得其內容時,會查詢數據庫,是每次訪問屬性都會查詢數據庫嗎?
答:不是每次都查.代理對象中有一個標識是否被初始化的boolean型變量. 記錄是否被初始化過.
代理都是要基於接口的,用load方法返回的代理,就沒有實現任何接口?
答:java中的動態代理是基於接口. 而 Hibernate 是使用javassist-3.12.0.GA.jar 產生代理對象的.
該代理與被代理對象之間的關系是繼承關系.與我們學的動態代理不是一種.所以不需要接口.
出現bug:
分析:get和load的執行原理
C.使用HQL語言查詢數據庫中表的所有記錄
D.使用Criteria查詢所有數據庫
E.使用原生的SQL語句查詢
2.3.5、總結
在增刪改查中我們學習的方法有
session.save();
session.update();
session.delete();
session.get();
session.load(); 對比get
session.createQuery();
session.createCritieria();
session.createSqlQuery();
2.4、Transaction對象
Transaction封裝了事務的操作
一般事務的操作中有:
開啟事務 beginTransaction()
獲得事務 getTransaction()
提交事務 commit()
回滾事務 rollback()
細節處理
從這里中我們使用getCurrentSession()方法獲得一個事務,當你沒有關閉這個事務的時候,
當你再次獲取事務,它們屬於同一個事務。
2.5、Query對象
Query對象封裝了HQL語句對象,且封裝了查詢的細節
2.6、Criteria對象(了解)
使用like查找
一些基本的查詢條件查詢
2.7、工具類
我們知道在使用hibernate進行增刪改查的時候都要獲取到session,這導致代碼的重用性很強,所以我們可以
創建一個工具類去解決這個問題。
import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.hibernate.classic.Session; //完成Hibernate工具類 //封裝配置文件讀取操作 //封裝Sessionfactroy創建操作 //封裝session獲得操作 public class HibernateUtils { private static SessionFactory sf; static{ //1加載配置 Configuration conf = new Configuration().configure(); //2 根據Configuration 配置信息創建 SessionFactory sf = conf.buildSessionFactory(); // Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { @Override public void run() { System.out.println("虛擬機關閉!釋放資源"); sf.close(); } })); } public static org.hibernate.Session openSession(){ //3 獲得session Session session = sf.openSession(); return session; } public static org.hibernate.Session getCurrentSession(){ //3 獲得session Session session = sf.getCurrentSession(); return session; } }