首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 學習雜談(十二)—— ORM 框架深度解析:從 JDBC 到 Hibernate

     編輯:Java 相關知識

為什麼需要 ORM?

傳統 JDBC 痛點:

  • 大量樣板代碼:獲取連接、創建 Statement、處理 ResultSet、封裝對象、關閉資源。
  • 事務控制、異常處理、日誌分散在各 DAO 方法中,冗余嚴重。
  • 面向對象與關係數據庫範式不匹配(阻抗失配):無布爾類型、主鍵/外鍵約束無法直接映射、繼承/多態無對應、對象圖與表關聯難同步。

ORM(Object-Relational Mapping)旨在建立對象模型與數據模型的自動映射橋樑,讓開發者面向對象編程,屏蔽 SQL 細節。

健壯持久層應具備的 14 項特徵

  1. 支持多種持久化機制
  2. 完全封裝持久化細節
  3. 多對象操作
  4. 事務控制
  5. 可擴展性
  6. 對象標識管理
  7. 游標/邏輯連接
  8. 代理/延遲加載
  9. 記錄級操作(避免對象↔記錄雙向轉換開銷)
  10. 多架構支持
  11. 多數據庫版本/廠商兼容
  12. 多連接管理
  13. 原生/非原生驅動支持
  14. 結構化查詢語言

主流 ORM 框架對比

1. Apache OJB(Object-Relational Bridge)

  • 實現 ODMG 3.0、JDO API,核心為 PersistenceBroker。
  • XML 映射文件(ojb-repository.xml)+ Metadata Layer (MOP)。
  • 特性:對象緩存、鎖管理、虛擬代理、事務隔離級別。
  • 映射示例:
<class-descriptor class="com.ant.Employee" table="EMPLOYEE">
  <field-descriptor name="id" column="ID" jdbc-type="INTEGER" primarykey="true" autoincrement="true"/>
  <field-descriptor name="name" column="NAME" jdbc-type="VARCHAR"/>
</class-descriptor>

<class-descriptor class="com.ant.Executive" table="EXECUTIVE">
  <field-descriptor name="id" column="ID" jdbc-type="INTEGER" primarykey="true" autoincrement="true"/>
  <field-descriptor name="department" column="DEPARTMENT" jdbc-type="VARCHAR"/>
  <reference-descriptor name="super" class-ref="com.ant.Employee">
    <foreignkey field-ref="id"/>
  </reference-descriptor>
</class-descriptor>

2. iBATIS(現 MyBatis 前身)

  • 核心特色:手寫 SQL 映射,SQL 寫在 XML(sqlMap.xml),充分利用數據庫特有語法,不限於 SQL-92。
  • 缺點:不支持枚舉類型持久化(多屬性映射單字段)。
  • 映射示例:
<sqlMap>
  <typeAlias type="com.ant.Test" alias="test"/>
  <resultMap class="test" id="result">
    <result property="testId" column="TestId"/>
    <result property="name" column="Name"/>
    <result property="date" column="Date"/>
  </resultMap>
  <select id="getTestById" resultMap="result" parameterClass="int">
    select * from Test where TestId=#value#
  </select>
  <update id="updateTest" parameterClass="test">
    Update Tests set Name=#name#, Date=#date# where TestId=#testId#
  </update>
</sqlMap>

3. Hibernate(應用最廣、生態最豐)

  • 自動生成優化 SQL,3.x 版本補齊手寫 SQL 支持(createSQLQuery)。
  • 核心特性:
    • HQL:面向對象查詢語言,FROM Customer 而非 SELECT * FROM table,配合 Dialect 實現數據庫無關性。
    • 雙級緩存:一級(Session 級,寫穿透)、二級(SessionFactory 級,可集成 Ehcache/Infinispan),讀寫分離策略提升性能。
    • Criteria API:完全物件化條件查詢,編譯期類型安全。
  • 映射示例(customer.hbm.xml):
<hibernate-mapping>
  <class name="com.ant.Customer" table="Customers">
    <id name="customerId" column="CustomerId" type="int" unsaved-value="0">
      <generator class="sequence">
        <param name="sequence">Customers_CustomerId_Seq</param>
      </generator>
    </id>
    <property name="firstName" column="FirstName"/>
    <property name="lastName" column="LastName"/>
    <set name="addresses" outer-join="true">
      <key column="Customer"/>
      <one-to-many class="com.ant.Address"/>
    </set>
  </class>
</hibernate-mapping>

現代 ORM 發展趨勢

  • Annotation 驅動:JDK 5.0 + XDoclet/JPA 註解替代 XML,配置更貼近代碼。
  • JPA 標準化:Hibernate、EclipseLink、OpenJPA 等實現 javax.persistence API,避免鎖定具體實現。
  • 響應式/非阻塞:R2DBC、Spring Data R2DBC 推動持久層向 Reactive Streams 演進。

選型建議

  • 團隊熟悉 SQL、需精細控制查詢計劃 → MyBatis。
  • 追求領域模型豐富、自動化 Schema 管理、緩存透明 → Hibernate/JPA。
  • 輕量級、無容器環境、簡單 CRUD → Spring Data JPA / JdbcTemplate + 手寫映射。

總結

ORM 解決的是「對象圖 ↔ 關係表」的映射與同步問題。理解其本質(阻抗失配的妥協與權衡)比熟練某框架 API 更重要。從 OJB 到 Hibernate 再到 JPA,核心思想始終是:讓領域模型驅動數據模型,而非相反。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved