天天看點

Mybatis學習---了解Mybatis

什麼是Mybatis

      對MyBatis 是支援普通 SQL 查詢,存儲過程和進階映射的優秀持久層架構。MyBatis 消除 了幾乎所有的 JDBC 代碼和參數的手工設定以及結果集的檢索。MyBatis 使用簡單的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Object,普通的 Java 對象)映射成資料庫中的記錄。(摘自MyBatis官網)

MyBatis與Ibatis

       對于從事 Java EE 的開發人員來說,iBatis 是一個再熟悉不過的持久層架構了,在 Hibernate、JPA 這樣的一站式對象 / 關系映射(O/R Mapping)解決方案盛行之前,iBaits 基本是持久層架構的不二選擇。即使在持久層架構層出不窮的今天,iBatis 憑借着易學易用、輕巧靈活等特點,也仍然擁有一席之地。尤其對于擅長 SQL 的開發人員來說,iBatis 對 SQL 和存儲過程的直接支援能夠讓他們在獲得 iBatis 封裝優勢的同時而不喪失 SQL 調優的手段,這是 Hibernate/JPA 所無法比拟的。具體而言,使用 iBatis 架構的主要優勢主要展現在如下幾個方面:

      首先,iBatis 封裝了絕大多數的 JDBC 樣闆代碼,使得開發者隻需關注 SQL 本身,而不需要花費精力去處理例如注冊驅動,建立 Connection,以及確定關閉 Connection 這樣繁雜的代碼。

      其次,iBatis 可以算是在所有主流的持久層架構中學習成本最低,最容易上手和掌握的架構。雖說其他持久層架構也号稱門檻低,容易上手,但是等到你真正使用時會發現,要想掌握并用好它是一件非常困難的事。在工作中我需要經常參與面試,我曾聽到過很多位應聘者描述,他們所在的項目在技術選型時選擇 Hibernate,後來發現難以駕馭,不得不将代碼用 JDBC 或者 iBatis 改寫。

      iBatis 自從在 Apache 軟體基金會網站上釋出至今,和他的明星兄弟們(Http Server,Tomcat,Struts,Maven,Ant 等等)一起接受者萬千 Java 開發者的敬仰。然而在2010年六月中旬,幾乎是釋出 3.0 版本的同時,iBatis 首頁上的一則 “Apache iBATIS has been retired” 的聲明在社群引起了一陣不小的波瀾。在 Apache 寄居六年之後,iBatis 将代碼托管到 Google Code。在聲明中給出的主要理由是,和 Apache 相比,Google Code 更有利于開發者的協同工作,也更能适應快速釋出。于此同時,iBatis 更名為 MyBatis。

MyBatis幾個重要的概念

       SqlSessionFactory和SqlSessionFactoryBuild:

      也不是說核心,其實Mybatis是以對資料庫的操作都需要SqlSessionFactory這個執行個體(我的了解也就相當于一般JDBC連接配接池的作用),是通過SqlSessionFactoryBuilder這個類來建立的。在源碼裡面我們可以看到,他主要有以下三個方法:

public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) 

public SqlSessionFactory build(Reader reader, String environment, Properties properties)

public SqlSessionFactory build(Configuration config)

      而其他方法基本上都是用這三個簽名方法,如隻是調用了build(inputStream,null,null).就可以實作public SqlSessionFactory build(InputStream inputStream).

InputStream : 一般指的是輸入流,用來描述映射的一些輸入流。

Environment:是指運作環境,這裡不多介紹,後面涉及到多環境資料庫配置時會将到。

Properties :屬性是用來描述屬性,如資料庫連接配接屬性。

建立SqlSessionFactory 的方式(此部分可以在官方文檔裡找到執行個體):

      1.通過XML建立

      從 XML 檔案中建構 SqlSessionFactory 的執行個體非常簡單。這裡建議你使用類路徑下的資 源檔案來配置,但是你可以使用任意的 Reader 執行個體,這個執行個體包括由文字形式的檔案路徑 或 URL 形式的檔案路徑 file://來建立。MyBatis 包含了一些稱作為資源的工具類,這些工具類包含一些方法,這些方法使得從類路徑或其他位置加載資源檔案更加簡單。

String resource = "org/mybatis/example/mybatis-config.xml";

InputStream inputStream = Resources.getResourceAsStream(resource);

sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

XML文檔執行個體:

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE configuration

  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"

  "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>

  <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>

    <mapper resource="org/mybatis/example/BlogMapper.xml"/>

  </mappers>

</configuration>

   2.通過java類建立

      如果你喜歡從 Java 程式而不是 XML 檔案中直接建立配置執行個體, 或建立你自己的配置建構器,MyBatis 也提供完整的配置類。

DataSource dataSource = BlogDataSourceFactory.getBlogDataSource();

TransactionFactory transactionFactory = new JdbcTransactionFactory();

Environment environment = new Environment("development", transactionFactory, dataSource);

Configuration configuration = new Configuration(environment);

configuration.addMapper(BlogMapper.class);

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);

      這些配置都是從java類中擷取的,一般情況下,我們都習慣用XML配置,因為我們通常要與其他架構(如Spring)整合,以便于更好的管理我們的項目。

SqlSession

      在我的了解,一個session執行個體就是一次對資料庫的操作的會話過程,一次事物完成了,他也就自動銷毀了。我們應該從factory裡面擷取SqlSession,如:

SqlSession session = sqlSessionFactory.openSession();

try {

  Blog blog = (Blog) session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101);

} finally {

  session.close();

}

Mapper

      Mapper映射器是你建立綁定映射語句的接口。也就是你配置的對資料庫操作的方法的接口。相當于DAO的概念了,但又有不同的地方。

它們的範圍和生命周期

SqlSessionFactoryBuilder

      這個類可以被執行個體化,使用和丢棄。一旦你建立了 SqlSessionFactory 後,這個類就不需 要存在了。 是以 SqlSessionFactoryBuilder 執行個體的最佳範圍是方法範圍 (也就是本地方法變量)。 你可以重用 SqlSessionFactoryBuilder 來建立多個 SqlSessionFactory 執行個體, 但是最好的方式是 不需要保持它一直存在來保證所有 XML 解析資源,因為還有更重要的事情要做。

SqlSessionFactory

        一旦被建立,SqlSessionFactory 應該在你的應用執行期間都存在。沒有理由來處理或重 新建立它。 使用 SqlSessionFactory 的最佳實踐是在應用運作期間不要重複建立多次。 這樣的 操作将被視為是非常糟糕的。 是以 SqlSessionFactory 的最佳範圍是應用範圍。 有很多方法可 以做到, 最簡單的就是使用單例模式或者靜态單例模式。

SqlSession

          每個線程都應該有它自己的 SqlSession 執行個體。SqlSession 的執行個體不能被共享,也是線程 不安全的。是以最佳的範圍是請求或方法範圍。絕對不能将 SqlSession 執行個體的引用放在一個 類的靜态字段甚至是執行個體字段中。 也絕不能将 SqlSession 執行個體的引用放在任何類型的管理範 圍中, 比如 Serlvet 架構中的 HttpSession。 如果你現在正用任意的 Web 架構, 要考慮 SqlSession 放在一個和 HTTP 請求對象相似的範圍内。換句話說,基于收到的 HTTP 請求,你可以打開 了一個 SqlSession,然後傳回響應,就可以關閉它了。關閉 Session 很重要,你應該確定使 用 finally 塊來關閉它。下面的示例就是一個確定 SqlSession 關閉的基本模式:

SqlSession session = sqlSessionFactory.openSession();

try {

  // do work

} finally {

  session.close();

}

              在你的代碼中一貫地使用這種模式, 将會保證所有資料庫資源都正确地關閉 (假設你沒有通過你自己的連接配接關閉,這會給 MyBatis 造成一種迹象表明你要自己管理連接配接資源,造成資源的浪費) 。

Mapper 執行個體

            映射器是你建立綁定映射語句的接口。映射器接口的執行個體可以從 SqlSession 中獲得。那 麼從技術上來說,當被請求時,任意映射器執行個體的最寬範圍和 SqlSession 是相同的。然而, 映射器執行個體的最佳範圍是方法範圍。也就是說,它們應該在使用它們的方法中被請求,然後 就抛棄掉。它們不需要明确地關閉,那麼在請求對象中保留它們也就不是什麼問題了,這和 SqlSession 相似。你也許會發現,在這個水準上管理太多的資源的話會失控。保持簡單,将映射器放在方法範圍内。

本文部分概念摘自Mybatis官網。