MyBatis
在移動互聯網時代,MyBatis 成為了目前互聯網 Java 持久框架的首選,
MyBatis 本是 Apache 的一個開源專案——iBatis,2010 年這個專案由 Apache Software Foundation 遷移到了 Google Code,并且改名為 MyBatis,
MyBatis 是一個基于 Java 的持久層框架,MyBatis 提供的持久層框架包括 SQL Maps 和 Data Access Objects(DAO),它消除了幾乎所有的 JDBC 代碼和引數的手工設定以及結果集的檢索,
MyBatis 使用簡單的 XML 或注解用于配置和原始映射,將介面和 Java 的 POJOs(Plain Old Java Objects,普通的 Java 物件)映射成資料庫中的記錄,
目前,Java 的持久層框架產品有許多,常見的有 Hibernate 和 MyBatis,
Hibernate 和 MyBatis 的區別
1. sql優化方面
- Hibernate 不需要撰寫大量的 SQL,就可以完全映射,提供了日志、快取、級聯(級聯比 MyBatis 強大)等特性,此外還提供 HQL(Hibernate Query Language)對 POJO 進行操作,但會多消耗性能,
- MyBatis 手動撰寫 SQL,支持動態 SQL、處理串列、動態生成表名、支持存盤程序,作業量相對大些,
2.開發方面
- MyBatis 是一個半自動映射的框架,因為 MyBatis 需要手動匹配 POJO、SQL 和映射關系,
- Hibernate 是一個全表映射的框架,只需提供 POJO 和映射關系即可,
3. Hibernate 優勢
- Hibernate 的 DAO 層開發比 MyBatis 簡單,Mybatis 需要維護 SQL 和結果映射,
- Hibernate 對物件的維護和快取要比 MyBatis 好,對增刪改查的物件的維護要方便,
- Hibernate 資料庫移植性很好,MyBatis 的資料庫移植性不好,不同的資料庫需要寫不同 SQL,
- Hibernate 有更好的二級快取機制,可以使用第三方快取,MyBatis 本身提供的快取機制不佳,
4. MyBatis 優勢
- MyBatis 可以進行更為細致的 SQL 優化,可以減少查詢欄位,
- MyBatis 容易掌握,而 Hibernate 門檻較高,
總的來說,MyBatis 是一個小巧、方便、高效、簡單、直接、半自動化的持久層框架,Hibernate 是一個強大、方便、高效、復雜、間接、全自動化的持久層框架,
所以對于性能要求不太苛刻的系統,比如管理系統、ERP 等推薦使用 Hibernate,而對于性能要求高、回應快、靈活的系統則推薦使用 MyBatis,
properties(屬性)
這些屬性可以在外部進行配置,并可以進行動態替換,你既可以在典型的 Java 屬性檔案中配置這些屬性,也可以在 properties 元素的子元素中設定,例如:
<properties resource="org/mybatis/example/config.properties">
<property name="username" value="root"/>
<property name="password" value="990106"/>
</properties>
設定好的屬性可以在整個組態檔中用來替換需要動態設定的屬性值,比如:
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
這個例子中的 username 和 password 將會由 properties 元素中設定的相應值來替換, driver 和 url 屬性將會由 config.properties 檔案中對應的值來替換,這樣就為配置提供了諸多靈活選擇,也可以在 SqlSessionFactoryBuilder.build() 方法中傳入屬性值,例如:
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, props);
// ... 或者 ...
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, environment, props);
如果一個屬性在不只一個地方進行了配置,那么,MyBatis 將按照下面的順序來加載:
- 首先讀取在 properties 元素體內指定的屬性,
- 然后根據 properties 元素中的 resource 屬性讀取類路徑下屬性檔案,或根據 url 屬性指定的路徑讀取屬性檔案,并覆寫之前讀取過的同名屬性,
- 最后讀取作為方法引數傳遞的屬性,并覆寫之前讀取過的同名屬性,
因此,通過方法引數傳遞的屬性具有最高優先級,resource/url 屬性中指定的組態檔次之,最低優先級的則是 properties 元素中指定的屬性,
從 MyBatis 3.4.2 開始,你可以為占位符指定一個默認值,例如:
<dataSource type="POOLED">
<!-- ... -->
<property name="username" value="${username:ut_user}"/>
<!-- 如果屬性 'username' 沒有被配置,'username' 屬性的值將為 'ut_user' -->
</dataSource>
這個特性默認是關閉的,要啟用這個特性,需要添加一個特定的屬性來開啟這個特性,例如:
<properties resource="org/mybatis/example/config.properties">
<!-- ... -->
<property name="org.apache.ibatis.parsing.PropertyParser.enable-default-value" value="true"/>
<!-- 啟用默認值特性 -->
</properties>
如果你在屬性名中使用了 “:” 字符(如:db:username),或者在 SQL 映射中使用了 OGNL 運算式的三元運算子(如: ${tableName != null ? tableName : ‘global_constants’}),就需要設定特定的屬性來修改分隔屬性名和默認值的字符,例如:
<properties resource="org/mybatis/example/config.properties">
<!-- ... -->
<property name="org.apache.ibatis.parsing.PropertyParser.enable-default-value" value="true"/>
<!-- 啟用默認值特性 -->
</properties>
<dataSource type="POOLED">
<!-- ... -->
<property name="username" value="${db:username?:ut_user}"/>
</dataSource>
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/186503.html
標籤:其他
上一篇:如何解決windows系統錯誤1079:此服務的帳戶不同于運行于同一行程上的其他服務的帳戶
下一篇:尚硅谷-MySQL流程控制結構
