Hibernate與Mybatis

Hibernate

一:核心API介紹

HibernateAPI一共有6個 :session,sessionFactory,transaction,query,criteria,configuration.。通過這些接口可以對持久化對象進行存取、事務控制

Session

Session接口負責執行被持久化對象的CRUD操作(CRUD的任務是完成與數據庫的交流,包含了很多常見的SQL語句)。但需要注意的是Session對象是非線程安全的。

SessionFactory

SessionFactory接口負責初始化Hibernate。它充當數據存儲源的代理,並負責創建Session對象。這裏用到了工廠模式。需要注意的是SessionFactory並不是輕量級的,因爲一般情況下,一個項目通常只需要一個SessionFactory就夠,當需要操作多個數據庫時,可以爲每個數據庫指定一個SessionFactory

Transaction

Transaction 接口是一個可選的API,可以選擇不使用這個接口,取而代之的是Hibernate 的設計者自己寫的底層事務處理代碼。 Transaction 接口是對實際事務實現的一個抽象,這些實現包括JDBC的事務、JTA 中的UserTransaction、甚至可以是CORBA 事務。之所以這樣設計是能讓開發者能夠使用一個統一事務的操作界面,使得自己的項目可以在不同的環境和容器之間方便地移植。

Query

Query接口讓你方便地對數據庫及持久對象進行查詢,它可以有兩種表達方式:HQL語言或本地數據庫的SQL語句。Query經常被用來綁定查詢參數、限制查詢記錄數量,並最終執行查詢操作。

Criteria

Criteria接口與Query接口非常類似,允許創建並執行面向對象的標準化查詢。值得注意的是Criteria接口也是輕量級的,它不能在Session之外使用。

Configuration

Configuration 類的作用是對Hibernate 進行配置,以及對它進行啓動。在Hibernate 的啓動過程中,Configuration 類的實例首先定位映射文檔的位置,讀取這些配置,然後創建一個SessionFactory對象。雖然Configuration 類在整個Hibernate 項目中只扮演着一個很小的角色,但它是啓動hibernate 時所遇到的第一個對象。

 

二:操作Hibernite的api

1 new一個configuration  :  Configuration定位hibernate.cfg.xml 把對象和數據庫表的對應關係關聯起來。

2 .buildsessionfactory  :  創建SessionFactory對象,這是二級緩存 ,這個對象中封裝着很多session對象,session是我們的一級緩存。

3 .opensession  :  session的實現類是sessionimpl ,這個類裏面封裝了 jdbc的connection , ClassMetadata類去生成 sql語句與hbm配置文件和數據庫相關聯。

4 session進行save操作的時候要在上邊進行session的beginTransaction,下邊進行transaction的commit操作   :  transaction 接口有一個實現類叫 JDBCTransaction,hibernateBeginTranscation方法其實是調用了JDBCTransaction中的  begin 方法,他在 session中封裝了jdbcContext.connection().setAutoCommit(false) , 我們的 transactionCommit只不過是讓 jdbc的connection進行了commit提交的操作

 

三:配置文件解析 

1  Configration.configure.config(hibernate.cfg.xml)   這個方法把配置文件裏的對象轉換成了stream流對象。同時命名了一個與參數名相同的字符串。

2  Configration.doconfig(stream,resouce)  這個方法把上面的Stream流對象解析成document對象,然後繼續通doconfig(document)把document對象裏的子節點全部進行封裝,封裝的時候是通過parseSessionFactory類進行的封裝。

3  Configration.buildSessionFactory()  創建一個sessionFactory工廠 會把document對象轉換成 PersistentClass

4  sessionFactory.open() 創建一個會話
 

四:配置對象轉sql

ClassMetadata.SingleTableEntityPersister 把 PersistentClass 對象組裝成sql語句

hibernate生成的sql語句存在

AbstractEntityPersister.getSQLIdentityInsertString()

AbstractEntityPersister.postConstruct

AbstractEntityPersister.generateInsertString(boolean[] includeProperty, int j)

 

五:sql 執行

AbstractBatcher.getPreparedStatement 幫hibernate去執行sql語句

org.hibernate.jdbc.util.SQLStatementLogger 用來打印sql語句的,我們所有的sql提示都是在這裏打印

 

六:Hibernate的優化(粗略總結)

1、在處理大數據量時,會有大量的數據緩衝保存在Session的一級緩存中,這緩存大太時會嚴重顯示性能,所以在使用Hibernate處理大數據量時,可以使用session. clear()或者session. evict(Object) ,在處理過程中,清除全部的緩存或者清除某個對象。

2、通過使用Hibernate的一級緩存,二級緩存,查詢緩存等來提高性能

3、Hibernate可以通過設置hibernate.jdbc.Batch Size等屬性,對Hibernate進行優化。批量進行操作。

4、使用數據庫連接池(如C3P0,DBCP等)

5、在開發環境中開啓日誌的debug模式,但在生產環境中要註釋掉,從而提高程序的性能。

 

七:關於緩存

一級緩存:session級別

二級緩存:sessionFactory級別。類級別的緩存class-cache(以id作爲緩存的key) 和 查詢緩存query-cache(以查詢條件作爲緩存的key)。在項目中,我們一般不太實用hibernate原生的緩存機制,原因是不好管理。更多時候,我們在業務層使用自己寫的cache

三級緩存:查詢緩存,針對普通屬性結果集的緩存,對實體對象的結果集只緩存id。對query.list起作用,query.iterate不起作用。在執行query.list()之前,調用query.setCacheable(true);

 

Mybatis

一:配置文件解析

Mybatis有兩個配置文件

核心配置文件config.xml : 配置數據源連接池的信息 和 引入sql映射文件的信息

<transactionManager type="JDBC">
	<dataSource type="DBCP">
			<property name="JDBC.Driver" value="com.mysql.jdbc.Driver" />
			<property name="JDBC.ConnectionURL"
				value="jdbc:mysql://localhost:3306/sqltest?characterEncoding=UTF-8" />
			<property name="JDBC.Username" value="root" />
			<property name="JDBC.Password" value="" />
			<property name="Pool.MaximumActiveConnections" value="10" />
			<property name="Pool.MaximumIdleConnections" value="5" />
			<property name="Pool.MaximumWait" value="60000" />
			<property name="Pool.LogAbandoned" value="false" />
			<property name="Pool.RemoveAbandoned" value="false" />
			<property name="Pool.RemoveAbandonedTimeout" value="50000" />
	</dataSource>
</transactionManager>

<sqlMap resource="demo/ibatis/entity/User.xml" />
	

sql映射文件sqlMap.xml : 針對具體的表配置的一些預編譯語句,以及語句的輸入參數和返回結果類型

 

二:spring 配置文件 + mybatis

 <beans xmlns="http://www.springframework.org/schema/beans"  
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xmlns:context="http://www.springframework.org/schema/context"  
      xsi:schemaLocation="http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
      http://www.springframework.org/schema/context 
      http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 

    <!-- 配置數據源 BasicDataSource -->
    <bean  id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
		<property value="root" name="username" />
		<property value="123" name="password" />
		<property value="jdbc:mysql://localhost:3306/test" name="url" />
		<property value="com.mysql.jdbc.Driver" name="driverClassName" />
		<!-- 初始化鏈接 -->
		<property value="10" name="initialSize" />
		<!-- 最大活動鏈接 -->
		<property value="100" name="maxActive" />
		<!-- 最大鏈接 -->
		<property value="1000" name="maxIdle" />
		<!-- 最小鏈接 -->
		<property value="150" name="minIdle" />
		<!-- 超時時間 -->
		<property value="100" name="maxWait" />
	</bean>
      
    <!-- 二級緩存SqlSessionFactoryBean -->
    <!-- 添加mybaits與spring的結合包mybaits-spring 1.2.0.jar
         mybaits-spring 1.2.0.jar 中要配置的是mapperLocations加載 mybatis配置文件
         ref 到 datasource -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
      	<property name="dataSource" ref="dataSource"/>
      	<property name="mapperLocations" value="classpath:com.test.mapper.*.xml"/>
    </bean>
      
    <!-- mapperScannerConfig -->
    <!-- value 到 SqlSessionFactoryBean -->
    <bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
      	<property name="basePackage" value="com.test.mapper"/>
    </bean>
</beans>

 

 

Hibernate和Mybatis兩種ORM框架對比

兩者各自優勢

MyBatis可以進行更爲細緻的SQL優化,可以減少查詢字段。

MyBatis僅實現了SQL語句和對象的映射,需要針對具體的數據庫寫SQL語句,應對數據庫變化能力較強,SQL語句優化較爲方便。

MyBatis容易掌握,而Hibernate門檻較高。

Hibernate的DAO層開發比MyBatis簡單,Mybatis需要維護SQL和結果映射。

Hibernate對對象的維護和緩存要比MyBatis好,對增刪改查的對象的維護要方便。

Hibernate數據庫移植性很好,MyBatis的數據庫移植性不好,不同的數據庫需要寫不同SQL。

Hibernate有更好的二級緩存機制,可以使用第三方緩存。MyBatis本身提供的緩存機制不佳,更新操作不能指定刷新指定記錄,會清空整個表,但是也可以使用第三方緩存。

Hibernate 封裝性好,屏蔽了數據庫差異,自動生成SQL語句,應對數據庫變化能力較弱,SQL語句優化困難。

 

============待更新===========

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章