前言
每個基於 MyBatis 的應用都是以一個 SqlSessionFactory 的實例為中心的。SqlSessionFactory 的實例可以通過 SqlSessionFactoryBuilder 獲得。而 SqlSessionFactoryBuilder 則可以從 XML 配置文件或一個預先定制的 Configuration 的實例構建出 SqlSessionFactory 的實例。
MyBatis取代JDBC,框架會做什么:
讀取配置文件
底層一定是JDBC
結果集的映射(反射)
ObjectFactory:對象工廠,實現對應的pojo對象的創建
其他功能:提供基於注解實現MyBatis;對日志的支持;Ognl表達式;對事物的管理;緩存…

SqlSessionFactoryBuilder
讀取全局配置文件,得到數據源信息,創建連接工廠SqlSessionFactory。它的特點是,當創建了SqlSessionFactory對象之后,這個類就不需要了。因此,它的最佳范圍是存在於方法體內,也就是局部變量。
注意:
是一個類
讀取全局配置文件,得到數據源信息,創建連接工廠
配置文件的輸入流
通過環境id(environmentID)來創建與之對應的連接工廠

SqlSessionFactory
連接工廠;創建SqlSession實例的工廠。它的特點是,SqlSessionFactory對象一旦被創建,就無法銷毀或者再創建,也不建議多次創建SqlSessionFactory對象。因此,它的最佳范圍是應用(Application)范圍內。
注意:
是一個接口;
一個數據庫會對應一個連接工廠(提供多個連接)
POOLED:表示factory中的連接是可以重用的,(連接池)
UNPOOLED:每次使用都有工廠提供一個新的連接
JNDI:與框架整合的時候,連接數據配置項的使用
存在於應用程序的整個運行生命周期,是單例的;后續是由Spring管理該實例的生命周期
得到SqlSession的方法:

SqlSession
會話對象類,SqlSession 完全包含了面向數據庫執行 SQL 命令所需的所有方法。可以通過 SqlSession 實例來直接執行已映射的 SQL 語句。SqlSession對應着一次數據庫會話,所以每次訪問數據庫時都需要在SqlSessionFactory實例的openSession()方法中創建它。但一個SqlSession會話也可以執行多次SQL語句。
注意:
是一個接口
數據庫的連接,完成一次數據庫的訪問和結果的映射的對象
一個連接可以讓多個線程同時使用嗎?不能,非線程安全的
每個線程都應該有一個SqlSession的實例來完成對數據庫的操作
JDBC中的事務是攜帶在Connection,MyBatis中的事務攜帶在SqlSession中
Web模型:每次請求—一個線程—SqlSession,SqlSession在web中的作用域對應的是請求作用域(request);
每個請求對應一個事務,事務—SqlSession,SqlSession在web中的作用域對應request請求介紹的時候,SqlSession會關閉
提供的方法有:

注:
selectOne/selectList的區別:selectOne是基於selectList實現的;

Mapper
映射類,跟映射關系對應,是從SqlSession中獲取的。任何映射器實例的最大作用域是和請求它們的 SqlSession 相同的。盡管如此,映射器實例的最佳作用域是方法作用域。也就是說,映射器實例應該在調用它們的方法中被請求,用過之后即可廢棄。並不需要顯式地關閉映射器實例,盡管在整個請求作用域(request scope)保持映射器實例也不會有什么問題,但是很快你會發現,像 SqlSession 一樣,在這個作用域上管理太多的資源的話會難於控制。所以要保持簡單,最好把映射器放在方法作用域(method scope)內。
注意:
映射類,跟映射關系對應,SQL
作為接口的代理類
session.getMapper(接口 class 實例)
將傳入的接口類型與映射的XML文件關聯起來,接口的實現是基於XML配置文件中的SQL實現,生成代理類對象


