Java Web之理解 Hibernate And MyBatis

YungFan發表於2017-12-13

在JavaWeb開發中,最經典的就是SSH框架組合和SSM框架組合,現在很多IT公司願意使用SSM,對於這裡的H和M即Hibernate和MyBatis,今天簡單來說道說道。

班門弄斧

上課時,我經常跟學生說,學習任何一門技術,一定要弄明白:

  • What:這個東西是什麼?連這個技術是什麼都說不清,人家會相信你精通嗎?
  • Why:為什麼要用?不要盲目學,一門技術的產生肯定有其背後的原因,解決了一個什麼難題?還是簡化了開發等等?
  • When:什麼時候需要用?學完了不會靈活運用也不行。
  • How:怎麼用?首先最重要的弄清楚原理,多思考,多應用,多犯錯,才會成長。

知識講解

Hibernate和MyBatis都是很流行的ORM(物件關係對映,說白了就是一種和資料庫進行對映的技術)持久化層框架,其實質是還是對JDBC進行了封裝,方便我們使用,簡化我們的開發。先弄明白幾個問題:

  • 什麼是物件持久化:說白了就是把物件儲存到資料庫或者檔案中
  • 傳統開發:介面(View) --------- 業務層(SQL語句) --------- 資料庫
  • 產生的問題
    • 一旦更換底層的資料庫,很多操作都要重寫
    • JDBC冗餘程式碼過多(這是Hibernate發明的最初動力)
  • 引入持久層開發:介面(View) --------- 業務層(HQL語句、動態查詢語句) --------- 持久層 --------- 資料庫

為什麼引入持久層就可以解決這個問題呢?解析:在持久層可以引入一個機制,當作一個翻譯,針對底層不同的資料庫,把HQL語句、動態查詢語句翻譯成不同的SQL語句,這樣就解決了更換資料庫後也不需要改SQL語句的問題,而且程式碼量也會大大降低。 說的這麼好,那麼Hibernate和MyBatis到底是怎麼實現上述所說的方案的呢,也就是他們的ORM怎麼來實現?

Hibernate

在Hibernate中這個機制就是一個配置檔案hibernate.cfg.xml(放在src目錄下

<hibernate-configuration>
    <session-factory>
       <property name="connection.url">jdbc:mysql://localhost/hibernate</property>
       <property name="connection.username">root</property>
       <property name="connection.password">saber</property>
       <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
       <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
       <!-- ddl語句自動建表 -->
       <property name="hbm2ddl.auto">none</property>
       <property name="show_sql">true</property>
       <property name="format_sql">true</property>
       <!-- 連線池配置 -->
       <property name="hibernate.connection.provider_class">        
org.hibernate.service.jdbc.connections.internal.C3P0ConnectionProvider
       </property>
       <!-- 連線池中JDBC連線的最小數量。Hibernate預設為1 -->
       <property name="hibernate.c3p0.min_size">5</property>
       <!-- 連線池中JDBC連線的最大數量。Hibernate預設為100 -->
       <property name="hibernate.c3p0.max_size">20</property>
       <!-- 何時從連線池中移除一個空閒的連線(以秒為單位)時。預設為0,永不過期 -->
       <property name="hibernate.c3p0.timeout">300</property>
       <!-- 被快取的預編譯語句數量。用來提高效能。Hibernate預設為0,快取不可用-->
       <property name="hibernate.c3p0.max_statements">100</property>
       <!-- 一個連線被自動驗證前的閒置時間(以秒為單位)。Hibernate預設為0 -->
       <property name="hibernate.c3p0.idle_test_period">3000</property>
       <!-- 獨立執行緒執行,如果通過getCurrentSession()來獲得Session,需要設定如下-->
       <property name="current_session_context_class">thread</property>
       <!-- 對映持久化類  兩種方式-->
       <mapping class="com.serup.model.Teacher" />
       <mapping resource="com/serup/model/Teacher.hbm.xml" />
    </session-factory>
</hibernate-configuration>
複製程式碼

一旦專案換了資料庫,需要修改的就是這個檔案中的幾個屬性而已,業務層的邏輯程式碼不需要做任何修改。 使用Hibernate進行開發推薦這麼幹: ** Domain Object ----> Mapping ----> DataBase 也就是說物件和表要有一種對映,這種對映在Hibernate中有兩種配置方式**

  • 1、XML方式(類名.hbm.xml) 通過hbm檔案建立表和類的對映關係
  • 2、 Annotation方式 後來有了逆向工程,就簡單多了,直接通過資料庫表生成對應的檔案即可。

MyBatis

在MyBatis中這個機制也是靠一個配置檔案mybatis-config.xml(放在src目錄下

<configuration>
	<properties resource="sqlserverinfo.properties"/><!--資料庫的配置檔案-->
	<typeAliases>
		<package name="com.demo.domain"/> <!--掃描型別別名的包 也可以單獨掃描某個檔案-->
	</typeAliases>
	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC"/>
			<dataSource type="POOLED">
				<property name="driver" value="${driver}"/>
				<property name="url" value="${url}"/>
				<property name="username" value="${username}"/>
				<property name="password" value="${password}"/>
			</dataSource>
		</environment>
	</environments>
	<mappers>
	<!--對映檔案完成具體的crud操作 -->
	<mapper resource="com/demo/domain/UserMapper.xml"/>
	</mappers>
</configuration>
複製程式碼

這樣每次換資料庫,也只需要修改一下配置檔案即可。 使用MyBatis進行開發推薦這麼幹: ** 建資料庫,建立各種表 ---> 逆向工程自動生成MyBatis執行所需要的程式碼(mapper.java,mapper.xml、po..) ---> 根據業務邏輯寫控制層和服務層。**

不同點

網上有各種對比,我只談個人覺得的幾點不同的地方

1、Hibernate有一個物件導向的查詢語言叫HQL,這個非常強大,可以讓不會SQL語句的猿也可以進行資料庫的增刪改查,但這也是它的一個弱項,SQL語句不能進行優化。
2、MyBatis需要進行SQL語句的配置,也就是說還是需要資料庫的基礎知識才能上手的,而且初學者在結果對映那塊肯定遇到的坑很多。
3、沒做過特別大的專案,如果對效能沒特別特別的要求,HIbernate還是更容易實現功能。

相關文章