hibernate(一) 第一個hibernate工程
一、什麼是Hibernate?
輕量級JavaEE應用的持久層框架,是一個完全的ORM框架。(說完這句話,肯定有很多人懵圈了,下面我來一個個解釋)
持久化:將我們想要儲存的資料儲存到硬碟上,也就是我們電腦的磁碟上,為什麼叫持久化呢,就是資料能夠儲存的很久,所以叫持久化,現在對持久化的實現過程大多通過各種關係型資料庫完成,所以我們常說的,將資料儲存到資料庫中,其實是資料庫幫我們幫資料儲存到硬碟中了。
持久層:既然知道了什麼是持久化,那麼持久化層也就應該有點思路了,這裡吧資料庫看成是記憶體的一部分,我們就當做將資料儲存到資料庫中,就儲存到了硬碟中一樣,所以在操作資料庫的或者跟資料庫打交道的那一層就是就持久層,比如我們之前知道了三層架構,不就有專門跟資料庫打交道的一層叫做持久化層嗎
ORM:Object Relational Mapping,物件關係對映,這個是一個思想,模型,或者說是規範。關係資料庫中的記錄對映成為程式語言中的物件例項,然後通過操作物件,來達到操作資料庫的這樣一種思想。如果沒有ORM思想,我們之前就是直接操作資料庫中的記錄欄位,來達到儲存資料的目的。
持久化類:通過上面解釋的,持久化類就是可以將類儲存到資料庫中,並還可以從資料庫中拿到該類,這就叫持久化類,也就是下面說到的POJO類
持久化物件:持久化類的例項物件,能儲存到資料庫中,也能從資料庫中取出來。
JPA的概念:Java Persistence API java持久化API,也就是java持久化的規範,ORM就是這JPA中所定義的,它還規定了其它很多規範,JPA維護一個Persistence Context(持久化上下文),這就是這個持久化上下文來事。那些ORM框架都要依據JPA規範來設計,那麼各個ORM框架也就度有這麼個持久化上下文。持久化上下文大體內容:1、ORM元資料,JPA支援annotion(註解)或xml兩種形式描述物件/關係對映 2、實體操作API,實現對實體物件的CRUD操作 3、查詢語言,約定了面向物件的查詢語言JPQL(javaPersistence Query Language)
知道了一些大概的名詞解釋,現在來看看hibernate在一個工程中到底處於一個什麼樣的地位
簡要體系架構結構
簡要的hibernate體系架構就如上圖所示,就如我們說的那樣,hibernate在Application和Database之間,所以我們使用hibernate來實現對Database的操作。
我們配置xxx.hbm.xml:目的就是為了hibernate與我們的application想關聯
我們配置hibernate.cfg.xml:與資料庫相關的服務,例如:使用者名稱和密碼等。還有自身hibernate的服務。
Hibernate全面解決方案體系架構
二、hibernate有什麼作用?
前面知道了什麼事hibernate,其實也就是知道hibernate的一些特性,很虛的東西,但是我們用它到底來做什麼呢?
1、通過hibernate,完成POJO類到資料庫表的對映關係
2、通過hibernate,只需要操作物件,hibernate就幫我們生成資料庫語句去操作資料庫,我們不必管下面的語句是怎麼樣的。
3、大概就是上面說的這兩個,就是讓使用者來對物件的增加、刪除、修改操作,來達到對資料庫表中資料的這種增刪改的操作。
三、使用hibernate需要導的jar包和jar包的意思?
雖然不知道jar包的裡面怎麼實現的,但是還是有那個好奇心,必須知道這個jar包是幹什麼的,不然就像個傻子一樣就知道複製黏貼,我相信,學完這個hibernate,我就會知道jar包裡面都有什麼的。
通過xxx.hbm.xml配置檔案來反應pojo類和資料庫表的對映關係。
基本的,只需要匯入這上面11個jar包,如果需要別的功能,可能會匯入額外的jar包
antlr.jar:Another Tool for Language Recognition 可以構造語言識別器,為解析HQL(後面會講到,hibernate Query language)時使用
commons-conllections.jar:就是加強版的collections。 比java.util.* 更強大的集合類
dom4j.jar:解析xml用的,
hibernate-jpa.jar 使用hibernate所依賴的jar包,jpa是一種規範,而hibernate是它的一種實現。
hibernate3.jar:hibernate的核心jar包
javassist.jar:操作位元組碼檔案,跟cglib有關(cglib應該是動態代理的一種,有jdk動態代理)
jta.jar:java transaction api,就是跟事務有關的
log4j.jar:log4j日誌
mysql-connector.jar:mysql的連線驅動包
slf4j-api.jar:整合其它日誌的規範介面,也就是如果要將其它日誌的jar包整合進來就要符合該規範
slf4j-log4j.jar:用來整合log4j和規範介面,讓log4j符合規範,這樣才能使用
四、如何實現POJO類到資料庫表的對映關係,xxx.hbm.xml配置檔案發威了
因為有這個配置檔案,pojo類具有操作的能力了。
1、dtd檔案:在hibernate3.jar下的org.hibernate/hibernate-mapping-3.0.dtd中找到。
2、基本的就只需要加<hibernate-mapping></hibernate-mapping>,在這對標籤下寫程式碼,來對映。
3、舉例說明,User.java User.hbm.xml
User.java
User.hbm.xml
主鍵生產策略:
1、increment:主鍵自動增長、由hibernate來管理
注意:如果資料庫也設定了自動增長,就會發生主鍵衝突問題
2、identity:由底層資料庫來管理生成,不由hibernate管理
也就是說底層資料庫怎麼設定的主鍵就怎麼來
注意:mysql、sql server可以,oracle不可以
3、sequence:識別符號生成器,就是底層資料庫來管理生成,利用底層資料庫提供的序列來生成識別符號,不由hibernate管理
注意:mysql不支援序列 oracle支援
4、native:由底層資料庫自己來決定使用什麼策略,hibernate不管
注意:mysql自動選擇identity、oracle自動選擇sequence
5、uuid:隨機生成32位不相同的字串。
主鍵分自然主鍵和代理主鍵
1自然主鍵:也就是在業務中有具體意義的主鍵,
2代理主鍵,就是上面我們說的那5種,沒有任何意義,只是標識主鍵是唯一的。
其它的一些配置資訊,還有什麼不理解的可以參考hibernate的api手冊。裡面講解的非常詳細。
五、hibernate的配置,hibernate.cfg.xml
有了xxx.hbm.xml這個對映檔案還不夠,因為hibernate需要連線資料庫,那麼這些操作放哪裡呢,就提取出一個公用的配置檔案出來,hibernate.cfg.xml就是這種公共的配置檔案,載入資料庫連線的資訊,和將各種對映檔案載入進來,其實就是抽取出來的,因為有很多對映檔案,每個對映檔案都需要連線資料庫等操作,那麼久將共同的操作提取出來形成了hibernate.cfg.xml。
1、ddl策略:
1、create、建立表,啟動的時候,先drop然後再建立表,(測試人員用來測試資料,先清除掉前面的舊錶,在建立新表)
2、create-drop:也表示建立,建立完後,就drop掉。(測試程式是否正確)
3、update:檢測類和表是否一致,不一致就會做更新,將表更新到和類一樣
4、validate:啟動時檢測表和類是否一致,不一致則報異常
一般常用update、validate。
六、有了xxx.hbm.xml和hibernate.cfg.xml後,就能使用hibernate的功能了。
說明:本章中截圖裡面多了一個User類中多了個date屬性,是為了說明解釋xxx.hbm.xml中type屬性的。沒其他作用。可以忽視。