首先讓我們看一下JavaEE的三層架構:
使用hibernate的好處:操作數據庫的時候,可以使用面向對象的思想來完成,不需要書寫SQL;
Hibernate:是一個持久層ORM框架,對象關係映射;DBUTils是1級,Mybatis是2級,Hibernate是4級
所謂的ORM,就是利用描述對象和數據庫表之間映射的元數據,自動將java應用程序中的對象,持久化到關係型數據庫的表中;通過java對象,就可以完成表的操作,這之間重要在於映射;
Hibernate一個簡單Demo的實現過程:
- 下載hibernate;
解壓之後:
Doc中存放的相關的文檔;lib下面是存放各種jar包,其中required下面的是必需jar包;project下存放的是各種相關的源代碼;
- 創建數據庫和表:
CREATE DATABASE hibernate_day01;//建庫 create table cst_customer//建表 ( cust_id bigint(32) not null auto_increment comment '客戶編號', cust_name VARCHAR(32) not NULL comment '客戶名稱', cust_source VARCHAR(32) DEFAULT NULL comment '客戶信息來源', cust_industry VARCHAR(32) DEFAULT NULL comment '客戶所屬行業', cust_level VARCHAR(32) DEFAULT NULL comment '客戶級別', cust_phone varchar(64)DEFAULT NULL comment '固定電話', cust_mobile VARCHAR(16)DEFAULT NULL comment '移動電話', PRIMARY key(cust_id) ) |
- 引入相關jar包:
- 創建實體類,相關屬性和表中保持一致(持久化類),創建一個com.domain包,在該包下面創建一個實體類Customer,get,set方法默認生成即可;
- 創建映射文件:
在com.domain包下創建一個Customer.hbm.xml文件,注意需要導入相關約束:
之後對該文件進行相關的配置:
- 創建hibernate的核心配置文件;
在src下面創建一個hibernate.cfg.xml,同樣需要導入約束
書寫一個簡單的測試程序,用來向數據庫中添加數據:
Configuration主要用於hibernate框架加載映射文件,以及對其啓動;它會默認去到src目錄下找hibernate.cfg.xml文件;SessionFactory是Session對象的工廠,它一般消耗更多的資源,我們可以在加載的時候,只創建一個SessionFactory即可,在以後的使用過程中用來獲取Session對象,session對象是用來操作數據庫的,是hibernate的運轉中心,所有的持久化對象必須在session的管理下才能夠進行持久化操作;Session的創建過程有兩種,一種是openSession,另一種是getCurrentSession,前者是每次都會獲取到一個新的Session對象,每次使用完之後需要手動進行關閉;後者創建的session會和當前線程進行綁定,它在提交或者回滾之後會自動關閉;
關於什麼是JavaBean?
JavaBean是java中一種特殊的類,可以將多個對象封裝到一個對象中。它的特點是可序列化、可以提供set和get方法、以及默認構造方法和所有的屬性都被定義爲private;
爲什麼在JavaBean中大多數都是使用包裝類而不是基本數據類型,原因是java是面向對象的,JavaBean作爲一種規範,在習慣是把它的屬性都封裝成爲包裝類,這樣也方便調用一些方法;另外在阿里巴巴的開發手冊中寫基本類型接收NULL值有風險,容易出現空指針異常;
關於hibernate中持久化類的編寫規則:
持久化類需要提供無參的構造方法;持久化類的屬性需要私有,對私有的屬性提供公有的get和set方法;持久化類的屬性儘量使用包裝類型的;持久化類要有一個唯一標記OID與表的主鍵進行對應;持久化類儘量不要使用final進行修飾;因爲hibernate中 有延遲加載機制,所謂的延遲加載就是產生代理對象,hibernate產生代理對象是利用字節碼的增強技術來完成的,其實就是產生了當前類的一個子類對象實現的,如果使用了final來修飾持久化類,那麼就無法產生代理對象,hibernate的延遲加載機制就會失效;
Hibernate中的主鍵生成策略:首先我們需要清楚主鍵的類型,主鍵分爲自然主鍵和代理主鍵,自然主鍵是具有業務含義的字段作爲主鍵,就像我們在一個表中,把name當做主鍵,那麼我們需要規定該屬性不能爲null值,而且不能修改並且不能夠重複;代理主鍵是不具備業務含義的字段,該類字段一般取名爲id;
關於hibernate中對象的三種狀態:
瞬時態:沒有id,沒有session關聯
持久態:有id,有session關聯
託管態:有id,沒有session關聯 Demo實現如下:
結論:將我們希望同步到數據庫中的數據轉換爲持久化狀態,另外還有一個比較重要的方法SaveOrUpdate,它不論對象此時是瞬時態還是遊離態,調用該方法都會轉化爲持久態;
關於Session對象的創建有兩種方式,一種個是通過openSession()進行獲取,另一個方法是通過getCurrentSession進行獲取;二者的區別是採用前者時,SessionFactory每次會直接創建一個新的Session實例,在使用完成之後必須調用close方法進行關閉,而使用後者創建的session實例,會綁定到當前線程中,並在提交或者回滾過程中自動關閉;
Hibernate中的一級緩存就是session,圖解如下:
Hibernate的事務控制:
關於Hibernate中的三種查詢方式:
HQL:Hibernate Query Language它的語法類似於SQL,但它是面向對象的;一般用在多表查詢但不復雜;
步驟:
獲取Hibernate的Session對象,利用openSession這個方法;
編寫HQL語句
獲取調用Session.createQuery創建查詢對象
如果HQL語句中包含參數,使用setXxx設置參數
調用query對象的list或者uniqueResult()方法執行查詢
利用Criteria進行查詢:面向對象的查詢方式,不用寫SQL
利用SQLquery來進行查找: