MyBatis的結構和配置

概述
MyBatis將用戶從JDBC的訪問中解放出來,用戶只須要定義須要操做的SQL語句,無須關注底層的JDBC操做,就能夠面向對象的方式進行持久層操做。底層數據庫鏈接的獲取、數據訪問的實現、事務控制等都無須用戶關心,從而將應用層從底層的JDBC API中抽取出來,經過配置文件管理JDBC的鏈接,使用MyBatis解決持久化訪問的實現。
MyBatis的體系結構
MyBatis中經常使用的對象有SqlSessionFactory和SqlSession。
SqlSessionFactory
SqlSessionFactory是MyBatis的關鍵對象,是單個數據庫映射關係通過編譯後的內存鏡像。該對象的實例經過SqlSessionFactoryBuilder對象來得到,而SqlSessionFactoryBuilder則能夠從XML配置文件或一個預先定製的Configuration的實例構建出SqlSessionFactory的實例。每個MyBatis的應用程序都以一個SqlSessionFactory對象的實例爲核心。
它是線程安全的,SqlSessionFactory一旦被建立,應該在應用執行期間都存在。在應用運行期間不要重複建立,建議使用單例模式。SqlSessionFactory是SqlSession的工廠,使用SqlSessionFactory.openSession()方法建立SqlSession對象(前文鏈接:https://www.jianshu.com/p/063a5ca8874c)。
SqlSession
SqlSession是MyBatis的關鍵對象,是執行持久化操做的對象,相似於JDBC中的Connection。它是應用程序與持久存儲層之間執行交互操做的一個單線程對象,也是MyBatis執行持久化操做的關鍵對象。
SqlSession對象徹底包含以數據庫爲背景的全部執行SQL操做的方法,它的底層封裝了JDBC鏈接,能夠用SqlSession實例來直接執行已經映射的SQL語句。每一個線程都應該有本身的SqlSession實例。
SqlSession實例不能被共享,也是線程不安全的,絕對不能將SqlSession實例的引用放在任何類型的管理範圍中,應該確保使用完SqlSession以後將它關閉。
SqlSession的方法見以下源碼程序:
mysql

  1 public interface SqlSession extends Closeable {
  2     <T> T selectOne(String var1);
  3 
  4     <T> T selectOne(String var1, Object var2);
  5 
  6     <E> List<E> selectList(String var1);
  7 
  8     <E> List<E> selectList(String var1, Object var2);
  9 
 10     <E> List<E> selectList(String var1, Object var2, RowBounds var3);
 11 
 12     <K, V> Map<K, V> selectMap(String var1, String var2);
 13 
 14     <K, V> Map<K, V> selectMap(String var1, Object var2, String var3);
 15 
 16     <K, V> Map<K, V> selectMap(String var1, Object var2, String var3, RowBounds var4);
 17 
 18     <T> Cursor<T> selectCursor(String var1);
 19 
 20     <T> Cursor<T> selectCursor(String var1, Object var2);
 21 
 22     <T> Cursor<T> selectCursor(String var1, Object var2, RowBounds var3);
 23 
 24     void select(String var1, Object var2, ResultHandler var3);
 25 
 26     void select(String var1, ResultHandler var2);
 27 
 28     void select(String var1, Object var2, RowBounds var3, ResultHandler var4);
 29 
 30     int insert(String var1);
 31 
 32     int insert(String var1, Object var2);
 33 
 34     int update(String var1);
 35 
 36     int update(String var1, Object var2);
 37 
 38     int delete(String var1);
 39 
 40     int delete(String var1, Object var2);
 41 
 42     void commit();
 43 
 44     void commit(boolean var1);
 45 
 46     void rollback();
 47 
 48     void rollback(boolean var1);
 49 
 50     List<BatchResult> flushStatements();
 51 
 52     void close();
 53 
 54     void clearCache();
 55 
 56     Configuration getConfiguration();
 57 
 58     <T> T getMapper(Class<T> var1);
 59 
 60     Connection getConnection();
 61 }
 62 


具體解釋,此處不作記錄,使用時查詢便可。
注意:
實際應用中不多直接使用DriverManager來獲取數據庫鏈接,一般使用DataSource來獲取數據庫鏈接,SqlSessionFactory底層封裝了DataSource。

MyBatis的配置文件
此處回顧前文的test測試類文件代碼:
sql

  1 public class Test {
  2     public static void main(String[] args) throws IOException {
  3         InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
  4         SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
  5         SqlSession sqlSession = sqlSessionFactory.openSession();
  6         User user = new User("Snow","",20);
  7         sqlSession.insert("com.snow.dcl.mapper.UserMapper.saveUser",user);
  8         sqlSession.commit();
  9         sqlSession.close();
 10     }
 11 }


首先,讀取mybatis-config.xml配合文件:
數據庫

  1 InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");


而後初始化mybatis,建立SqlSessionFactory的實例:
緩存

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


最後獲取SqlSession對象,執行SQL語句:
安全

  1 SqlSession sqlSession = sqlSessionFactory.openSession();
  2 ...
  3 sqlSession.insert("com.snow.dcl.mapper.UserMapper.saveUser",user);


因而可知,MyBatis的初始化過程要通過如下步驟:
1.調用SqlSessionFactoryBuilder對象的build(inputStream)方法。
2.SqlSessionFactoryBuilder會根據輸入流inputStream等信息建立XMLConfigBuilder對象。
3.SqlSessionFactoryBuilder調用XMLConfigBuilder對象的parse()方法。
4.XMLConfigBuilder對象解析XML配置文件返回Configuration對象。
5.SqlSessionFactoryBuilder根據Configuration對象建立一個DefaultSessionFactory對象。
6.SqlSessionFactoryBuilder返回DefaultSessionFactory對象給客戶端,供客戶端使用。
配置文件屬性
MyBatis的配置文件包含了以下結構:
1.properties屬性
properties中的屬性都是可外部配置且可動態替換的,既能夠在典型的Java屬性文件中配置,也能夠經過properties元素的子元素來傳遞。
2.settings設置
settings是MyBatis中很是重要的設置,會改變MyBatis的運行時行爲,settings元素示例以下:
mybatis

  1 <settings>
  2     <!--指定Mybatis所用日誌的具體實現,開啓日誌-->
  3     <setting name="logImpl" value="Log4J"/>
  4     <!--開啓二級緩存-->
  5     <setting name="cacheEnabled" value="true"/>
  6 </settings>


其餘選項,開發項目時能夠按需查詢使用,下面列出部分參數:app

參數 描述 有效值
cacheEnabled 該配置影響全部映射器緩存的全局開關 true/false
lazyLoadingEnabled 延遲加載的全局開關 true/false
useGenaratedKeys 容許JDBC支持自動生成主鍵 true/false
logImpl 指定MyBatis所用日誌的具體實現,未指定時自動查找 SLF4J/LOG4J/LOG4J2

1.tpyeAliases類型命名
類型別名爲Java類型設置一個簡短的別名,只和XML配置有關,存在的意義僅在於減小類徹底限定名的冗餘。
  1 <typeAliases>
  2     <typeAlias type="User" alias="com.snow.dcl.domain.User"/>
  3 </typeAliases>

這樣配置時,User能夠用在任何使用com.snow.dcl.domain.User的地方。
  1 <typeAliases>
  2     <package name="com.snow.dcl.domain"/>
  3 </typeAliases>

這樣配置時,每個在com.snow.dcl.domain包中的Java Bean,在沒有註解的狀況下,會使用Bean的首字母小寫的非限定類名來做爲別名,例如:com.snow.dcl.domain.User別名爲user。
  1 @Alias("user")
  2 public class User {
  3     ...
  4 }

如有註解,則別名爲註解值。
1.typeHandlers類型處理器
不管是MyBatis在預處理語句(PreparedStatement)中設置一個參數時,仍是從結果集中取出一個值時,都會用類型處理器將獲取的值以合適的方式轉換成Java類型。
2.objectFactory對象工廠
MyBatis每次建立結果對象的新實例時,都會使用一個對象工廠實例來完成。
3.plugins插件
4.environments環境
   environment環境變量
   transactionManager事務管理器
   dataSource數據源
MyBatis的環境配置實際就是數據源的配置。MyBatis能夠配置多種環境,這種機制使得MyBatis能夠將SQL映射應用於多種數據庫中。
注意:
儘管能夠配置多個環境,可是每一個SqlSessionFactory實例只能選擇一個環境。因此若想鏈接兩個數據庫,須要建立兩個SqlSessionFactory實例。

前文配置內容以下:
  1 <!--環境配置,鏈接的數據庫-->
  2 <environments default="mysql">
  3     <environment id="mysql">
  4         <!--指定事務管理的類型,這裏簡單使用Java的JDBC的提交和回滾設置-->
  5         <transactionManager type="JDBC"></transactionManager>
  6         <!--dataSource 指鏈接源配置,POOLED是JDBC鏈接對象的數據源鏈接池的實現-->
  7         <dataSource type="POOLED">
  8             <property name="driver" value="com.mysql.jdbc.Driver"></property>
  9             <property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis?useUnicode=true&amp;characterEncoding=UTF-8"></property>
 10             <property name="username" value="root"></property>
 11             <property name="password" value="****"></property>
 12         </dataSource>
 13     </environment>
 14 </environments>

默認的環境ID(default="mysql")。
每一個environment元素定義的環境ID(id="mysql")。
事務管理器配置( type="JDBC")。
數據源的配置(type="POOLED")。
環境ID能夠隨意命名,默認環境ID必定要匹配定義的其中一個環境ID。
1.databaseIDProvider數據庫廠商標識
2.mappers映射器
MyBatis開着須要本身寫SQL語句,mapper映射器配置告訴MyBatis到哪裏去找映射文件,進而找到這些SQL語句:
  1 <mappers>
  2     <!--告訴Mybatis持久化類的映射文件路徑-->
  3     <mapper resource="mapping/UserMapper.xml"></mapper>
  4 </mappers>
以上就是對MyBatis的結構和配置文件記錄。
相關文章
相關標籤/搜索