[java] Hibernate與iBATIS


2 Answers

考慮一下你想要實現的目標。 通常, 命令查詢響應隔離模型適用於復雜域。

原因是你試圖通常做兩件事之一:

  1. 創建/更新/刪除一些複雜的域實體
  2. 運行分析獲取查詢(即求和/聚合查詢)

Hibernate適用於案例1,允許您創建POJO並持久/更新它。 它也可以快速完成,除非您的域名非常大。

myBatis非常適合您只需要答案的獲取查詢(案例2)。 Hibernate將嘗試加載整個對像圖,您需要使用LazyLoading技巧開始調優查詢,以使其在大型域上運行。 相反,如果您只是想要一些分析POJO頁面,那麼相同查詢的myBatis實現將是微不足道的。

因此,myBatis SELECTS的Hibernate更快

這兩種情況是您想要更改域數據的命令與您只想獲取某些數據的響應之間的區別。

因此,請考慮這兩種情況以及您的應用程序的作用。 如果您有一個簡單的域並且只是獲取信息,請使用myBatis。 如果您有一個複雜的域並持久化實體,請使用Hibernate。 如果兩者都做,請考慮採用混合方法。 這就是我們在項目中使用的,它擁有數千個實體來控制它。 ;)

Question

對於我們的新產品重新設計,我們正在從Java中選擇最佳框架。 考慮到模型的數據庫不可知方法,我們正在研究Struts + Spring與iBATIS或Hibernate之間的選項。 請提供最好的建議,因為兩者都提供持久性。




ORM與持久性框架

Hibernate是對象關係映射框架(ORM),它將Java類映射到數據庫表。 MyBatis是持久性框架 - 而不是ORM。 它將SQL語句映射到Java方法。

數據庫架構

Hibernate可以根據您的Java模型創建數據庫模式,而MyBatis沒有這樣的功能。 相關討論:

高速緩存

Hibernate具有一級緩存,無法禁用。 這意味著如果您通過ORM查詢項目然後直接使用SQL刪除它,它將保留在緩存中。 您可以顯式清除緩存以從數據庫中獲取最新的結果。 相關討論:

樂觀的鎖管理

樂觀鎖管理也存在差異:

MyBatis本身不支持樂觀並發控制,不像Hibernate / JPA這樣的ORM工具和@Version註釋。

相關討論:

延遲加載

Hibernate將嘗試加載整個對像圖,除了標記為延遲加載的對象。 myBatis將根據SQL查詢加載數據。 延遲加載可能會提高性能,但如果它與<property name="hibernate.enable_lazy_load_no_trans" value="true" />屬性一起使用,則可能導致連接洩漏。 相關討論:

Hibernate會話管理

保存,更新或刪除等實體操作是通過Hibernate Session執行的。 它需要很好地理解如何實現適當的Hibernate會話管理策略,以避免detached entity passed to persist和其他與Hibernate相關的現象。

有時,嘗試理解底層Hibernate行為可能需要花費更多時間,而不是為myBatis添加更多工作和編寫原始SQL語句。

級聯

Hibernate為對像圖提供了級聯,孤立刪除和其他功能,而它們不在myBatis中 - 為了實現它們,您需要顯式地編寫SQL查詢。

查詢

在myBatis中,您將編寫幾乎簡單的SQL查詢。 Hibernate有多種形式的查詢選項:SQL,HQL,Criteria API。 有時,如果條件中有許多可選字段,則可能適合使用Criteria API。 它將提供更加結構化的方法來形成查詢,並可能避免相關的錯誤。




Hibernate是一個ORM,意思是(在最基本的層面)它將java對象的實例映射到數據庫表中的實際行。 通常,對於通過Hibernate檢索的pojo:對這些pojo的任何操作和修改都將出現在數據庫中。 Hibernate將在適當的時候生成並執行相關的SQL。

Mybatis(最基本的級別)只是拼湊和執行存儲在xml文件中的SQL的工具。 它不會將Java對象的實例映射到數據庫表中的行,而是將Java方法映射到SQL語句,因此它不是ORM。 它當然也可以返回pojo,但它們並不依賴於任何類型的持久化上下文。

這兩個工具比上面描述的要多得多,但一個是ORM,一個不是。

我相信,使您能夠選擇使用哪個標準的標準主要取決於您必須使用的數據庫模型。

例如,想像一個龐大的蔓延模式,代表一些保險模型。 開發人員需要檢索數據,並以滿足手頭業務的方式與數據交互。

開發人員繼續前進,並且永遠不會期望擁有必要的業務知識來手工編寫所有 sql(Mybatis會要求)。 Hibernate適合這樣的場景。

業務分析師定義數據模型,實體,關係和交互,以及他們的專業知識。 然後Java開發人員使用Hibernate“走模型”。 業務開發人員可以快速高效地工作,而無需編寫複雜的容易出錯的SQL來在非常複雜的模式上運行。

在我的expierence中,Hibernate和Mybatis都在同一個項目中定期使用。

在哪裡使用Hibernate

  • 一般CRUD功能
  • '走''域對象'關係模型
  • 會話管理

以及Mybatis的使用地點

  • 即席查詢
  • 啟動(並與之交互)存儲過程
  • 支持非常具體或複雜的查詢
  • 支持複雜的搜索查詢,其中搜索條件是動態的,並且對結果進行分頁



Related