一、Hibernate名片java
Hibernate是一款工做在持久化層的大型、開源、免費的ORM框架。mysql
二、持久化sql
①狹義:將數據從「不可掉電」設備保存到「能夠掉電」的設備上。數據庫
②廣義:指與數據庫相關的一切操做。緩存
[1]保存:對應標準SQL中的INSERT語句。安全
[2]刪除:對應標準SQL中的DELETE語句。session
[3]更新:對應標準SQL中的UPDATE語句。app
[4]查詢:對應標準SQL中的SELECT語句。在Hibernate中,每每特指使用專門的查詢API查詢特定的框架
數據。查詢API包括HQL查詢和QBC查詢。性能
[5]加載:在Hibernate中,加載指的是根據對象的OID查詢數據庫中的一條具體的記錄。
說明:OID——Object ID,特指Java對象中與數據庫表的主鍵相對應的一個屬性。
三、ORM
①概念:Object/Relationship Mapping,對象關係映射
②對象:Java程序中用於封裝業務數據的對象。一般稱爲實體類(Entity),以JavaBean(POJO)技術實
現。例如:Book 、User、Person等等這樣的類的對象。
③關係:關係型數據庫,目前主流的數據庫都是關係型的。
④映射:創建從「對象」到「關係型數據庫」之間的對應關係。
⑤基於JDBC的ORM
⑥基於Hibernate的ORM
l 單表映射
l 單向多對一關聯關係
l 雙向多對一關聯關係
l 基於外鍵的一對一關聯關係
l 基於主鍵的一對一關係關係
l 單向多對多關聯關係
l 雙向多對多關聯關係
四、Hibernate特色
①將對數據庫的操做轉換爲對象Java對象的操做,從而簡化開發。
經過修改一個「持久化」對象的屬性從而修改數據庫表中對應的記錄數據。
②提供線程和進程兩個級別的緩存提高應用程序性能。
③有豐富的映射方式將Java對象之間的關係轉換爲數據庫表之間的關係。
④屏蔽不一樣數據庫實現之間的差別。在Hibernate中只須要經過「方言」的形式指定當前使用的數據庫,就
能夠根據底層數據庫的實際狀況生成適合的SQL語句。
⑤非侵入式:Hibernate不要求持久化類實現任何接口或繼承任何類,POJO便可。
五、建立Hibernate自身的配置文件(分析內容,以Boo.java示例):hibernate.cfg.xml
<hibernate-configuration> <session-factory > <!-- 1.應用程序鏈接數據庫所須要使用的基本信息 --> <!-- 鏈接數據庫的用戶名 --> <property name="hibernate.connection.username" >root</property> <!-- 鏈接數據庫的密碼 --> <property name="hibernate.connection.password" >root</property> <!-- 鏈接數據庫的URL地址 --> <property name="hibernate.connection.url" >jdbc:mysql://localhost:3306/hibernate</property > <!-- 鏈接數據庫的數據庫驅動的全類名 --> <property name="hibernate.connection.driver_class" >com.mysql.jdbc.Driver </property> <!-- 2.Hibernate自身運行所須要指定的信息 --> <!-- 是否要顯示SQL --> <!-- 關於顯示SQL:使用Hibernate操做數據庫是由Hibernate向數據庫發送SQL語句,指定爲true時會在控制檯打印發送的SQL語句 --> <property name="show_sql">true</ property> <!-- 是否要格式化SQL --> <!-- 將控制檯打印的SQL語句格式化 --> <property name="format_sql">true</ property> <!-- 生成數據庫表的策略 --> <!-- 使用Hibernate能夠根據 hbm文件自動生成數據庫表,可使用這個選項指定生成方式 --> <property name="hbm2ddl.auto">update</ property> <!-- 當前使用的數據庫方言 --> <!-- 數據庫方言:對於一樣的操做,不一樣數據庫有本身各自不一樣的實現,表現爲不一樣語法風格的SQL語句 --> <!-- 指定數據庫方言要使用特定的值: 在官方的hibernate-release-4.2.4.Final\project\etc\hibernate.properties文件中可以找到 --> <property name="hibernate.dialect" >org.hibernate.dialect.MySQL5InnoDBDialect </property> <!-- 3.當前要使用的hbm 映射文件位置 --> <!-- 以路徑的形式指定映射文件的位置,不要寫成點符號 --> <mapping resource="com/bingbinlee/bean/Book.hbm.xml" /> </session-factory > </hibernate-configuration>
①建立持久化類:Book.java
②建立持久化類對應的關係映射文件:Book.hbm.xml文件
[1]建立位置:和持久化類在同一個包下
[2]配置方式
<hibernate-mapping> <!-- class元素表示將Java持久化類映射爲數據庫表 --> <!-- name屬性指定持久化類的全類名,table屬性指定數據庫表的表名 --> <class name="com.bingbinlee.bean.Book" table="BOOK" > <!-- id元素表示將持久化類的OID屬性映射爲數據庫表的主鍵 --> <!-- name屬性用於指定持久化類中OID屬性名(使用getXxx()和setXxx()定義的) --> <!-- type屬性用於指定映射爲數據庫表時使用的類型 --> <id name= "bookId" type ="java.lang.Integer"> <!-- column元素用於指定當前屬性映射爲數據庫表中的字段名 --> <column name= "BOOK_ID" /> <!-- generator元素用於指定生成主鍵的方式:主鍵的生成策略 --> <!-- native屬性表示使用數據庫本地適合的方式生成主鍵 --> <generator class= "native" /> </id> <!-- 映射通常的持久化類屬性 --> <property name= "bookName" type="java.lang.String" > <column name= "BOOK_NAME" /> </property> <property name= "quantity" type ="int"> <column name= "QUANTITY" /> </property> <property name= "createDate" type ="java.util.Date"> <column name= "CREATE_DATE" /> </property> </class > </hibernate-mapping>
③在hibernate.cfg.xml文件中聲明映射文件的位置
<!-- 3.當前要使用的hbm 映射文件位置 --> <!-- 以路徑的形式指定映射文件的位置,不要寫成點符號 --> <mapping resource="com/bingbinlee/bean/Book.hbm.xml" />
六、Hibernate常見API介紹
①Session
表明Hibernate應用程序和數據庫之間的一次會話,做用至關於JDBC中的Connection。
②SessionFactory
建立Session對象的工廠。
●針對單個數據庫映射關係通過編譯後的內存鏡像,是線程安全的。
●SessionFactory對象一旦構造完畢,即被賦予特定的配置信息。
●構造SessionFactory很消耗資源,通常狀況下一個應用中只初始化一個 SessionFactory對象。
●Hibernate4新增了一個ServiceRegistry 接口,全部基於Hibernate的配置或者服務都必須統一貫
這個ServiceRegistry註冊後才能生效。
●建立SessionFactory對象的步驟
[1]建立封裝配置信息的Configuration對象。
[2]在ServiceRegistry對象中註冊配置信息。
[3]經過Configuration對象構建SessionFactory對象。
③Configuration
負責管理Hibernate的配置信息。
●hibernate.cfg.xml文件中的信息:數據庫URL地址、用戶名、密碼、JDBC驅動類、數據庫方言、數
據庫鏈接池參數等。
●*.hbm.xml文件中的信息:持久化類與數據庫表之間的對應關係。
④Transaction
表明一次數據庫事務。Hibernate主張將全部持久化操做都歸入到事務控制中,哪怕僅僅是隻讀操做。
七、 持久化類
①概念
在Hibernate中,咱們將封裝業務數據的實體類稱爲持久化類。持久化類通過Hibernate映射後能夠自動生成對應的數據庫表。原則上Hibernate不要求持久化類實現任何接口或繼承任何類,POJO便可,因此Hibernate是一個非侵入式框架。
②具體要求
[1]有無參的構造器,便於經過反射建立對象。
[2]有OID屬性:就像數據庫表必定要有主鍵同樣,持久化類也必定要有OID屬性用於和數據庫表的主
鍵相對應。
[3]包含使用JavaBean風格聲明的屬性:getXxx()和setXxx()方法
[4]非final類:在Hibernate中須要經過爲持久化類建立代理對象的方式實現延遲加載策略,final類無
法被繼承從而沒法建立其代理對象。
八、數據庫表生成策略
①概述
Hibernate在建立SessionFactory對象時,會根據*.hbm.xml映射文件中的信息自動生成對應的數據庫
表,而在生成數據庫表的過程當中,能夠根據不一樣的配置信息採起不一樣的生成策略。
②配置方式
在hibernate.cfg.xml配置文件中加入以下配置
<property name="hbm2ddl.auto">update</property> |
③能夠選擇的生成策略
[1]create:根據*.hbm.xml文件生成新的數據庫表,並且是每一次運行都刪除舊錶建立新的表,即便兩
次操做的過程當中數據庫表沒有任何改變
[2]update:按照以下幾種狀況生成數據庫表
<1>數據庫表不存在:生成新的數據庫表
<2>數據庫表存在且表結構不須要改變:保留原來的數據庫表
<3>數據庫表存在但表結構有變化:在原來數據庫表的基礎上更新數據庫表,不會刪除原有的行和列
[3]create-drop:每一次運行都生成新的數據庫表,並在執行操做後將表刪除
[4]validate:會和數據庫中的表進行比較,若*.hbm.xml文件中的列在數據表中不存在,則拋出異常
④其餘配置
[1]hibernate.jdbc.fetch_size
做用:控制Statement對象讀取數據的時候每次從數據庫中取出的記錄條數。
說明:例如一次查詢1萬條記錄,對於Oracle的JDBC驅動來講,是不會1次性把1萬條取出來的,而
只會取出fetchSize條數,當結果集遍歷完了這些記錄之後,再去數據庫取fetchSize條數據。所以大大節省
了無謂的內存消耗。fetchSize設的越大,讀數據庫的次數越少,速度越快;fetchSize越小,讀數據庫的次
數越多,速度越慢。Oracle數據庫的JDBC驅動默認的fetchSize=10,是一個保守的設定,根據測試,當
fetchSize=50時,性能會提高1倍之多,當fetchSize=100,性能還能繼續提高20%,fetchSize繼續增大,
性能提高的就不顯著了。並非全部的數據庫都支持fetchSize特性,例如MySQL就不支持。
[2]hibernate.jdbc.batch_size
做用:設置批量增刪改時的批次大小,相似於設定緩衝區大小。
說明:batchSize越大,批量操做時向數據庫發送SQL語句的次數越少,速度就越快。測試結果是當
batchSize=0的時候,使用Hibernate對Oracle數據庫刪除1萬條記錄須要25秒,batchSize=50的時候,刪
除僅僅須要5秒!Oracle數據庫batchSize=30的時候比較合適。