認識MyBatis核心組件

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章