Hibernate<一>一款工做在持久化層的大型、開源、免費的ORM框架

一、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的時候比較合適。

相關文章
相關標籤/搜索