HibernateDay0102

首先讓我們看一下JavaEE的三層架構:

使用hibernate的好處:操作數據庫的時候,可以使用面向對象的思想來完成,不需要書寫SQL;

Hibernate:是一個持久層ORM框架,對象關係映射;DBUTils是1級,Mybatis是2級,Hibernate是4級

所謂的ORM,就是利用描述對象和數據庫表之間映射的元數據,自動將java應用程序中的對象,持久化到關係型數據庫的表中;通過java對象,就可以完成表的操作,這之間重要在於映射;

Hibernate一個簡單Demo的實現過程:

  1. 下載hibernate;

解壓之後:

Doc中存放的相關的文檔;lib下面是存放各種jar包,其中required下面的是必需jar包;project下存放的是各種相關的源代碼;

  1. 創建數據庫和表:

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)

)

  1. 引入相關jar包:

  1. 創建實體類,相關屬性和表中保持一致(持久化類),創建一個com.domain包,在該包下面創建一個實體類Customer,get,set方法默認生成即可;

  1. 創建映射文件:

在com.domain包下創建一個Customer.hbm.xml文件,注意需要導入相關約束:

之後對該文件進行相關的配置:

  1. 創建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來進行查找:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章