參考連結:https://www.bilibili.com/video/BV1NJ411C7DQ?p=45
java操作資料庫的原生API:jdbc。jdbc的作用是在java中執行SQL語句,這是java和資料庫連接配接的最基本API,Hibernate和Mybatis這些都是對jdbc進行封裝後的API。
請看下圖:即使沒有JPA(java持久化API),java依舊可以通過 jdbc API執行SQL語句 操作資料庫。但是會出現操作繁瑣等,需要寫大量的SQL語句。
而Hibernate、Mybatis等持久化架構封裝了jdbc API,是以java就可以通過Hibernate、Mybatis這些API操作資料庫(不需要寫大量的SQL語句)。但是java操作的是實體類對象,而資料庫中存放的是表,如何将他們聯系到一起對象和表聯系到一起,即通過java對象操作資料庫中的表呢?這是就需要ORM(對象關系映射)。
ORM思想:對象關系映射。主要目的:使得實體類對象和資料庫中的表聯系在一起。
ORM:Object-Relationl Mapping,它的作用是在關系型資料庫和對象之間作一個映射,這樣,我們在具體的操作資料庫的時候,就不需要再去和複雜的SQL語句打交道,隻要像平時操作對象一樣操作它就可以了。
簡單說:
1. 将關系型資料庫中的資料和Java中對象建立映射關系
2. 避免了編寫複雜的繁瑣的SQL語句
3. 操作資料就像操作對象一樣
主要建立兩個映射關系:實體類和表的映射關系;執行個體類中屬性和表的字段的映射關系。
實作了ORM思想的架構有:Hibernate和Mybatis等
JPA:前邊說到,ORM是一種對象關系映射思想,而現在JPA(Java Persistence API(Java持久層API)針對這一思想提出了一種規範。是以叫做JPA規範。JPA描述對象關系映射,将運作期的實體對象持久化到資料庫中,是以才叫java持久化API,而jdbc本身就是直接處理SQL語句的,本來就是持久化的。

Hibernate和Mybatis都是orm對象關系映射架構,都是用于将資料持久化的架構技術。
Hiberante較深度的封裝了jdbc,對開發者寫sql的能力要求的不是那麼的高,我們隻要通過hql語句操作對象即可完成對資料持久化的操作了。
另外hibernate可移植性好,如一個項目開始使用的是mysql資料庫,但是随着業務的發展,現mysql資料庫已經無法滿足目前的繡球了,現在決定使用Oracle資料庫,雖然sql标準定義的資料庫間的sql語句差距不大,但是不同的資料庫sql标準還是有差距的,那麼我們手動修改起來會存在很大的困難,使用hibernate隻需改變一下資料庫方言即可搞定。用hibernate架構,資料庫的移植變的非常友善。
但是hibernate也存在着諸多的不足,比如在實際開發過程中會生成很多不必要的sql語句耗費程式資源,優化起來也不是很友善,且對存儲過程支援的也不夠太強大。但是針對于hibernate它也提供了一些優化政策,比如說懶加載、緩存、政策模式等都是針對于它的優化方案。
Mybatis 也是對jdbc的封裝,但是封裝的沒有hibernate那麼深,我們可以再配置檔案中寫sql語句,可以根據需求定制sql語句,資料優化起來較hibernate容易很多。
Mybatis要求程式員寫sql的能力要相對使用hibernate的開發人員要高的多,且可移植性也不是很好。
涉及到大資料的系統使用Mybatis比較好,因為優化較友善。涉及的資料量不是很大且對優化沒有那麼高,可以使用hibernate
了解了JPA規範,就好了解jdbc規範,定義好jdbc規範後,各個廠家就可以去實作相應的連接配接驅動了,比如mysql驅動,他們都遵循jdbc規範
JDBC接口(API)包括兩個層次:
- 面向應用的API:
,抽象接口,供應用程式開發人員使用(連接配接資料庫,執行SQL語句,獲得結果)。Java API
- 面向資料庫的API:
,供開發商開發資料庫驅動程式用。Java Driver API
看看JDBC和JPA的差別:
文章開頭我們就說過了,沒有JPA,通過jdbc我們就可以實作一切,但是jdbc需要些大量SQL語句,太繁瑣,于是我們想着能不能直接操作實體類來操作資料庫,才出現了ORM思想,才有了JPA規範,才有了實作JPA規範的Hibernate和Mybatis,但是跟資料庫互動的隻能是jdbc規範,是以其實Hibernate和Mybatis這些架構封裝了jdbc,底層其實就是jdbc,jpa實作的架構底層還是用jdbc去和資料庫打交道。
- 不同标準:jdbc是資料庫的統一接口标準;jpa是orm架構的統一接口标準。
- 用法差別:jdbc更注重資料庫,orm則更注重于java代碼,但是實際上jpa實作的架構底層還是用jdbc去和資料庫打交道。
在真實開發過程中,我們隻需要在dao層編寫dao接口,不需要去編寫具體的實作類。
原因是程式會通過 動态代理 生成接口的實作類對象。