Mybatis的介紹

MyBatis的前身就是iBatis,iBatis本是apache的一個開源項目,2010年這個項目由apahce sofeware foundation 遷移到了google code,並且改名爲MyBatis。

iBATIS一詞來源於“internet”和“abatis”的組合,是一個基於Java的持久層框架。iBATIS提供的持久層框架包括SQL Maps和Data Access Objects(DAO),同時還提供一個利用這個框架開發的 JPetStore實例。(來源於百度)

總體來說 MyBatis 主要完成兩件事情

  1. 根據 JDBC 規範建立與數據庫的連接;
  2. 通過Annotaion/XML+JAVA反射技術,實現 Java 對象與關係數據庫之間相互轉化。

一、原理介紹

Mybatis的應用是圍繞着一個SqlSessionFactory實例展開的。SqlSessionFactoryBuilder根據XML映射文件創建SqlSessionFactory。

SqlSessionFactory由名字可以聯想到,可以通過它獲取一個SqlSession。SqlSession包含了執行sql所需要的所有方法,可以通過SqlSession實例直接運行映射的sql語句:

Java代碼 複製代碼 收藏代碼
  1. SqlSession session = sqlSessionFactory.openSession();
  2. try {
  3. Blog blog = session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101);
  4. } finally {
  5. session.close();
  6. }
SqlSession session = sqlSessionFactory.openSession();
try {
  Blog blog = session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101);
} finally {
  session.close();
}

上面的方法是基於Mybatis的舊版本,在最新的版本中有更清晰的方法,通過一個java接口作爲參數(e.g. BlogMapper.class)返回一個給定的sql映射。

Java代碼 複製代碼 收藏代碼
  1. SqlSession session = sqlSessionFactory.openSession();
  2. try {
  3. BlogMapper mapper = session.getMapper(BlogMapper.class);
  4. Blog blog = mapper.selectBlog(101);
  5. } finally {
  6. session.close();
  7. }
SqlSession session = sqlSessionFactory.openSession();
try {
  BlogMapper mapper = session.getMapper(BlogMapper.class);
  Blog blog = mapper.selectBlog(101);
} finally {
  session.close();
}

看到這裏,您可能會對什麼纔是SqlSession和Mapper類真正執行的sql語句非常好奇。下面我們看一下例子.

Xml代碼 複製代碼 收藏代碼
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  5. <mapper namespace="org.mybatis.example.BlogMapper">
  6. <select id="selectBlog" parameterType="int" resultType="Blog">
  7. select * from Blog where id = #{id}
  8. </select>
  9. </mapper>

這個例子非常簡單,是輕量級的。您可以定義衆多類似這樣的sql語句。這個文件在命名空間"org.mybatis.example.BlogMapper"中,定義了一個叫做"selectBlog"的sql語句。這樣就可以使用一個絕對唯一路徑“org.mybatis.example.BlogMapper.selectBlog”定位到這個sql語句上。如下所示:

Java代碼 複製代碼 收藏代碼
  1. Blog blog = (Blog) session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101);
Blog blog = (Blog) session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101);

注意這是一個絕對唯一的Java類調用方法如何類似這個名字可以直接映射到命名空間映射,以及具有相匹配的名稱、參數返回類型映射select語句方法這使得您可以簡單地調用映射接口方法這裏例子

Java代碼 複製代碼 收藏代碼
  1. BlogMapper mapper = session.getMapper(BlogMapper.class);
  2. Blog blog = mapper.selectBlog(101);
BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlog(101);

如您所見,第二種方法更簡潔,不需要返回值的cast。

到目前爲止,我們已經瞭解Mybatis如何將xml映射文件與Java類映射去執行sql語句的,具體xml映射文件的含義請查詢mybatis官方網站的資料,再此不在介紹。

二、spring的集成

在基本的 MyBatis 中,session 工廠可以使用 SqlSessionFactoryBuilder 來創建。而在MyBatis-Spring 中,則使用 SqlSessionFactoryBean 來替代。

要創建工廠 bean,放置下面的代碼在 Spring 的 XML 配置文件中:

Xml代碼 複製代碼 收藏代碼
  1. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  2. <property name="dataSource" ref="dataSource" />
  3. </bean>

要注意 SqlSessionFactoryBean 實現了 Spring 的 FactoryBean 接口(請參考Spring文檔的3.8 章節)這就說明了由Spring最終創建的bean不是SqlSessionFactoryBean本身。而是工廠類的getObject()返回的方法的結果。這種情況下,Spring將會在應用啓動時爲你創建SqlSessionFactory對象,然後將它以SqlSessionFactory爲名來存儲。在 Java中,相同的代碼是:

Java代碼 複製代碼 收藏代碼
  1. SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
  2. SqlSessionFactory sessionFactory = factoryBean.getObject();
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
SqlSessionFactory sessionFactory = factoryBean.getObject();

在一般的MyBatis-Spring 用法中,你不需要直接使用 SqlSessionFactoryBean或和其對應的SqlSessionFactory。相反,session工廠將會被注入到MapperFactoryBean或其它擴展了SqlSessionDaoSupport 的DAO(Data Access Object,數據訪問對象,譯者注)中。

下面給出一個完成的Mybatis-spring集成的例子:

Xml代碼 複製代碼 收藏代碼
  1. <context:property-placeholder location="classpath*:jdbc.properties" ignore-unresolvable="true"/>
  2. <!-- enable component scanning (beware that this does not enable mapper scanning!) -->
  3. <context:component-scan base-package="com.buybal.rxhuirr.db" />
  4. <!-- scan for mappers and let them be autowired -->
  5. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  6. <property name="basePackage" value="com.buybal.rxhuirr.db.data" />
  7. </bean>
  8. <!-- enable autowire -->
  9. <context:annotation-config />
  10. <bean id="testDb" class="org.apache.commons.dbcp.BasicDataSource"
  11. destroy-method="close">
  12. <property name="driverClassName" value="${driver}" />
  13. <property name="url" value="jdbc:mysql://10.0.0.20:3306/mybatis_demodb?defaultBatchValue=1000" />
  14. <property name="username" value="reportnew" />
  15. <property name="password" value="reportnew" />
  16. <property name="validationQuery" value="SELECT count(*) FROM users" />
  17. <property name="initialSize" value="10" />
  18. <property name="minIdle" value="5" />
  19. <property name="maxIdle" value="5" />
  20. </bean>
  21. <bean id="sqlSessionFactoryTestDb" class="org.mybatis.spring.SqlSessionFactoryBean">
  22. <property name="configLocation" value="classpath:mybatis-config.xml" />
  23. <property name="dataSource" ref="testDb" />
  24. </bean>

如有疑問,請查看Mybatis-spring集成的官方文檔。

三、代碼生成工具

經過前面的兩章,我們已經掌握了Mybatis的映射原理,並且可以集成進入到spring中使用了。但是童鞋們肯定會感覺Mybatis的配置文件和映射類的工作也十分的巨大,並且繁瑣,簡直就是望而生畏。

不過我們有強大的代碼生成工具幫我們自動生成xml映射文件和java映射類,它大大減輕了我們使用Mybatis的工作負擔!

首先,建議在eclipse上安裝Mybatis代碼生成工具的插件。插件地址請點擊我

安裝完畢,就可以在eclipse上自動生成Mybatis的文件了,程序員可以把自己的精力專注在業務邏輯上的開發,而不是Mybatis配置文件和映射類上面。

Mybatis代碼生成工具的原理是使用xml配置文件驅動的代碼生成工具。 配置文件解決了如下問題:

  1. 如何連接數據庫
  2. 生成哪些對象如何生成
  3. 哪些表要用來生成對象

詳細內容請查看官網的文檔

自動生成如下文件包括下面四個類型的組件:

Module類 數據庫的對象POJO(沒有實現Serializable接口,如使用緩存需要添加)
Example 用於拼動態sql的幫助類
XXXMapper.xml 映射文件(包括自動生成的動態sql部分)
XXXMapper.java 與映射文件對應的DAO接口

四、緩存

緩存技術是一種“以空間換時間”的設計理念,利用內存空間資源來提高數據檢索速度的有效手段之一。
MyBatis默認情況下是沒有開啓緩存的,除了局部的 session 緩存。要開啓二級緩存,你需要在你的 SQL映射文件中添加一行:

Xml代碼 複製代碼 收藏代碼
  1. <cache/>

這樣配置會開啓二級緩存,並且加載缺省的緩存配置。下面的例子說明了如何更改緩存策略和配置:

Xml代碼 複製代碼 收藏代碼
  1. <cache
  2. eviction="FIFO"
  3. flushInterval="60000"
  4. size="512"
  5. readOnly="true"/>

這個配置創建了一個 FIFO 緩存,並每隔 60 秒刷新,存取512 個結果對象或列表的引用,而且返回的對象爲只讀,因此在不同線程中的調用者之間修改它們會導致衝突。

注意:二級緩存是支持事物的,這意味着只有在SqlSession結束和提交的時候,或者當回滾結束並且插入、刪除、更新操作沒有配置flushCache=true,纔會更新緩存內容。

除了Mybatis自己提供的緩存,也可以使用第三方的分佈式緩存。要使用第三方的緩存需要實現Mybatis的緩存接口:

Java代碼 複製代碼 收藏代碼
  1. public interface Cache {
  2. String getId();
  3. int getSize();
  4. void putObject(Object key, Object value);
  5. Object getObject(Object key);
  6. boolean hasKey(Object key);
  7. Object removeObject(Object key);
  8. void clear();
  9. ReadWriteLock getReadWriteLock();
  10. }
public interface Cache {
  String getId();
  int getSize();
  void putObject(Object key, Object value);
  Object getObject(Object key);
  boolean hasKey(Object key);
  Object removeObject(Object key);
  void clear();
  ReadWriteLock getReadWriteLock();
}

然後只要在xml映射文件中,緩存配置的部分使用自己的實現類。

Xml代碼 複製代碼 收藏代碼
  1. <cache type="com.domain.something.MyCustomCache">
  2. <property name="cacheFile" value="/tmp/my-custom-cache.tmp"/>
  3. </cache>

更詳細的內容請直接查看官方網站的說明文檔

幸運的是,針對很多著名的第三方分佈式緩存,已經有了開源的插件,已經不需要我們自己開發緩存接口的實現了。下面拿我們公司DAL使用的Memcached爲例,已經有了開源的實現。如果使用maven管理項目,可以添加如下項目到maven的配置文件中引入Mybatis-Memcached框架:

Xml代碼 複製代碼 收藏代碼
  1. <dependency>
  2. <groupId>org.mybatis.caches</groupId>
  3. <artifactId>mybatis-memcached</artifactId>
  4. <version>1.0.0-beta1</version>
  5. </dependency>

然後在xml映射文件指定定製的Memcached緩存實現類:

Xml代碼 複製代碼 收藏代碼
  1. <mapper namespace="org.acme.FooMapper">
  2. <cache type="org.mybatis.caches.memcached.MemcachedCache" />
  3. ...
  4. </mapper>

具體的使用方法還請閱讀Mybatis-Memcached項目文檔

五、分庫

現在大型網站都有自己的分佈式DAL(Data access layer)層。如何在Mybatis上構建DAL,實現分庫表的配置,路由規則定製都有現實的實際應用價值。下面簡介一個Mybatis的分庫插件。

shardbatis是一個由國人貢獻的,Mybatis分庫分表插件。Shardbatis的名稱由shard(ing)+mybatis組合得到。詣在爲ibatis實現數據水平切分的功能。

Shardbatis0.9是在mybatis 2.3.5代碼的基礎上進行一些擴展實現數據水平切分功能。 數據的水平切分包括多數據庫的切分和多表的數據切分。目前shardbatis已經實現了單數據庫的數據多表水平切分。

Shardbatis2.0可以以插件的方式和mybatis3.x進行整合,對mybatis的代碼無侵入,不改變用戶對mybatis的使用習慣。Shardbatis2.0支持的功能和Shardbatis0.9基本相同。

shardbatis的使用與原生的mybatis3沒有區別,使用者只需要將shardbatis以Mybatis插件的方式引入進來,實現路由策略接口,實現自己的路由策略即可,此外還需要一個shard_config.xm配置文件,定義哪些sql映射操作需要使用路由策略。

更詳細的內容可以參考shardbatis官方文檔。以及iteye資料

六、其它基於Mybatis的項目和資料

1.CobarClient主要針對現有網站應用中使用iBatis做數據訪問層這一情況而設計開發,如果你的應用程序最初使用了Spring提供的SqlMapClientTemplate的話, 那遷移到CobarClient實際上僅僅是稍微改一下應用程序的配置而已.

項目地址:http://code.alibabatech.com/wiki/display/CobarClient/Home

2.http://blog.mybatis.org/

3.http://code.google.com/p/mybatis/

Mybatis從出生到現在已經有10歲了,最新的Mybatis項目是Mybatis for scala,相信在並行計算大行其道的今天,Mybatis一定會跟上時代的潮流,與時俱進,繼續保持在ORM框架裏面的霸主地位。

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