概述
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 <typeAliases> 2 <typeAlias type="User" alias="com.snow.dcl.domain.User"/> 3 </typeAliases>
1 <typeAliases> 2 <package name="com.snow.dcl.domain"/> 3 </typeAliases>
1 @Alias("user") 2 public class User { 3 ... 4 }
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&characterEncoding=UTF-8"></property> 10 <property name="username" value="root"></property> 11 <property name="password" value="****"></property> 12 </dataSource> 13 </environment> 14 </environments>
1 <mappers> 2 <!--告訴Mybatis持久化類的映射文件路徑--> 3 <mapper resource="mapping/UserMapper.xml"></mapper> 4 </mappers>