1. 程式人生 > >mybatis原理,配置介紹及原始碼分析

mybatis原理,配置介紹及原始碼分析

前言

mybatis核心元件有哪些?它是工作原理是什麼?

mybatis配置檔案各個引數是什麼含義?

mybatis只添加了介面類,沒有實現類,為什麼可以直接查詢呢?

mybatis的mapper對映檔案各個引數又是什麼含義?

mybatis-spring提供哪些機制簡化了原生mybatis?

mybatis-springboot-starter又是如何簡化進一步讓mybatis使用如此方便?程式碼呼叫流程是怎麼樣的?

一. jdbc介紹

1. 概述

  • jdbc是sun公司提出的一系列對資料庫操作的規範
  • java程式對資料庫的連線都通過jdbc規範進行,它統一了介面,使用者在使用時無需關心各個資料庫廠商底層的差異
  • 不同資料庫底層具體實現由資料庫廠商實現,也就是資料庫驅動程式

2. 使用jdbc進行開發的流程

  • 載入驅動,Driver介面
  • 建立連線,Connection介面
  • 建立執行SQL的Statement
  • 通過Statement執行SQL,執行結果返回到ResultSet並處理
  • 釋放資源

3. 總結與反思

  • jdbc程式設計工作量大,需要處理連線,事務,資料型別,各種Connection,Statement,ResultSet,關閉連線等等
  • 實際開發中不會直接使用jdbc程式設計,而是使用物件關係模型(ORM)框架。

二. mybatis介紹

1. 概述

mybatis是一款優秀的持久層框架,支援定製SQL語句,避免了幾乎所有JDBC程式碼和手動設定引數,結果集獲取

2. 如何使用

  • pom檔案中新增mybatis的依賴
  • 讀取配置檔案,將配置資訊傳給SqlSessionFactoryBuilder的build方法,構造出SqlSessionFactory
  • 用SqlSessionFactory取得SqlSession
  • 呼叫SqlSession的getMapper得到mapper介面
  • 呼叫mapper介面中的增刪該查方法操作資料庫

3. 核心元件和API

  • SqlSession:mybatis最核心的元件,可以傳送sql去執行並返回結果,也可以獲取Mapper介面。類似於jdbc的Connection物件
  • SqlSessionFactory:建立SqlSession的工廠類,包含所有建立SqlSession例項的方法
  • SqlSessionFactoryBuilder: 根據配置資訊Configuration或程式碼構建SqlSessionFactory物件
  • SQL Mapper:由Java介面和xml檔案構成,並給出對應的sql和對映規則,負責傳送sql執行並返回

SqlSessionFactoryBuilder

  • 一旦建立了SqlSessionFactory之後,就不再需要它了,最佳作用域是區域性變數
  • 包含的函式如下圖所示,允許通過不同的方法建立SqlSessionFactory
  • configuration 類包含你可能需要了解 SqlSessionFactory 例項的所有內容
SqlSessionFactory build(InputStream inputStream)
SqlSessionFactory build(InputStream inputStream, String environment)
SqlSessionFactory build(InputStream inputStream, Properties properties)
SqlSessionFactory build(InputStream inputStream, String env, Properties props)
SqlSessionFactory build(Configuration config)
複製程式碼

SqlSessionFactory

  • 每個Mybatis應用都是以SqlSessionFactory例項為中心的,它的任務是建立SqlSession
  • 每個資料庫對應一個,在MyBatis應用的整個生命週期中,設計為單例或靜態單例模式最佳
  • 構建方法:xml配置方式和程式碼方式
  • 包含的函式如下圖所示
//預設獲取的方式,不自動提交(開啟事務)
SqlSession openSession()
//是否自動提交
SqlSession openSession(boolean autoCommit)
SqlSession openSession(Connection connection)
//事務的隔離級別:None,RU,RC,RR,Serial
SqlSession openSession(TransactionIsolationLevel level)
//查詢型別:simple,batch,reuse
SqlSession openSession(ExecutorType execType,TransactionIsolationLevel level)
SqlSession openSession(ExecutorType execType)
SqlSession openSession(ExecutorType execType, boolean autoCommit)
SqlSession openSession(ExecutorType execType, Connection connection)
//獲取mybatis配置資訊
Configuration getConfiguration();
複製程式碼

SqlSession

  • 每個執行緒都應該有他自己的SqlSession例項
  • 是一個介面類,扮演門面的作用,真正幹活的是Executor介面
  • 生命週期在請求資料庫處理事務的過程中,不是執行緒安全的物件,不能作為類的靜態變數。多執行緒要小心
  • 每次使用時開啟一個SqlSession,操作完就關閉它
//帶引數的增刪改查方法
<T> T selectOne(String statement, Object parameter)
<E> List<E> selectList(String statement, Object parameter)
<K,V> Map<K,V> selectMap(String statement, Object parameter, String mapKey)
int insert(String statement, Object parameter)
int update(String statement, Object parameter)
int delete(String statement, Object parameter)

//不帶引數的增刪改查方法
<T> T selectOne(String statement)
<E> List<E> selectList(String statement)
<K,V> Map<K,V> selectMap(String statement, String mapKey)
int insert(String statement)
int update(String statement)
int delete(String statement)

//高階版本的增刪該查方法,支援自定義返回行數和結果控制
<E> List<E> selectList (String statement, Object parameter, RowBounds rowBounds)
<K,V> Map<K,V> selectMap(String statement, Object parameter, String mapKey, RowBounds rowbounds)
void select (String statement, Object parameter, ResultHandler<T> handler)
void select (String statement, Object parameter, RowBounds rowBounds, ResultHandler<T> handler)

//事務控制相關方法
void commit()
void commit(boolean force)
void rollback()
void rollback(boolean force)

//清除快取。mybatis提供了本地快取和二級快取
void clearCache()

//關閉session
void close()

//獲得configuration例項
Configuration getConfiguration()

//獲得對映器
<T> T getMapper(Class<T> type)
複製程式碼

mapper

  • 用來繫結對映SQL語句的介面
  • 由java介面和xml組成,提供的功能有
    • 定義引數型別
    • 描述快取
    • 描述sql語句
    • 定義查詢結果和POJO的對映關係
  • 生命週期小於SqlSession,如同jdb中一條sql的執行
  • 用過之後不需要顯示關閉mapper

4. mybatis配置說明

4.1 主配置檔案

所有支援的配置項介紹文件:mybatis配置檔案說明,最外層標籤為configuration,子標籤有:

  • propertiess, 可以外部配置且動態替換

  • typeAliases,定義別名。用於減少冗長的類限定名,只和xml配置有關

    <typeAlias>
        <typeAlia alias="role" type="XXX"/>
        <package name="xxx"/>
    </typeAlias>
    複製程式碼
  • mappers,定義對映器,告訴mybatis去哪裡找對映器

    <mappers>
        <mapper resource="xxx"/>
        <mapper url="file:://xxx"/>
        <mapper class="xxx"/>
        <!--包內的所有介面都註冊為對映器-->
        <package name="xxx" />
    </mappers>
    複製程式碼
  • typeHandlers,用於將獲取的值轉化為合適的java型別

    <typeHandlers>
        <typeHandler handler="xxx">
    </typeHandlers>
    複製程式碼

    mybatis提供了很多預設的型別處理器,簡單列舉幾個

    • BooleanTypeHandler:boolean-bool
    • StringTypeHandler:String-varchar,char
    • IntegerTypeHandler:Integer-int
    • DateTypeHandler:Date-timestamp
    • EnumTypeHandler:儲存列舉類字串
    • EnumOrdinalTypeHandler:儲存列舉類下標

    如果標準處理器滿足不了需求,可自定義處理器選擇性對映到某個JDBC型別,具體步驟:

    • 實現org.apache.ibatis.type.TypeHandler介面
    • 指定該處理器要對映的jdbc型別:配置檔案typeHandler中指定jdbc=“xxx”,或者處理類上使用@MappedJdbcTypes
    • 指定該處理器要對映的java型別:
  • environments,定義瞭如何配置資料庫環境資訊

    <environments>
        <environment>
            <transactionManager type="JDBC">
            </transactionManager>
            <dataSource type="POOLED">
                <property name="url" value="xxx">
                ...
            </dataSource>
        </environment>
    </environments>
    複製程式碼
  • settings,很重要的引數

    <settings>
      <!--全域性開啟對映器已經配置的任何快取-->
      <setting name="cacheEnabled" value="true"/>
      <!--延遲載入的全域性開關-->
      <setting name="lazyLoadingEnabled" value="true"/>
      <!--是否執行單一語句返回多條結果集-->
      <setting name="multipleResultSetsEnabled" value="true"/>
      <!--列標籤代替列名-->
      <setting name="useColumnLabel" value="true"/>
      <!--執行jdbc支援自增長主鍵-->
      <setting name="useGeneratedKeys" value="false"/>
      <!--如何自動對映列到欄位屬性-->
      <setting name="autoMappingBehavior" value="PARTIAL"/>
      <!---->
      <setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
      <!--預設的執行器-->
      <setting name="defaultExecutorType" value="SIMPLE"/>
      <!--超時時間-->
      <setting name="defaultStatementTimeout" value="25"/>
      <!--日誌框架,可選值有:SLF4J,LOG4J,JDK_LOGGING,COMMONS_LOGGING,STDOUT_LOGGING,NO_LOGGING-->
      <setting name="logImpl" value="LOG4J"/>
      <!---->
      <setting name="defaultFetchSize" value="100"/>
      <!---->
      <setting name="safeRowBoundsEnabled" value="false"/>
      <!--是否開啟自動駝峰命名規則:下劃線列名轉駝峰變數名-->
      <setting name="mapUnderscoreToCamelCase" value="false"/>
      <!---->
      <setting name="localCacheScope" value="SESSION"/>
      <!---->
      <setting name="jdbcTypeForNull" value="OTHER"/>
      <!---->
      <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
    </settings>
    複製程式碼
  • objectFactory:建立結果物件的工廠類,可自定義覆蓋預設的

    <objectFactory type="XXX">
        <property name="xx", value="xx"/>
    </objectFactory>
    複製程式碼
  • plugins:外掛執行定義攔截器,攔截mybatis執行過程中的某些呼叫

4.2 Mapper對映檔案

對映檔案定義了介面要執行的sql語句,所有支援的對映檔案介紹文件:mybatis對映檔案說明

  • select
    <select
        id="呼叫介面的函式名稱,唯一標識"
        parameterType="引數型別,可省略,會根據typehandler自動推斷"
        parameterMap="被廢棄的選項"
        resultType="返回結果的型別,不能與resultMap同時存在"
        resultMap="返回結果的外部集合對映,不能與resultType同時存在。resultType為bean時,底層使用了resultMap"
        flushCache="設定為true表示任何時候呼叫都會清除本地和二級快取,預設false"
        useCache="是否開啟本地和二級快取,預設為true"
        timeout="驅動等待資料庫響應時間,預設為unset,依賴驅動"
        fetchSize="驅動每次批量返回結果數"
        statementType="預設preparedStatement"
        resultSetType="結果集型別,逗號分開">
        select id, name from table_name where id = #{id}
    </select>
    複製程式碼
  • insert/update/delete:很多屬性同insert
    <insert 
        ...
        useGeneratedKeys="是否取出資料庫自增長得到的id,預設false"
        keyProperty=“generatedKey的目標屬性欄位”
        keyColumn=“generatedKey的目標列名,主鍵列不是第一列需要設定”
        >
    </insert>
    複製程式碼
  • sql:定義可重用的sql語句
    <sql id="xxx">
    </sql>
    <!--呼叫的地方-->
    <include refid="xxx"/>
    複製程式碼
  • resultMap:mybatis只最重要最強大的元素
    <resultMap>
        <!--注入結果到構造方法中-->
        <constructor>
            <idArg column="" javatype="">
            <arg>
        </constructor>
        <!--複雜型別的關聯-->
        <association>
        </association>
        <!--複雜型別的集合-->
        <collection>
        </collection>
    </resultMap>
    複製程式碼
  • cache:開啟快取,預設情況下是不開啟快取的,除了區域性session
    <!--開啟可讀可寫快取,所有select都被快取,insert,delete和update重新整理快取,-->
    <cache
        <!--回收策略:包括LRU(預設),FIFO,SOFT,WEAK-->
        eviction="LRU"
        <!--重新整理時間,單位毫秒-->
        flushInternval="60000"
        readOnly="true"
        <!--快取儲存的引用數量,預設1024-->
        size="512"
    />
    <cache type="自定義快取,必須實現org.mybatis.cache.Cache介面"/>
    複製程式碼
  • cache-ref:引用另外一個快取

5. 動態SQL

動態SQL:用於根據條件包含where字句的一部分。動態SQL包括if,choose,trim,foreach

    <select/insert id="xx">
        select id, name, status
        from table_name
        where status = #{status}
        <!--普通的條件判斷語句-->
        <if test="name != null">
        and name like #{name}
        </if>
        <!--條件分支語句,類似與switch-->
        <choose>
            <when test="name != null">
            </when>
            <otherwise>
            </otherwise>
        </choose>
        <!--會自動去除條件不滿足時多餘的where,and,or等關鍵字-->
        <where>
        </where>
        <!--自定義去除某些符號的功能-->
        <trim prefix="WHERE" prefixOverrides="AND|OR">
        </trim>
        <set>
            <if>
        </set>
        <foreach item="" index="" collection="">
        </foreach>
    </select>
複製程式碼

三. Mybatis Spring

1. 概述

  • 無縫的將mybatis整合到spring中,使用這個類庫,spring會載入必要到工廠類和session類
  • 允許mybatis參與到spring的事務管理中,利用了spring的DataSourceTransactionManger
  • 使用mybatis-spring,需要在上下文中定義sqlSessionFactory和至少一個數據對映器類

2. 如何使用

  • pom中新增mybatis-spring依賴
  • spring的xml檔案中傳入資料來源,並配置sqlSessionFactory
  • spring的xml檔案中配置mapper對映介面
  • 業務程式碼中獲取自動注入到容器的對映介面,並呼叫增刪改查方法操作資料庫

3. SqlSessionFactoryBean

  • 前面介紹原生Mybatis中,通過SqlSessionFactoryBuilder建立SqlSessionFactory。而mybati-spring中由SqlSessionFactoryBean建立
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
      <!--必須的屬性,配置資料來源-->
      <property name="dataSource" ref="dataSource" />
      <!--可選屬性,配置對映檔案路徑-->
       <property name="mapperLocations" value="classpath*:sample/config/mappers/**/*.xml" />
    </bean>
    複製程式碼
  • SqlSessionFactoryBean實現了spring的FactoryBean介面
  • 它必須注入dataSource屬性

4. 配置事務

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <!--資料來源必須和SqlSessionFactoryBean配置的資料來源一致-->
  <property name="dataSource" ref="dataSource" />
</bean>
複製程式碼

5. 使用SqlSession

  • 原生mybatis中,通過SqlSessionFactory獲取SqlSession,在mybatis-spring中,不再需要直接使用SqlSessionFactory,因為SqlSession已經以執行緒安全的Bean的方式自動注入了
  • SqlSessionTemplate是mybatis-spring的核心,實現了SqlSession介面,負責管理SqlSession。它是執行緒安全的,可以被多個Dao呼叫。還負責SqlSession的的生命週期,包括關閉,提交和回滾操作
  • SqlSessionTemplate被設計用於替換預設的DefaultSqlSession

6. 注入對映器

  • 為了代替手工呼叫SqlSessionTemplate編寫DAO層業務程式碼,mybatis-spring提供了動態代理的實現類:MapperFactoryBean,該類是設計成泛型,將mapper介面類自動注入到service類中,無需自己寫實現類,內部會自動建立代理
<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
  <property name="mapperInterface" value="org.mybatis.spring.sample.mapper.UserMapper" />
  <property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
複製程式碼
  • MapperFactoryBean建立的代理類實現了UserMapper介面,並注入到應用程式中
  • 為了代替手工註冊每個對映器,可以使用MapperScannerConfigurer,它會建立路徑下所有對映器,被自動建立MapperFactoryBean
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  <property name="basePackage" value="org.mybatis.spring.sample.mapper" />
</bean>
複製程式碼

四. Mybatis Springboot Starter

1. 概述

  • 基於springboot快速構建mybatis應用程式
  • 使用mybatis-spring,我們需要在xml中配置SqlSessionFactory和mapper對映介面
  • 使用mybatis-springboot-starter,會自動檢測dataSource,並根據資料來源,使用SqlSessionFactoryBean自動建立並註冊一個SqlSessionFactory,同時將建立SqlSessionTemplate,自動掃描mapper,關聯到SqlSessionTemplate並注入到容器中
  • 預設掃描所有帶@Mapper的介面,自定義掃描某些包,需要使用@MapperSacn註解

2. 如何使用

  • pom中新增mybatis-spring-boot-starter依賴
  • application.xml中新增資料來源和mybatis相關配置資訊
  • 對映介面上新增@Mapper註解,或使用@MapperScan掃描整個包的mapper
  • 業務程式碼中獲取自動注入到容器的mapper介面,呼叫mapper的增刪改查方法操作資料庫

3. 配置檔案

  • 配置資訊放在application.properties或application.yml檔案中,以mybatis作為配置的字首。引數配置同前面介紹的原生mybatis配置
# application.properties
# 指定mybatis-config.xml檔案的位置
mybatis.config-location=classpath:mybatis-config.xml
# 指定mapper的xml檔案路徑
mybatis.mapper-locations=classpath:com/xx
mybatis.executor-type=SIMPLE
# 指定別名的包,多個用逗號分開
mybatis.type-aliases-package=com.example.domain.model
mybatis.type-handlers-package=com.example.typehandler
mybatis.configuration.map-underscore-to-camel-case=true
mybatis.configuration.default-fetch-size=100
mybatis.configuration.default-statement-timeout=30
複製程式碼

五. Mybatis原始碼分析

1. mybatis相關jar包說明

1.1 mybatis-spring-boot-starter.jar

  • 只有一個pom檔案和spring.provides檔案,官方提供的一些starter格式大致都是這個套路。真正處理自動配置功能的是XXX-autoconfigure.jar完成
  • pom中依賴項:jdbc, mybatis, mybatis-spring, mybatis-spring-boot-autoconfigure(真正完成自動配置的jar包)
  • provides:說明這個starter配置以後,自動引入的包有哪些

1.2 mybatis-spring-boot-autoconfigure.jar

  • xxx-autoconfigure是開發一個starter預設使用的自動配置包
  • META-INF/spring.factories: 指定了自動配置的類名是MybatisAutoConfiguration
  • MybatisProperties: 指明瞭application.properties檔案中配置資訊對應的屬性類
  • MybatisAutoConfiguration:自動配置實現類,函式入口的地方。根據DataSource自動注入SqlSessionFactory,再根據SqlSessionFactory自動注入SqlSessionTemplate。SqlSessionTemplate內部的操作都是通過建立SqlSession的代理sqlSessionProxy來操作的

1.3 mybatis-spring.jar

  • mybatis和spring的整合包

1.4 mybatis.jar

  • 最原生的mybatis包

2. 配置檔案載入

2.1 UML圖

  • 訪問資料庫層,最基本的介面是SqlSession,它的預設實現為DefaultSqlSession, 在mybatis-spring中使用SqlSessionTemplate
  • SqlSession通過SqlSessionFactory工廠來建立,而sqlSessionFactory通過建造者SqlSessionFactoryBuilder建立
  • SqlSessionFactoryBuilder是通用的構造類類,通過它構造出SqlSessionFactory。可以手工直接呼叫SqlSessionFactoryBuilder。
  • mybatis為了和spring整合,提供了mybatis-spring這個jar包。提供的SqlSessionFactoryBean類,內部封裝了對SqlSessionFactoryBuilder的呼叫
  • springboot進一步提供了MybatisAutoConfiguration做自動配置,內部的sqlSessionFactory方法,最終呼叫了SqlSessionFactoryBean
  • Configuration提供兩類資料,一類是輸入類:Environment,通過給定的配置檔案,將配置資訊

2.2 原始碼跟蹤

  • MybatisAutoConfiguration類內部構造了SqlSessionFactoryBean物件

  • SqlSessionFactoryBean實現了FactoryBean介面,所以getBean獲取例項時實際呼叫他的getObject方法。內部呼叫了afterPropertiesSet方法。afterPropertiesSet方法被重寫,內部呼叫buildSqlSessionFactory

  • buildSqlSessionFactory內部建立了XMLConfigBuilder,用於解析mybatis的配置檔案

  • 真正解析配置檔案的地方

  • 解析的配置檔案的根為configuration,然後依次解析子標籤:包括最重要的mappers標籤。這部分的解析和前面介紹的配置檔案說明是一一對應的,所有標籤都有對應的解析標籤的程式碼

  • 對mapper檔案的解析,內部又具體呼叫了XMLMapperBuilder類的parse方法。這部分的解析與前面介紹的mapper配置檔案說明也是一一對應的

  • 解析mapper檔案時,從根元素mapper開始,包括子節點cache,parameterMap,resultMap,select等。然後將解析的資訊都儲存到Configuration物件中。

  • 其中select,insert,delete,update語句的解析方法為

  • 解析完之後,放入一個map中,每條sql語句對應一個MappedStatement物件。其他屬性的解析類似,大多是放到map中。

  • 解析完所有的配置檔案,得到Configuration物件,將它作為引數傳給SqlSessionFactoryBuilder的build方法

  • SqlSessionFactoryBuilder內部根據Configuration引數,建立DefaultSqlSessionFactory類

  • DefaultSqlSessionFactory建構函式只是將Configuration儲存了下來,當需要獲取session時,根據內部的configuration去具體建立

  • 得到SqlSessionFactory後,根據它去建立SqlSessionTemplate

  • SqlSessionTemplate內部建立SqlSession的代理類,將沒有加事務的SqlSession的操作做強制提交

3. 動態代理的實現

3.1 概述

Dao層都是是一些介面 它並沒有實現類,為什麼介面可以直接使用呢? 那是因為MyBbatis使用了JDK動態代理機制動態生成了代理類,那麼代理類又是如何對SqlSession進行封裝的呢?

3.2 UML圖

3.3 原始碼跟蹤

註冊mapper並建立代理類

  • MapperScanConfiguration這個bean,掃描給定包下所有的mapper檔案,並註冊到MapperRegistry中
  • MapperRegistry中的addMappers方法將包名下每個mapper類建立一個MapperProxyFactory,放入map中。
  • 獲取mapper時,從map中找到對應的MapperProxyFactory,並將sqlSession引數傳給newInstance,創建出代理類
  • 建立代理類呼叫了JDK的動態代理方法,被代理類為DAO介面,代理類為MapperProxy
  • MapperProxy實現了InvocationHandler,重寫invoke方法。該方法主要呼叫MapperMethod的execute方法
  • MapperMethod的建立需要三個引數:DAO介面本身,方法類,Configuration物件
  • MapperMethod內部新建了兩個類:SqlCommand,MethodSignature
  • SqlCommand主要儲存了要查詢的這個介面方法的方法名稱和SQL查詢型別,這兩個值都需要先查詢MappedStatemen
  • MappedStatement查詢就是在前面章節說道瞭解析檔案完成後儲存到的Configuration的map中查詢
  • MethodSignature主要儲存引數,返回值,返回型別等資訊,主要解析Method類
  • MapperMethod執行execute時,就是根據前面建立的SqlCommand和MethodSignature的一些屬性執行不同的操作,這些操作都呼叫了SqlSession介面。比如:xml中的select語句,SqlCommand中type指定為SELECT,execute根據不同type執行不同方法。xml中返回型別是單條記錄,還是多條記錄。分別對應MethodSignature的不同屬性,然後執行不同的方法。

獲取mapper並執行

  • mapper的註冊前面介紹了是通過MapperRegistry的addMappers方法,而獲取mapper的方法是getMapper,那麼誰來呼叫這個getMapper方法呢?
  • 當我們再service中使用@Autowired註解獲取某個mapper介面時,實際上是呼叫了spring為我們自動注入的bean,這個操作是由MapperFactoryBean泛型類來完成。同SqlSessionFactoryBean一樣,MapperFactoryBean實現了FactoryBean介面,所以getBean獲取例項時實際呼叫他的getObject方法。getObejct內部通過sqlSession呼叫getMapper方法,避免了原生mybatis中每次手動通過sqlSession呼叫getMapper方法。
  • session物件是MapperFactoryBean的父類SqlSessionDaoSupport的屬性,內部具體實現類是SqlSessionTemplate
  • SqlSessionTemplate的getMapper方法,實際呼叫的是Configuration的getMapper方法
  • Configuration中的getMapper方法呼叫的就是前面一小節介紹的MapperRegistry類中註冊進去所有進行了動態代理後,放入一個map的物件

六. Mybatis Generator

1. 概述

  • mybatis generator是一個mybatis程式碼自動生成工具。官方文件中文文件
  • 生成的內容包括:
    • 實體物件:指定資料庫中指定表對應的java實體類
    • mapper xml檔案:每張表對應的增刪改查SQL語句
    • DAO介面:和SQL語句對應的java查詢介面
  • 多次生成時注意的事項:
    • xml檔案會自動合併,不會覆蓋已有的內容
    • java檔案不會合並,它預設會生成一個不同名字的檔案。可通過引數配置覆蓋原有的檔案

2. 如何使用

2.1 命令列執行使用

  • 定義配置檔案
  • 執行以下命令
 java -jar mybatis-generator-core-x.x.x.jar -configfile \temp\generatorConfig.xml -overwrite
複製程式碼

2.2 spring或springboot中使用

  • pom中新增依賴
    <build>
        <plugins>
            <plugin>
              <groupId>org.mybatis.generator</groupId>
              <artifactId>mybatis-generator-maven-plugin</artifactId>
              <version>${mybatis-generator.version}</version>
              <configuration>
                <overwrite>true</overwrite>
                <verbose>true</verbose>
              </configuration>
              <dependencies>
                <dependency>
                  <groupId>mysql</groupId>
                  <artifactId>mysql-connector-java</artifactId>
                  <version>${mysql.version}</version>
                </dependency>
              </dependencies>
            </plugin>
        </plugins>
    </build>
    複製程式碼
  • 執行外掛

3. 配置檔案說明

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE generatorConfiguration
      PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
      "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
    
    <generatorConfiguration>
      <!--非必填選項,用於新增執行類路徑位置到類路徑中-->
      <classPathEntry location="/Program Files/IBM/SQLLIB/java/db2java.zip" />
     
      <!--元素用於指定生成一組物件的環境-->
      <context id="DB2Tables" targetRuntime="MyBatis3">
        <!--註釋生成器的屬性-->
        <commentGenerator>
            <property name="suppressDate" value="true" />
            <!-- 是否去除自動生成的註釋 true:是 : false:否 -->
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>
       <!--指定資料庫連線資訊-->
        <jdbcConnection driverClass="COM.ibm.db2.jdbc.app.DB2Driver"
            connectionURL="jdbc:db2:TEST"
            userId="db2admin"
            password="db2admin">
        </jdbcConnection>
        
        <!--用於定義Java型別解析器的屬性-->
        <javaTypeResolver >
          <property name="forceBigDecimals" value="false" />
        </javaTypeResolver>

        <!-- 生成實體類的包名和位置-->
        <javaModelGenerator targetPackage="test.model" targetProject="\MBGTestProject\src">
          <property name="enableSubPackages" value="true" />
          <property name="trimStrings" value=
            
           

相關推薦

mybatis原理配置介紹原始碼分析

前言 mybatis核心元件有哪些?它是工作原理是什麼? mybatis配置檔案各個引數是什麼含義? mybatis只添加了介面類,沒有實現類,為什麼可以直接查詢呢? mybatis的mapper對映檔案各個引數又是什麼含義? mybatis-spring提供哪些機制簡化了原生mybatis? m

IOServer開源專案介紹原始碼分析

IOServer是國人寫的一個仿MINA的輕量級伺服器框架。最近因為使用MINA的緣故,閱讀了IOServer的原始碼,順便熟悉了J2SE NIO部分。 IOServer的設計目標是手機網遊伺服器框架。支援TCP協議。 這個框架的使用方法和MINA類似;它有一個Proto

docker container DNS配置介紹原始碼分析

本文主要介紹了docker容器的DNS配置及其注意點,重點對docker 1.10釋出的embedded DNS server進行了原始碼分析,看看embedded DNS server到底是個啥,它是如何工作的。 Configure container DN

Spring AOP介紹原始碼分析

一、AOP介紹 舉個例子來說明一下吧!現在系統中有很多的業務方法,如上傳產品資訊、修改產品資訊、釋出公司庫等;現在需要對這些方法的執行做效能監控,看每個業務方法的執行時間;在不改變原業務程式碼的基礎上,也許我們會這麼做: Offer介面: Offer實現: Offer代

ArrayList相關方法介紹原始碼分析

目錄 ArrayList簡介: ArrayList 相關方法介紹 程式碼表示 相關方法原始碼分析 ArrayList簡介:

Spring Boot從入門到精通(五)多資料來源配置實現原始碼分析

多資料來源配置在專案軟體中是比較常見的開發需求,Spring和Spring Boot中對此都有相應的解決方案可供大家參考。在Spring Boot中,如MyBatis、JdbcTemplate以及Jpa都可以配置多資料來源。 本文在前一篇“Spring Boot從入門到精通(四)連線MySQL資料庫(附原始碼

MyBatisMyBatis Tomcat JNDI原理原始碼分析

一、 Tomcat JNDI JNDI(java nameing and drectory interface),是一組在Java應用中訪問命名和服務的API,所謂命名服務,即將物件和名稱聯絡起來,使得可以通過名稱訪問並獲取物件。 簡單

淺談NAT概念原理配置NAT 網絡地址轉換---PAT端口地址轉換;

alt 網絡拓撲圖 ffffff 問題 作用 選擇 表示 隨機 ans NAT 網絡地址轉換理論概況:NAT的概念:它將自動修改IP包頭中的源IP地址或目的IP地址。IP地址的校驗則在NAT處理過程中自動完成。它是通過內部網絡的私網IP地址翻譯成全球唯一的公網IP地址,使內

HashMap實現原理原始碼分析(轉載)

作者: dreamcatcher-cx 出處: <http://www.cnblogs.com/chengxiao/>        雜湊表(hash table)也叫散列表,是一種非常重要的資料結構,應用場景及其豐富,

併發程式設計(三)—— ReentrantLock實現原理原始碼分析

  ReentrantLock是Java併發包中提供的一個可重入的互斥鎖。ReentrantLock和synchronized在基本用法,行為語義上都是類似的,同樣都具有可重入性。只不過相比原生的Synchronized,ReentrantLock增加了一些高階的擴充套件功能,比如它可以實現公平鎖,同時也可以

HashMap、ConcurrentHashMap實現原理原始碼分析

HashMap:https://www.cnblogs.com/chengxiao/p/6059914.html ConcurrentHashMap:https://blog.csdn.net/dingjianmin/article/details/79776646   遺留問

ConcurrentHashMap JDK1.8中結構原理原始碼分析

注:本文根據網路和部分書籍整理基於JDK1.7書寫,如有雷同敬請諒解  歡迎指正文中的錯誤之處。 資料結構       ConcurrentHashMap 1.8 拋棄了Segment分段鎖機制,採用Node + CAS + Synchronized來保證併發安全進行實現

【java基礎】ConcurrentHashMap實現原理原始碼分析

  ConcurrentHashMap是Java併發包中提供的一個執行緒安全且高效的HashMap實現(若對HashMap的實現原理還不甚瞭解,可參考我的另一篇文章),ConcurrentHashMap在併發程式設計的場景中使用頻率非常之高,本文就來分析下Concurre

HashMap實現原理原始碼分析

雜湊表(hash table)也叫散列表,是一種非常重要的資料結構,應用場景及其豐富,許多快取技術(比如memcached)的核心其實就是在記憶體中維護一張大的雜湊表,而HashMap的實現原理也常常出現在各類的面試題中,重要性可見一斑。本文會對java集合框架中的對

ConcurrentHashMap實現原理原始碼分析

ConcurrentHashMap是Java併發包中提供的一個執行緒安全且高效的HashMap實現(若對HashMap的實現原理還不甚瞭解,可參考我的另一篇文章),ConcurrentHashMap在併發程式設計的場景中使用頻率非常之高,本文就來分析下Concurrent

[轉]HashMap實現原理原始碼分析

目錄: 一、什麼是雜湊表 二、HashMap實現原理 三、為何HashMap的陣列長度一定是2的次冪? 四、為什麼重寫equals方法需同時重寫hashCode方法 一、什麼是雜湊表 雜湊表(hash table)也叫散列表,是一

(轉)HashMap實現原理原始碼分析

雜湊表(hash table)也叫散列表,是一種非常重要的資料結構,應用場景及其豐富,許多快取技術(比如memcached)的核心其實就是在記憶體中維護一張大的雜湊表,而HashMap的實現原理也常常出現在各類的面試題中,重要性可見一斑。本文會對java集合框架中的對應實

HashMap, ConcurrentHashMap 最詳細的原理原始碼分析

網上關於 HashMap 和 ConcurrentHashMap 的文章確實不少,不過缺斤少兩的文章比較多,所以才想自己也寫一篇,把細節說清楚說透,尤其像 Java8 中的 ConcurrentHashMap,大部分文章都說不清楚。 終歸是希望能降低大家學習的成本,不希望大家到處找各種不是很

JDK8中的HashMap實現原理原始碼分析

本篇所述原始碼基於JDK1.8.0_121 在寫上一篇線性表的文章的時候,筆者看的是Android原始碼中support24中的Java程式碼,當時發現這個ArrayList和LinkedList的原始碼和Java官方的沒有什麼區別,然而在閱讀HashMap原

springmvc工作原理原始碼分析

一、JavaEE體系結構 二、mvc 設計模式|思想 Model 模型層 (javaBean元件 = 領域模型(javaBean) + 業務層 + 持久層) View 檢視層( html、jsp…) Controller 控制層(委託模型層進行資料處理) 複製程式