Mybatis介紹(一)

MyBatis本是apache的一個開源項目iBatis, 2010年這個項目由apache software foundation 遷移到了google code,而且更名爲MyBatis 。2013年11月遷移到Github。java

MyBatis是支持普通SQL查詢,存儲過程和高級映射的持久化框架,底層是對JDBC的封裝,是一個半自動的ORM框架。sql

MyBatis 使用簡單的 XML 或註解用於配置和原始映射,將接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java 對象)映射成數據庫中的記錄。數據庫

1、Mybatis的功能架構

第一層:API接口層apache

提供給外部使用的接口API,開發人員經過這些本地API來操做數據庫。接口層一接收到調用請求就會調用數據處理層來完成具體的數據處理。編程

MyBatis和數據庫的交互有兩種方式:緩存

  • 使用傳統的MyBatis提供的API;
    • 傳遞Statement Id 和查詢參數給 SqlSession 對象,使用 SqlSession對象完成和數據庫的交互;MyBatis提供了很是方便和簡單的API,供用戶實現對數據庫的增刪改查數據操做,以及對數據庫鏈接信息和MyBatis 自身配置信息的維護操做。可是它不符合面嚮對象語言的概念和麪向接口編程的編程習慣。因爲面向接口的編程是面向對象的大趨勢,MyBatis 爲了適應這一趨勢,增長了第二種使用MyBatis 支持接口(Interface)調用方式。
    • sqlSession.selectList("com.asiainfo.mybatis.dao.EmployeeMapper.insertEmployee", parameter);
  • 使用Mapper接口
    • 根據MyBatis 的配置規範配置好後,經過SqlSession.getMapper(XXXMapper.class) 方法,MyBatis 會根據相應的接口聲明的方法信息,經過動態代理機制生成一個Mapper 實例,咱們使用Mapper 接口的某一個方法時,MyBatis 會根據這個方法的方法名和參數類型,肯定Statement Id,底層仍是經過SqlSession.select("statementId",parameterObject);或者SqlSession.update("statementId",parameterObject); 等等來實現對數據庫的操做。
    • EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);

第二層:數據處理層session

負責具體的SQL查找、SQL解析、SQL執行和執行結果映射處理等。它主要的目的是根據調用的請求完成一次數據庫操做。mybatis

第三層:基礎支撐層架構

負責最基礎的功能支撐,包括鏈接管理、事務管理、配置加載和緩存處理,這些都是共用的東西,將它們抽取出來做爲最基礎的組件。爲上層的數據處理層提供最基礎的支撐。app

2、MyBatis項目的包結構

.
└── org
    └── apache
        └── ibatis
            ├── annotations
            ├── binding
            ├── builder
            ├── cache
            ├── cursor
            ├── datasource
            ├── exceptions
            ├── executor
            ├── io
            ├── jdbc
            ├── logging
            ├── mapping
            ├── parsing
            ├── plugin
            ├── reflection
            ├── scripting
            ├── session
            ├── transaction
            └── type

1. 日誌
org.apache.ibatis.logging
org.apache.ibatis.logging.commons
org.apache.ibatis.logging.jdbc
org.apache.ibatis.logging.jdk14
org.apache.ibatis.logging.log4j
org.apache.ibatis.logging.log4j2
org.apache.ibatis.logging.nologging
org.apache.ibatis.logging.slf4j
org.apache.ibatis.logging.stdout

2. 異常
org.apache.ibatis.exceptions

3. 緩存
org.apache.ibatis.cache
org.apache.ibatis.cache.decorators
org.apache.ibatis.cache.impl

4. 解析
org.apache.ibatis.parsing
xml解析,${} 格式的字符串解析

5.類型處理器
org.apache.ibatis.type
實現java和jdbc中的類型之間轉換

6. IO
org.apache.ibatis.io
經過類加載器在jar包中尋找一個package下知足條件(好比某個接口的子類)的全部類

7. 反射
org.apache.ibatis.reflection
org.apache.ibatis.reflection.factory
org.apache.ibatis.reflection.invoker
org.apache.ibatis.reflection.property
org.apache.ibatis.reflection.wrapper
能夠參考MetaObjectTest來跟蹤調試,基本上用到了reflection包下全部的類

8. 數據源
org.apache.ibatis.datasource
org.apache.ibatis.datasource.jndi
org.apache.ibatis.datasource.pooled
org.apache.ibatis.datasource.unpooled

9. 事務
org.apache.ibatis.transaction
org.apache.ibatis.transaction.jdbc
org.apache.ibatis.transaction.managed

10. 會話
org.apache.ibatis.session
org.apache.ibatis.session.defaults

11. jdbc單元測試工具
org.apache.ibatis.jdbc

12. 構建
org.apache.ibatis.builder
org.apache.ibatis.builder.annotation
org.apache.ibatis.builder.xml

13. 映射
org.apache.ibatis.mapping

14. 腳本
org.apache.ibatis.scripting
org.apache.ibatis.scripting.defaults
org.apache.ibatis.scripting.xmltags

15. 註解
org.apache.ibatis.annotations

16. 綁定
org.apache.ibatis.binding

17. 執行器
org.apache.ibatis.executor
org.apache.ibatis.executor.keygen
org.apache.ibatis.executor.loader
org.apache.ibatis.executor.loader.cglib
org.apache.ibatis.executor.loader.javassist
org.apache.ibatis.executor.parameter
org.apache.ibatis.executor.result
org.apache.ibatis.executor.resultset
org.apache.ibatis.executor.statement

18. 插件
org.apache.ibatis.plugin

3、Mybatis的執行流程

1. mybatis配置

  SqlMapConfig.xml,此文件做爲mybatis的全局配置文件,配置了mybatis的運行環境等信息。

  mapper.xml文件即sql映射文件,文件中配置了操做數據庫的sql語句。此文件須要在SqlMapConfig.xml中加載。

  SqlMapConfig.xml是mybatis的核心文件。mybatis將dao層與sql語句分離開來,雖然寫的時候分離開來了,可是執行的時候仍是要依靠sql語句,因此咱們的sql語句寫在Mapper.xml中。咱們在加載核心的時候,會加載他下面的Mapper.xml,因此sql語句便會加載進去了。咱們只須要在SqlMapConfig.xml中引入Mapper.xml就能夠了,因此最後只須要加載SqlMapConfig.xml這一個核心配置文件。

2. 經過mybatis環境等配置信息構造SqlSessionFactory,即會話工廠。工廠能幫咱們去加載核心配置文件。加載了核心配置文件後就建立session,經過session能夠對數據庫進行操做。

3. 由會話工廠建立sqlSession即會話,操做數據庫須要經過sqlSession進行。

4. mybatis底層自定義了Executor執行器接口操做數據庫,Executor接口有兩個實現,一個是基本執行器、一個是緩存執行器。Executor是執行者,咱們不須要管,由於mybatis已經爲咱們封裝好了。mybatis直接執行sql語句。

5. Mapped Statement也是mybatis一個底層封裝對象,它包裝了mybatis配置信息及sql映射信息等。mapper.xml文件中一個sql對應一個Mapped Statement對象,sql的id便是Mapped statement的id。

6. Mapped Statement對sql執行輸入參數進行定義,包括HashMap、基本類型、pojo,Executor經過Mapped Statement在執行sql前將輸入的java對象映射至sql中,輸入參數映射就是jdbc編程中對preparedStatement設置參數。

7. Mapped Statement對sql執行輸出結果進行定義,包括HashMap、基本類型、pojo,Executor經過Mapped Statement在執行sql後將輸出結果映射至java對象中,輸出結果映射過程至關於jdbc編程中對結果的解析處理過程。

8. Mapped Statement是輸入與輸出中間過程當中產生的一些對象,經過這些對象去訪問數據庫。

總結:工廠能幫咱們去加載核心配置文件,同時建立會話,會話裏面有執行者,執行sql語句,在執行sql語句的過程當中產生對象,經過Mapped Statement封裝成對象。執行sql語句就要須要輸入參數和輸出參數。

相關文章
相關標籤/搜索