Mybatis技術特點:
好處:
通過直接編寫SQL語句,可以直接對SQL進行性能的優化;
學習門檻低,學習成本低。只要有SQL基礎,就可以學習mybatis,而且很容易上手;
由於直接編寫SQL語句,所以靈活多變,代碼維護性更好。
缺點:
不能支持數據庫無關性,即數據庫發生變更,要寫多套代碼進行支持,移植性不好。
Mysql:limit
Oracle:rownum
需要編寫結果映射。
Hibernate技術特點:
好處:
標准的orm框架,程序員不需要編寫SQL語句。
具有良好的數據庫無關性,即數據庫發生變化的話,代碼無需再次編寫。
以后,mysql數據遷移到oracle,只需要改方言配置
缺點:
學習門檻高,需要對數據關系模型有良好的基礎,而且在設置OR映射的時候,需要考慮好性能和對象模型的權衡。
程序員不能自主的去進行SQL性能優化。
Mybatis應用場景:
需求多變的互聯網項目,例如電商項目。
Hibernate應用場景:
需求明確、業務固定的項目,例如OA項目、ERP項目等。
詳細總結:
- JDBC : java data base connection,只是提供接口,由數據庫廠商實現。
- JDBCTemplate : 內嵌於Spring框架,對JDBC的封裝,缺點:沒有緩存
- Mybatis :注解+xml+Java反射技術
- Hibernate : 不用編寫sql,封裝HQL+分布式事務
一、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對象解析比較方便。
二、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);
三、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做不到
四、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優點
- 半自動的執行方式,除sql外操作由框架完成,方便快捷
- 手工定制sql,實現sql與java代碼分離,靈活性高,方便維護
- 只需要sql進行操作,不需要學習額外的內容
- 輕量級的框架,執行速度快
什么時候用mybaits
hibernate只適用於場景不太復雜,要求性能不太苛刻的時候
mybatis擁有動態列,動態表名,存儲過程支持,同時提供了簡易的緩存、日志、級聯,但是它的缺陷是需要你提供映射規則和sql,所以它的開發工作量比Hibernate略大一些
五、 JPA
JPA 概述
JPA 的全稱是 Java Persistence API, 即 Java 持久化 API,是 SUN 公司推出的一套基於ORM的規范,內部是由一系列的接口和抽象類構成。
JPA 通過 JDK 5.0 注解描述對象-關系表的映射關系,並將運行期的實體對象持久化到數據庫中。
JPA 與 與 hibernate 的關系
JPA 規范本質上就是一種 ORM 規范,注意不是 ORM 框架——因為 JPA 並未提供 ORM 實現,它只是制訂了一些規范,提供了一些編程的 API 接口,但具體實現則由服務廠商來提供實現。
- JPA 和 Hibernate 的關系就像 JDBC 和 JDBC 驅動的關系,JPA 是規范,Hibernate 除了作為 ORM 框架之外,它也是一種 JPA 實現。
- JPA 怎么取代 Hibernate 呢?JDBC 規范可以驅動底層數據庫嗎?答案是否定的,也就是說,如果使用 JPA 規范進行數據庫操作,底層需要 hibernate 作為其實現類完成數據持久化工作。
六、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
六、各種對比/區別
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