1 SqlSessionFactory 的核心功能是創建 SqlSession 接口,而 SqlSessionFactory 是通過 SqlSessionFactoryBuilder 去構建。
構建步驟1)XMLConfigBuilder 解析配置的XML文件,讀出配置參數,然后將配置數據存放到 Configuration 類中。Mybatis 幾乎所有的配置都在 Configuration 類中。
2)使用 Configuration 去創建 SqlSessionFactory ,Mybatis 的 SqlSessionFactory 是一個接口,而不是實現類。mybatis 提供了默認的 SqlSessionFactory 實現類,org.apache.ibatis.session.defaults.DefaultSqlSessionFactory。因此大多數情況下我們不需要自己去創建 SqlSessionFactory 的實現類。
2 構建 Configuration 它的作用如下
- 讀入配置文件,包括基礎配置的XML 文件和映射器的XML 文件
- 初始化基礎配置和重要的類對象,比如Mybatis 別名、映射器、ObjectFactory 和 typeHandler 對象等
- 提工單例,為后續創建 SessionFactory 服務並提供配置參數。
- 執行一些對象方法,初始化一些配置信息
Configuration 對象是單例的,是通過 XMLConfigBuilder 去構建的。
3 映射器的內部組成,是由3部分組成的
- MappedStatement,他保存映射器的節點(select | insert | delete | update),和SQL 語句、緩存、resultMap、parameterType、resultType
- SqlSource,它是提供 BoundSql 對象的地方,他是 MappedStatement 的一個屬性
- BoundSql,他是建立 SQL 和參數的地方。3個常用屬性:SQL、parameterObject、parameterMappings
對於參數和SQL主要適用對象是 BoundSql 對象。
- parameterObject 是參數本身,我們可以傳遞POJO、Map、簡單對象、@Param等
- 傳遞簡單對象(int/String/float/double),mybatis會將其轉換成為包裝對象。比如我們傳遞一個 int 他會把參數轉換成 Integer 對象
- 如果傳遞的是 POJO 或者 Map 那么 parameterObject 就是你傳入的 POJO 或者 Map不變。
- 傳遞多個參數,沒有使用 @Param 那么 mybatis會把 parameterObject 變為一個 Map<String, Object> 對象,其鍵值的關系是按照順序來的,類似於{"1":p1,"2":p2...,"param1":p1,"param2":p2...},所以在編寫SQL的時候可以使用#{param1} 或 #{1} 去引用參數
- 傳遞多個參數,並使用 @Param 注解, mybatis會把 parameterObject 變為一個 Map<String, Object> 對象,只是把鍵值換成了 @Param 注解的值。比如,@Param("key1") String p1, @Param("key2") String p2,那么這個 parameterObject 對象就是{"key1":p1,"key2":p2}
4 構建 SqlSessionFactory,有Configuration 對象,構建 SqlSessionFactory 就很方便。
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputstream)