認識MyBatis核心組件
文章目錄
Mybatis的特點
- 不屏蔽sql,這給sql的優化留下了空間
- 提供靈活,強大的映射機制,方便java開發者使用
- 提供了只需要一個mapper接口,和一個xml的映射機制
Mybatis的核心組件
- SqlSessionFactoryBuilder (構造器):它會根據配置或者代碼來生成SqlSessionFactory,採用的分步構建的Builder模式
- SqlSessionFactory(工廠接口): 依靠它來生成SqlSession,使用的是工廠模式
- SqlSession(會話): 一個既可以發送SQL來執行返回結果,也可以獲取Mapper的接口
- Mapper(映射器):由java接口和xml構成,需要給出sql和映射關係。它負責發送sql去執行,並返回結果。
SqlSessionFactory(工廠接口)
每個mybatis應用都是以一個SqlSessionFactory爲核心的。mybatis的首要任務就是根據配置或者代碼去生產SqlSessionFactory,由於SqlSessionFactory的責任單一,所以通常爲單例模式。在mybatis中,會使用構造器SqlSessionFactoryBuilder來構建它。mybaist提供了一個org.apache.ibatis.session.Configuration作爲引導,採用的是builder模式。
通過查看SqlSessionFactoryBuilder的代碼,發現,多個構建方法最後都是在調用如下方法進行構建
注意,SqlSessionFactory是一個接口如下
它有兩個具體的實現SqlSessionManager和DefaultSqlSessionFactory,後者繼承了前者。前者由於多線程環境中。
如上面所提到的,有兩種方式用於構建SqlSessionFactory,配置和代碼。
使用XML構建SqlSessionFactory
這種方式就是通過讀取mybatis的配置文件來構建SqlSessionFactory
如下文展示的一份簡單的配置文件
通過觀察上圖,有三個重要的部分
- 別名 這個別名定義是全局的,在映射文件中integer不用寫全限定名就是因爲mybatis已經爲我們定義了別名
- 數據庫環境 配置事務方式,數據庫連接池
- 映射文件 這裏用來註冊映射器,可以有多種方式,如直接註冊一個文件夾,這樣就不用了一個一個的寫了
最後在java代碼中構建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = null;
InputStream resource = "mybatis-config.xml";
InputStream input;
try{
inputStream = Resource.getResourceAsStream(resource);
SqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch(IOException e) {
e.printStackTrace ();
}
上文已經提到,可以通過SqlSessionFactoryBuilder來構建SqlSessionFactory,查看構造器的代碼就可以知道,它有多種構造方法的重載,其中就包括上述代碼中的,以InputStream爲參數實現。
通過代碼創建SqlSessionFactory的方式省略
SqlSession
就像SqlSessionFactory一樣,SqlSession也是一個接口。它有兩個實現類,一個是SqlSessionManager一個是DefaultSqlSession,DefaultSqlSession在單線程下使用,SqlSessionManager在多線程下使用。這個SqlSessionManager有點眼熟,是的,它在上文的SqlSessionFactory中出現過,它實現了SqlSession接口和SqlSessionFactory接口。
通過觀察SqlSession的接口,我們可以發現SqlSession的作用主要有三個
- 發出Sql
- 控制數據庫事務
- 獲取Mapper接口
映射器
映射器在mybatis中由一個接口和一個XML文件組成。
作用如下:
- 描述映射規則
- 提供sql
- 配置緩存
- 提供動態SQL
SqlSession與Mapper接口發送SQL
SqlSession發送SQL
Role role = sqlSession.selectOne("com.learn.ssm.mapper.RoleMapper.getRole", 1L);
string對象是由一個命名空間加上SQL id組合而成的,它完全定位了一條SQL
用Mapper接口發送SQL
RoleMapper roleMapper = SqlSession![e5568231041495b2cb6ef26d21fb7715.png](en-resource://database/1004:1)
.getMapper(RoleMapper.class);
Role role = roleMapper.getRole(1L);
這是通過mapper的全限定名加上方法名來說查找
通過觀察以上兩種方式,無論是可讀性,還是代碼在編譯時期的檢查,後者都更優秀
生命週期
這裏討論下上文反覆提到的四大組件的生命週期
SqlSessionFactoryBuilder
它是用來創建SqlSessionFactory的,所以它的生命應該在創建是開始,在創建結束後結束
SqlSessionFactory
SqlSessionFcatory可以被認爲是一個數據庫連接池,它的作用是創建Sqlsession接口對象。其應該以單例的形式,在整個mybatis應用內存活
SqlSession
哪它就相當於一個連接,應該存活於一個業務請求中。
Mapper
其生命週期應該小於SqlSession