hibernate的基本概念 hibernate是 輕量級的 ORM 框架,ORM全稱object/relation mapping [對象/關係 映射]。 orm概念 對象關係映射(Object Relation Mapping,簡稱ORM)是一種為瞭解決面向對象與關係資料庫存在的互不匹配的現象的 ...
hibernate的基本概念
hibernate是 輕量級的 ORM 框架,ORM全稱object/relation mapping [對象/關係 映射]。
orm概念
對象關係映射(Object Relation Mapping,簡稱ORM)是一種為瞭解決面向對象與關係資料庫存在的互不匹配的現象的技術。簡單的說,ORM是通過使用描述對象和資料庫之間映射的元數據,將java程式中的對象自動持久化到關係資料庫中。本質上就是將數據從一種形式轉換到另外一種形式。使用orm技術(hibernate是其中最為流行的)可以在java程式以類和對象的方式去操控資料庫表和記錄。
POJO類
在使用hibernate時,要求和資料庫的某張表相互映射的那個java類,是一個POJO類,一般放在com.xxx.domain包下,POJO類翻譯過來就是:簡單的Java對象(Plain Ordinary Java Objects)實際就是普通JavaBeans,使用POJO名稱是為了避免和EJB混淆起來。一個POJO類應當具有:
- 有一個主鍵屬性,用於唯一標識該對象。(這就是為什麼hibernate設計者建議要映射的表需要一個主鍵)
- 有其它的屬性
- 有對各個屬性操作的get/set方法
- 屬性一般是private修飾.
- 一定有一個無參的構造函數(用於hibernate框架反射用.)
Hibernate核心類及介面
Configuraion類
- 負責管理hibernate的配置信息
- 讀取hibernate.cfg.xml
- 載入hibernate.cfg.xml配置文件中配置的驅動,url,用戶名,密碼,連接池.
- 管理 *.hbm.xml對象關係文件.
SessionFactory(會話工廠)介面
- 緩存sql語句和某些數據
- 在應用程式初始化的時候創建,是一個重量級的類(吃記憶體),一般用單例模式保證一個應用中只需要一個 SessionFactory實例.
- 如果某個應用訪問多個資料庫,則要創建多個會話工廠實例,一般是一個資料庫一個會話工廠實例.
- 通過SessionFactory介面可以獲得Session(會話)實例.
Session(會話)介面
- Session一個實例代表與資料庫的一次操作(當然一次操作可以是crud組合)
- Session實例通過SessionFactory獲取,用完需要關閉。
- Session是線程不同步的(不安全),因此要保證在同一線程中使用,可以用getCurrentSession()。
- Session可以看做是持久化管理器,它是與持久化操作相關的介面
session.get()和session.load()區別
get()方法直接返回實體類,如果查不到數據則返回null。load()會返回一個實體代理對象(當前這個對象可以自動轉化為實體對象),但當代理對象被調用時,如果沒有數據不存在,就會拋出個org.hibernate.ObjectNotFoundException異常
load先到緩存(session緩存/二級緩存)中去查,如果沒有則返回一個代理對象(不馬上到DB中去找),等後面使用這個代理對象操作的時候,才到DB中查詢,這就是我們常說的 load在預設情況下支持延遲載入(lazy)
get先到緩存(session緩存/二級緩存)中去查,如果沒有就到DB中去查(即馬上發出sql)。總之,如果你確定DB中有這個對象就用load(),不確定就用get()(這樣效率高)
openSession()和 getCurrentSession()區別
- 採用getCurrentSession()創建的session會綁定到當前線程中,而採用openSession()創建的session則不會
- 採用getCurrentSession()創建的session在commit或rollback時會自動關閉,而採用openSession()創建的session必須手動關閉.
- 使用getCurrentSession()需要在hibernate.cfg.xml文件中加入
* 如果使用的是本地事務(jdbc事務,單庫) <property name="hibernate.current_session_context_class">thread</property> * 如果使用的是全局事務(jta事務,多庫) <property name="hibernate.current_session_context_class">jta</property>
openSession()和 getCurrentSession()聯繫
在 SessionFactory啟動的時候,Hibernate 會根據配置創建相應的 CurrentSessionContext,在getCurrentSession()被調用的時候,實際被執行的方法是 CurrentSessionContext.currentSession()。在
currentSession()執行時,如果當前Session為空,currentSession會調用SessionFactory的openSession。
openSession()和getCurrentSession()選擇原則
- 如果需要在同一線程中,保證使用同一個Session,則使用getCurrentSession()
- 如果在一個線程中,需要使用不同的Session,則使用opentSession()
Transaction(事務)介面
事務簡單的說,就是一組對資料庫的操作集合,它們要麼全部成功,要麼全部失敗.這個可以保證數據的一致性,事務具有原子性。
- ①Transaction是底層的事物實現中抽象出來的介面
- ②可能是一個jdbc或者jta的事務,這樣有利於hibernate在不同執行環境的移植。
- ③hibernate要求顯示的調用事務(如果僅僅是查詢可以不調用.)
Query介面
Query介面類型的對象可以對資料庫操作,它可以使用Hql,Qbc,Qbe和原生SQL(native Sql)對資料庫操作.官方推薦使用Hql語句。Query介面查詢出來的結果是一個List介面類型的對象。
Criteria介面
開發hibernate流程(手寫版)
- 建庫建表
- 引入hiberate的包
- 配置hibernate.cfg.xml
①該文件主要用於指定各個參數,是hibernate核心文件
②預設放在src目錄下,也可以放在別的目錄下。
③指定連接資料庫的驅動、用戶名、密碼、url、連接池..
④指定對象關係映射文件的位置.
⑤也可使用hibernate.properties文件來替代該文件.(推薦使用hibernate.cfg.xml)。
<hibernate-configuration>
<session-factory>
<!-- Database connection settings -->
<property name="connection.driver_class">org.hsqldb.jdbcDriver</property>
<property name="connection.url">jdbc:hsqldb:hsql://localhost</property>
<property name="connection.username">sa</property>
<property name="connection.password"/>
<!-- JDBC connection pool (use the built-in) -->
<property name="connection.pool_size">2</property>
<!-- SQL dialect -->
<property name="dialect">org.hibernate.dialect.HSQLDialect</property>
<!-- Enable Hibernate's current session context -->
<property name="current_session_context_class">org.hibernate.context.ManagedSessionContext</property>
<!-- Disable the second-level cache -->
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
<!-- Echo all executed SQL to stdout -->
<property name="show_sql">true</property>
<!-- Drop and re-create the database schema on startup -->
<property name="hbm2ddl.auto">create</property>
<mapping resource="com/yuan/domain/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
- 編寫POJO類(Users類)
- 編寫對象映射文件
①該文件主要作用是建立表和類的映射關係,是不可或缺的重要文件.
②一般放在其映射的類同一個目錄下,但不是必須的。
③命名方式一般是 類名.hbm.xml,但不是必須的。
- 編寫測試類,並測試.
Hibernate產品
Hibernate Core即平時所說的Hibernate,它可為應用程式提供強大、高性能的對象-關係映射以及查詢服務。Hibernate使用(HQL)檢索方式進行查詢,也可以使用本地SQL語言,還可以使用Query byCriteria(QBC)檢索方式或者Query by Example(QBE)檢索方式。Hibernate可以幫助開發者節省持久層編碼時間,有助於面向對象應用程式的設計實現。
Hibernate標註(Hibernate Annotations)從Hebernate3.2開始,Hibernate Annotations提供了JDK 5.0 關於對象-關係映射的標註。通過使用Hibernate標註,可以減少XML描述符的使用,在編譯期進行校驗,以及減少配置和維護工作等。
Hibernate EntityManager 在Hibernate Core的強大功能基礎上實現了符合JPA規範Java持久化提供者(Hibernate Java Persistence)。可以應用於任何Java EE5應用伺服器中或EJB3.0容器中,也可以被使用在Java SE應用中。