MyBatis基礎總結

MyBatis的執行流程:

SqlSessionFactoryBuilder(建造者模式)通過XMLConfigBuilder解析Mybatis的全局配置XML文件(全局參數,別名,環境設置,類型轉換器,映射器)通過XMLMapperBuilder讀取Mapper.xml文件.將信息存入Configuration對象(單例模式)中,然後根據Configuration對象中的配置信息去創建SqlSessionFactory(單例模式),SqlSessionFactory接口有兩個實現類,分別是DefaultSqlSessionFactory(單線程,默認)和SqlSessionManager(多線程),默認返回DefaultSqlSessionFactory,有了SqlSessionFactory就可以獲取SqlSession,SqlSession是個接口(類似於JDBC中的Connection對象,使用了外觀模式),有兩個實現類,分別是DefaultSqlSession(單線程,默認)和SqlSessionManager(多線程),默認返回DefaultSqlSession,SqlSession的getMapper(Class)方法會通過JDK動態代理或者CGLIB來生成一個代理實例MapperProxy,代理實例執行SQL時實際是由Executor來執行的,Executor接口的實現類,有SimpleExecutor(默認),ReuseExecutor(重用預處理),BatchExecutor(批量專用),以及CachingExecutor(裝飾者模式,裝飾其他三種Executor,實現二級緩存,一級緩存在其他三種Executor中實現),默認使用SimpleExecutor來執行doQuery方法或者doUpdate方法,期間會使用StatementHandler(數據庫會話器)的prepare()方法預編譯SQL,同時設置一些基本運行的參數.然後調用parameterize()方法啓用ParameterHandler設置參數,完成預編譯,執行SQL語句,最後使用ResultSetHandler封裝結果返回給調用者.

處理sql參數和返回sql結果的時候會使用TypeHandler(類型轉換器)來進行Java類型與JDBC類型的轉換.

創建結果集對象會使用ObjectFactory接口的DefaultObjectFactory實現類來完成.

StatementHandler的實現類有SimpleStatementHandler(對應JDBC的Statement),PreparedStatementHandler(對應JDBC的PreparedStatement,預編譯處理),CallableStatementHandler(對應JDBC的CallableStatement,存儲過程),RoutingStatementHandler(扮演適配器的角色,會根據上下文環境決定創建哪個StatementHandler對象).

MappedStatement對應Mapper.xml文件中的select,insert,delete,update節點.它存放在Configuration類的一個map成員中.

SqlSource接口的作用是根據上下文和參數解析生成需要的SQL

BoundSql用來封裝SQL和參數.

MyBatis核心組件的生命週期

SqlSessionFactoryBuilder的作用就是創建SqlSessionFactory,創建完成後就不再需要,應把它的作用域限制在創建SqlSession的方法之中,不要讓其長期存在.

SqlSessionFactory(類似於數據庫連接池)的作用就是創建SqlSession,所以一旦創建SqlSessionFactory就要長期保存它,直到不再使用Mybatis應用.

SqlSession(類似於數據庫連接)應當存在於一個業務請求當中,使用完成後要保證它被正確關閉.

Mapper是一個接口,由SqlSession創建,它的生命週期最多和SqlSession保持一致,Mapper代表的是一個請求中的業務處理,它應該在一個請求中,一旦處理完了相關業務,就應該廢棄它.

MyBatis的配置

<configuration>  <!--配置-->
    <properties>  <!--屬性-->    
    <settings>  <!--設置-->
    <typeAliases> <!--類型別名-->
    <typeHandlers>  <!--類型處理器-->
    <objectFactory> <!--對象工廠-->
    <plugins>  <!--插件-->
    <environments> <!--配置環境-->
        <environment>  <!--環境變量-->
            <transactionManager> <!--事務管理器-->
            <dataSource> <!--數據源-->
            </dataSource>
        </environment>
    </environments>
    <mappers>  <!--映射器-->
        <mapper></mapper>
    </mappers>
</configuration>

properties的參數可以使用properties文件在存放,然後在Mybatis中通過<properties resource="jdbc.properties" />來引入properties文件.也可以按照${database.username}的方式引入properties文件的屬性到Mybatis配置文件中.

settings常用的配置有:

  • 自動駝峯命名規則映射mapUnderscoreToCamelCase=false
  • 自動映射autoMappingBehavior=PARTIAL只會自動映射沒有定義嵌套結果集映射的結果集 NONE取消自動映射 FULL會自動映射全部結果集,無論是否嵌套.
  • 緩存的全局開關cacheEnabled=true
  • 延遲加載的全局開關lazyLoadingEnabled=false
  • 侵略性延遲加載開關aggressiveLazyLoading=(3.4.1版本及之前爲true,之後爲false) 開啓後,調用任意延遲屬性,將會導致所有的延遲屬性被完整加載.  可以解決級聯的N+1問題.
  • 執行器類型defaultExecutorType=SMPLE REUSE BATCH

可以通過<typeAliases>中的<typeAlias>來定義別名,還可以通過TypeAliasRegistry來實現自定義別名.

ObjectFactory對象工廠用來完成創建結果集實例,默認使用DefaultObjectFactory.

MyBatis緩存

一級緩存默認開啓,SqlSession級別.

二級緩存只需要在mapxml文件中加入<cache/>,並讓對應pojo實現序列化接口,在標籤上添加useCache="true"t即可.

MyBatis動態SQL

if,set,where,bind(例如數據庫的concat()方法),foreach,trim,choose,otherwise

Mybatis的註解

@Param爲參數命名

@Insert實現新增

@Update實現更新

@Delete實現刪除

@Select實現查詢

@Result實現結果集封裝

@Results可以與@Result一起使用,封裝多個結果集.

@One實現一對一結果集封裝.

@Many實現一對多結果集封裝.

@SelectProvider實現動態SQL映射.

MyBatis插件

簡述Mybatis的插件運行原理,以及如何編寫一個插件?

答:Mybatis僅可以編寫針對ParameterHandler、ResultSetHandler、StatementHandler、Executor這4種接口的插件,Mybatis使用JDK的動態代理,爲需要攔截的接口生成代理對象以實現接口方法攔截功能,每當執行這4種接口對象的方法時,就會進入攔截方法,具體就是InvocationHandler的invoke()方法,當然,只會攔截那些你指定需要攔截的方法。

編寫插件:實現Mybatis的Interceptor接口並複寫intercept()方法,然後在給插件編寫註解,指定要攔截哪一個接口的哪些方法即可,最後在配置文件中配置你編寫的插件.

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