mybatis與hibernate的區別持久層對比【面試題】

Mybatis技術特色:

好處:html

經過直接編寫SQL語句,能夠直接對SQL進行性能的優化;java

學習門檻低,學習成本低。只要有SQL基礎,就能夠學習mybatis,並且很容易上手;mysql

因爲直接編寫SQL語句,因此靈活多變,代碼維護性更好。程序員

缺點:面試

不能支持數據庫無關性,即數據庫發生變動,要寫多套代碼進行支持,移植性很差。spring

Mysql:limitsql

Oracle:rownum數據庫

須要編寫結果映射。apache

Hibernate技術特色:

好處:編程

標準的orm框架,程序員不須要編寫SQL語句。

具備良好的數據庫無關性,即數據庫發生變化的話,代碼無需再次編寫。

之後,mysql數據遷移到oracle,只須要改方言配置

缺點:

學習門檻高,須要對數據關係模型有良好的基礎,並且在設置OR映射的時候,須要考慮好性能和對象模型的權衡。

程序員不能自主的去進行SQL性能優化。

 

Mybatis應用場景:

需求多變的互聯網項目,例如電商項目。

Hibernate應用景:

需求明確、業務固定的項目,例如OA項目、ERP項目等。

詳細總結:

  1. JDBC : java data base connection,只是提供接口,由數據庫廠商實現。
  2. JDBCTemplate : 內嵌於Spring框架,對JDBC的封裝,缺點:沒有緩存
  3. Mybatis :註解+xml+Java反射技術
  4. Hibernate : 不用編寫sql,封裝HQL+分佈式事務

 

1、JDBC
介紹
JDBC(Java DataBase Connectivity ,java數據庫鏈接技術) 用來訪問各類數據庫 。JDBC 規範定義接口 , 具體的實現由各大數據庫廠商來實現。每一個數據庫廠商根據自家數據庫的通訊格式編寫好本身數據庫的驅動,數據庫驅動由數據庫廠商提供。

 

開發步驟
開發步驟:
咱們平時使用jdbc進行編程,大體須要下面幾個步驟:
1,使用jdbc編程須要鏈接數據庫,註冊驅動和數據庫信息
2,操做Connection,打開Statement對象
3,經過Statement對象執行SQL,返回結果到ResultSet對象
4,使用ResultSet讀取數據,而後經過代碼轉化爲具體的POJO對象
5,關閉數據庫相關的資源
優缺點
使用 JDBC 的好處:

咱們只須要會調用 JDBC 接口中的方法便可,使用簡單
使用同一套 Java 代碼,進行少許的修改就能夠訪問其餘 JDBC 支持的數據庫
jdbc的缺點:
一:工做量比較大,編程複雜;須要鏈接,而後處理jdbc底層事務,處理數據類型,

二:須要操做Connection,Statement對象和ResultSet對象去拿數據並關閉他們。

 JDBC缺點和解決參考方案:

         1,數據庫鏈接建立,釋放繁瑣形成系統資源浪費,從而影響系統性能,若是能使用數據庫鏈接池可解決此問題。

         2,Sql語句在代碼中硬編碼,形成代碼不易維護,實際應用Sql變化可能較大,若是sql一變更就要更改java代碼。

         3,使用PreparedStatement向佔位符傳參存在硬編碼,由於Sql語句的where條件不必定,可能多也可能少,修改sql還要修改java代碼,系統不易維護。

        4,對結果集解析存在硬編碼(列名),sql變化致使解析的java代碼變化,系統不易維護,若是能將數據庫庫封裝成pojo對象解析比較方便。

 

2、JDBCTemplate

     

  JdbcTemplate針對數據查詢提供了多個重載的模板方法,你能夠根據須要選用不一樣的模板方法.若是你的查詢很簡單,僅僅是傳入相應SQL或者相關參數,而後取得一個單一的結果,那麼你能夠選擇一組便利的模板方法

  • 優勢:運行期:高效、內嵌Spring框架中、支持基於AOP的聲明式事務
  • 缺點:必須於Spring框架結合在一塊兒使用、不支持數據庫跨平臺、默認沒有緩存

JDBC已經可以知足大部分用戶最基本的需求,

可是在使用JDBC時,必須本身來管理數據庫資源如:獲取

PreparedStatement,設置SQL語句參數,關閉鏈接等步驟。

JDBCTemplate就是Spring對JDBC的封裝,目的是使JDBC更加易於使用。

JDBCTemplate是Spring的一部分。 

JDBCTemplate處理了資源的創建和釋放。

他幫助咱們避免一些常見的錯誤,好比忘了總要關閉鏈接。​

他運行核心的JDBC工做流,如Statement的創建和執行,而咱們只須要提供SQL語句和提取結果。

使用JdbcTemplate編程咱們只須要作如下步驟:

1)提供SQL語句和佔位符的值

2)獲得封裝好的查詢結果集   

 

使用步驟

使用步驟  

1) 導入依賴的jar包(c3p0鏈接池、mysql驅動、spring相關)

2) 準備鏈接池

3) 建立 JdbcTemplate 對象,傳入鏈接池對象

4) 編寫SQL語句

5) 調用 execute()執行 DDL、update()執行 DML、queryXxx()執行 DQL 等方法

 

jdbcTemplate.queryForObject("select * from user where name=? and password=?",
                                                             new BeanPropertyRowMapper<>(User.class), name, password);

 

3、Hibernate
ORM模型
ORM取代了JDBC,全部的ORM模型都是基於JDBC進行封裝的,不一樣ORM模型對JDBC封裝的強度是不同的

ORM

對象關係映射(Object Relational Mapping),簡單的說ORM框架就是數據庫的表和簡單Java對象的映射關係模型,咱們經過這層映射關係就能夠簡單迅速地把數據庫表的數據轉化爲POJO
如圖

Hibernate介紹

       Hibernate對數據庫結構提供了較爲完整的封裝,Hibernate的O/R Mapping實現了POJO 和數據庫表之間的映射,以及SQL 的自動生成和執行。程序員每每只需定義好了POJO 到數據庫表的映射關係,

便可經過Hibernate 提供的方法完成持久層操做。程序員甚至不須要對SQL 的熟練掌握, Hibernate/OJB 會根據制定的存儲邏輯,自動生成對應的SQL 並調用JDBC 接口加以執行。

執行過程
1、讀取配置文件完成ORM的映射關係
2、獲取session進行增刪改查的操做

hibernate工做原理:
1、經過Configuration().configure();讀取並解析hibernate.cfg.xml配置文件。
2、由hibernate.cfg.xml中的<mappingresource="com/xx/User.hbm.xml"/>讀取解析映射信息。
3、經過config.buildSessionFactory();//獲得sessionFactory。
4、sessionFactory.openSession();//獲得session。
5、session.beginTransaction();//開啓事務。
6、persistent operate;
7、session.getTransaction().commit();//提交事務
8、關閉session;
9、關閉sessionFactory;

Hibernate優點

  • 消除了代碼的映射規則,它所有被分離到了XML或者註解裏面去配置
  • 無需再管理數據庫鏈接,它也能夠配置在XML裏面
  • 一個會話中,不要操做多個對象,只要操做Session對象便可
  • 關閉資源只須要關閉一個Session即可

   這就是Hibernate的優點,在配置了映射文件和數據庫鏈接文件後,Hibernate就能夠經過Session操做,很是容易,消除了jdbc帶來的大量代碼,大大提升了編程的簡易性和可讀性。

Hibernate還提供了級聯,緩存,映射,一對多等功能。Hibernate是全表映射,經過HQL去操做pojo進而操做數據庫的數據。

Hibernate缺陷
全表映射帶來了不便,好比更新時須要發送全部的字段
沒法根據不一樣的條件組裝不一樣的SQL
對多表關聯和複雜SQL查詢支持較差,須要本身寫SQL,返回後,須要本身將數據組裝爲POJO
不能有效支持存儲過程
雖然有HQL,可是性能較差, 大型互聯網系統每每須要優化SQL,而hibernate作不到

4、Mybatis

       爲了解決Hibernate的不足,一個半自動映射的框架MyBatis應運而生

mybatis是一個java持久層框架,它封裝少、高性能·可優化、維護簡單等優勢成爲了目前java移動互聯網網站服務的首選持久層框架,它特別適合分佈式和大數據網絡數據庫編程

之因此稱它爲半自動,是由於它須要手工匹配提供POJO、SQL和映射關係,而全表映射的Hibernate只須要提供POJO和映射關係即可

 

歷史
Mybaits的前身是Apache的一個開源項目iBatis,2010年這個項目由apache software foundation 遷移到了 google code 而且更名爲Mybatis,2013年11月遷移到Github,目前mybaits是由Github維護的

名稱
iBatis一詞來源於「internet」和「abatis」的組合

mybaits所須要提供的映射文件包含如下三個部分

  • SQL
  • 映射規則
  • POJO

 

 

Mybatis優勢

  1. 半自動的執行方式,除sql外操做由框架完成,方便快捷
  2. 手工定製sql,實現sql與java代碼分離,靈活性高,方便維護
  3. 只須要sql進行操做,不須要學習額外的內容
  4. 輕量級的框架,執行速度快

何時用mybaits
  hibernate只適用於場景不太複雜,要求性能不太苛刻的時候
mybatis擁有動態列,動態表名,存儲過程支持,同時提供了簡易的緩存、日誌、級聯,可是它的缺陷是須要你提供映射規則和sql,因此它的開發工做量比Hibernate略大一些

5、 JPA

JPA 概述
JPA 的全稱是 Java Persistence API, 即 Java 持久化 API,是 SUN 公司推出的一套基於ORM的規範,內部是由一系列的接口和抽象類構成。
JPA 經過 JDK 5.0 註解描述對象-關係表的映射關係,並將運行期的實體對象持久化到數據庫中。

JPA 與 與 hibernate 的關係
JPA 規範本質上就是一種 ORM 規範,注意不是 ORM 框架——由於 JPA 並未提供 ORM 實現,它只是制訂了一些規範,提供了一些編程的 API 接口,但具體實現則由服務廠商來提供實現。

 

  1. JPA 和 Hibernate 的關係就像 JDBC 和 JDBC 驅動的關係,JPA 是規範,Hibernate 除了做爲 ORM 框架以外,它也是一種 JPA 實現。
  2. JPA 怎麼取代 Hibernate 呢?JDBC 規範能夠驅動底層數據庫嗎?答案是否認的,也就是說,若是使用 JPA 規範進行數據庫操做,底層須要 hibernate 做爲其實現類完成數據持久化工做。

6、Spring Data JPA的概述

      Spring Data JPA 是 Spring 基於 ORM 框架、JPA 規範的基礎上封裝的一套JPA應用框架,可以使開發者用極簡的代碼便可實現對數據庫的訪問和操做。它提供了包括增刪改查等在內的經常使用功能,且易於擴展!學習並使用 Spring Data JPA 能夠極大提升開發效率!

Spring Data JPA 讓咱們解脫了DAO層的操做,基本上全部CRUD均可以依賴於它來實現,在實際的工做工程中,推薦使用Spring Data JPA + ORM(如:hibernate)完成操做,這樣在切換不一樣的ORM框架時提供了極大的方便,同時也使數據庫層操做更加簡單,方便解耦

1.2 Spring Data JPA的特性

          SpringData Jpa 極大簡化了數據庫訪問層代碼。 如何簡化的呢? 使用了SpringDataJpa,咱們的dao層中只須要寫接口,就自動具備了增刪改查、分頁查詢等方法。

1.3 Spring Data JPA 與 JPA和hibernate之間的關係

  JPA是一套規範,內部是有接口和抽象類組成的。hibernate是一套成熟的ORM框架,並且Hibernate實現了JPA規範,因此也能夠稱hibernate爲JPA的一種實現方式,咱們使用JPA的API編程,意味着站在更高的角度上看待問題(面向接口編程)

Spring Data JPA是Spring提供的一套對JPA操做更加高級的封裝,是在JPA規範下的專門用來進行數據持久化的解決方案。

1.4 Spring Data JPA的快速入門
https://blog.csdn.net/qq_42806915/article/details/82707783

6、各類對比/區別
Hibernate 與 mybaits 的對比
 http://www.elecfans.com/d/638827.html

jdbc,mybatis,hibernate的區別

1)從層次上看,
  • JDBC是較底層的持久層操做方式,
  • 而Hibernate和MyBatis都是在JDBC的基礎上進行了封裝使其更加方便程序員對持久層的操做。
2)從功能上看,
  • JDBC就是簡單的創建數據庫鏈接,而後建立statement,將sql語句傳給statement去執行,若是是有返回結果的查詢語句,會將查詢結果放到ResultSet對象中,經過對ResultSet對象的遍歷操做來獲取數據;
  • Hibernate是將數據庫中的數據表映射爲持久層的Java對象,對sql語句進行修改和優化比較困難;
  • MyBatis是將sql語句中的輸入參數和輸出參數映射爲java對象,sql修改和優化比較方便.
3)從使用上看,
  • 若是進行底層編程,並且對性能要求極高的話,應該採用JDBC的方式;
  • 若是要對數據庫進行完整性控制的話建議使用Hibernate;
  • 若是要靈活使用sql語句的話建議採用MyBatis框架。

參考資料:

HIbernate和Mybatis的區別和優劣勢:https://www.imooc.com/article/27839?block_id=tuijian_wz

 

經過Java經典面試題之MyBatis與Hibernate的區別深刻了解MyBatis:http://baijiahao.baidu.com/s?id=1598595163822471051&wfr=spider&for=pc

相關文章
相關標籤/搜索