MyBatis使用心得(一)--- 簡單介紹

 Mybatis的前身是iBatis,iBatis本來就是apache的一個開源項目,2010年該項目有apache遷移到了google code,並更名爲MyBatis。

1. 簡介
    MyBatis支持普通SQL查詢,存儲過程和高級映射的優秀持久層框架,消除了幾乎全部的JDBC代碼和參數的手動設置以及結果集的檢索。MyBatis可使用XML或者註解用於配置和映射,將接口和JavaBean映射成數據庫的記錄。
    每個MyBatis的應用程序都以一個SqlSessionFactory對象的實例爲核心。SqlSessionFactory對象的實例能夠經過SqlSessionFactoryBuilder對象來得到,SqlSessionFactoryBuilder對象能夠從XML配置文件或從Configuration類得到。例如:
java

String resource = "com/alvinliang/mybatis/mybatis-config.xml";
InputStream is= Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);

    XML配置文件包含了對MyBatis系統的核心設置,有獲取數據庫鏈接實例的數據源和決定事務範圍和控制事務管理器。詳細內容後面會講,這裏給出一個簡單示例: sql

<?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="com/alvinliang/mybatis/BlogMapper.xml"/>
  </mappers>
</configuration>

還有不少能夠配置,上面指出了最關鍵的部分。environment元素體裏包含對事務管理和鏈接池的環境配置。mapppers元素包含了全部mapper映射器,這些mapper的xml文件包含了SQL代碼和映射定義信息。 數據庫

2. 整體流程
(1) 加載配置並初始化
  觸發條件:加載配置文件,將SQL配置文件加載成一個個MappedStatement對象。
(2) 接受調用請求
  觸發條件:調用MyBatis提供的API
  傳入參數:爲SQL的ID和傳入參數對象
  處理過程:將請求傳遞給下層的請求的處理層進行處理。
(3) 處理操做請求
  觸發條件:API接口層傳遞請求過來
  傳入參數:爲SQL的ID和傳入參數對象
  處理過程:
    (A)根據SQL的ID查找對應的MappedStatement對象。
    (B)根據傳入參數對象解析MappedStatement對象,獲得最終要執行的SQL和執行傳入參數。
    (C)獲取數據庫鏈接,根據獲得的最終SQL語句和執行傳入參數到數據庫執行,並獲得執行結果。
    (D)根據MappedStatement對象中的結果映射配置對獲得的執行結果進行轉換處理,並獲得最終的處理結果。
    (E)釋放鏈接資源。
(4)返回處理結果將最終的處理結果返回。
apache

3. 功能框架
  Mybatis能夠分爲三層:
(1) API接口層:提供給外部使用的接口API,開發人員能夠經過本地API來操縱數據庫。
(2) 數據處理層:負責具體的SQL查找、SQL解析、SQL執行和執行結果映射處理等。
(3) 基礎支持層:負責最基本的功能支撐,包括鏈接管理、事務管理、配置加載和緩存處理等。
緩存

4. 簡單使用
先從SqlSessionFactory對象來得到SqlSession的實例,SqlSession對象包含了對數據庫的全部執行SQL操做的方法。例如:
安全

SqlSession session = sqlSessionFactory.openSession();
try {
  Blog blog = (Blog) session.selectOne("com.alvinliang.mybatis.BlogMapper.selectBlog", 1);
} finally {
  session.close();
}

下面給出映射的SQL語句: session

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.alvinliang.mybatis.BlogMapper">
  <select id="selectBlog" resultType="Blog">
    select * from Blog where id = #{id}
  </select>
</mapper>

這裏只是給出了一個簡潔的例子,其中在命名空間「com.alvinliang.mybatis.BlogMapper」中定義了一個名爲「selectBlog」的映射語句,這樣它容許你使用徹底限定名「com.alvinliang.mybatis.BlogMapper.selectBlog」來調用映射語句。
注意:如今命名空間是必須的,並且命名空間使得接口綁定成爲可能,使用命名空間並將它放在合適的Java包空間下,將會使你的代碼變得簡潔,會在很長的時間內提升MyBatis的做用。
mybatis

5. 範圍和生命週期
SqlSessionFactoryBuilder
這個類能夠被實例化,使用和丟棄。一旦你建立了SqlSessionFactory後,這個類就不須要了。所以SqlSessionFactoryBuilder實例的最佳範圍就是方法範圍(也就是本地方法變量)。你能夠重用SqlSessionFactoryBuilder來建立多個SqlSessionFactory實例。

SqlSessionFactory
一旦被建立,SqlSessionFactory應該在你的應用執行期間都存在,沒有理來處理或者從新建立它。使用SqlSessionFactory的最佳實踐是在應用運行期間不要重複建立屢次。所以SqlSessionFactory的生命週期是Application範圍。不少方法能夠作到,如單例模式或者靜態單例模式。
app

SqlSession
每一個線程都應該有它本身的SqlSession實例。SqlSession的實例不能被共享,也是線程不安全的。所以最佳範圍應該是request或者method範圍。絕對不能將SqlSession實例的引用放在一個類的靜態字段甚至是實例字段中。也絕對不能將SqlSession實例引用放在任何類型的管理範圍中,好比Servlet中的HttpSession。若是你正在使用Web框架,能夠考慮將SqlSession放在一個和Http Request對象類似的範圍內。下面的示例就是一個確保SqlSession關閉的基本模式:
框架

SqlSession session = sqlSessionFactory.openSession();
try {
  // do work
} finally {
  session.close();
}
在你的代碼中一向的使用這種模式,將會保證全部的數據庫資源都正常的關閉。
相關文章
相關標籤/搜索