寫文章 MyBatis筆記二:配置

MyBatis筆記二:配置

1.全局配置

1.properites

這個配置主要是引入咱們的 properites 配置文件的:mysql

  <properties resource="db.properties"/>
  
  <environments default="development">
      <environment id="development">
          <transactionManager type="JDBC"/>
          <dataSource type="POOLED">
              <property name="driver" value="${driver}"/>
              <property name="url" value="${url}"/>
              <property name="username" value="${username}"/>
              <property name="password" value="${password}"/>
          </dataSource>
      </environment>
  </environments>

能夠看到咱們使用 <properties resource="db.properties"/> 引入了咱們的數據據庫的配置文件,而後這個標籤有兩個屬性 : resource 和 uri 第一種直接是引用項目下的文件。第二個就是引用網絡路徑的和咱們本地文件系統的資源。<!--more-->sql

2.settings

很是重要!!!數據庫

  <!--全局配置-->
  <settings>
      <setting name="mapUnderscoreToCamelCase" value="true"/>
  </settings>

裝了Mybatis 插件的話咱們會看到咱們的設置的代碼提示,都不用本身去記的。apache

3.typeAliases

能夠爲咱們的 Java 類型取別名。避免咱們去寫很長的類包名,等等。而且這裏提供了三種取別名的方式:緩存

1. typeAlias

  <typeAliases>
      <typeAlias type="lwen.entries.Employee" alias="emp"/>
  </typeAliases>

這就是給咱們的 Java 類取的別名,咱們在 xml 中配置返回值,參數,命名空間的時候就不用寫那麼長了。咱們直接寫 emp 便可,可是注意的是咱們若是不寫 alias 屬性他就會配置默認的別名,也就是咱們的類名首字母小寫。在這裏就是employee服務器

2.package

批量取別名,有時候咱們的一個包下面的類太多了咱們但願給他們都取上默認別名,咱們就可使用這個標籤,可是注意這個標籤不能和 typeAlias標籤共存 ,這個標籤指定的包實際上是對咱們的這個包以及他的子包進行別名操做,而且都是默認別名網絡

  <typeAliases>
      <package name="lwen.entries"/>
  </typeAliases>

3.@Alias

由於上面的兩個標籤不能同時存在,因此咱們沒辦法給某一個包下的特定的類取別名,這裏咱們就須要使用 @Alias 來作註解別名了,這樣能夠解決上面的問題。session

  @Alias("emps")

其實除了這些咱們須要自定義的一些別名,系統幫咱們預先設定好了不少經常使用的別名oracle

別名映射的類型_bytebyte_longlong_shortshort_intint_integerint_doubledouble_floatfloat_booleanbooleanstringStringbyteBytelongLongshortShortintIntegerintegerIntegerdoubleDoublefloatFloatbooleanBooleandateDatedecimalBigDecimalbigdecimalBigDecimalobjectObjectmapMaphashmapHashMaplistListarraylistArrayListcollectionCollectioniteratorIteratorapp


能夠看到規律就是類名小寫,而後基本類型就是下劃線。

4.typeHandler

這個東西其實就是把咱們的Java類型和數據庫的類型相對應,這裏暫時不具體說。

5.plugins

插件功能,對下面對象的方法進行攔截,他的原理就是動態代理。

  • Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
  • ParameterHandler (getParameterObject, setParameters)
  • ResultSetHandler (handleResultSets, handleOutputParameters)
  • StatementHandler (prepare, parameterize, batch, update, query)

6.environments

  <environments default="dev">
      <environment id="dev">
          <transactionManager type="JDBC">
              <property name="hah" value="heh"/>
          </transactionManager>
          <dataSource type="POOLED">
              <property name="password" value="${password}"/>
          </dataSource>
      </environment>
  </environments>

最外層就是咱們的 environments 這個就是配置各類環境(好比:開發,測試,線上...),因此說咱們的這個標籤有一個 default 屬性,就是用來制定咱們的具體激活哪一個環境的,這裏用的是 dev 。而後下面就是具體的環境了,環境的 id 就是咱們配置的環境的名稱,每個環境裏有且只有兩個屬性,就是 transactionManager 和 dataSource 他們必須配置不然會報錯。

能夠看到 transactionManager 有一個 Type 就是用來指定使用哪一個食物管理器,這裏它使用了 JDBC 的,其實在Mybatis中只有兩種:type=」[JDBC|MANAGED]」

  • JDBC – 這個配置就是直接使用了 JDBC 的提交和回滾設置,它依賴於從數據源獲得的鏈接來管理事務做用域。
  • MANAGED – 這個配置幾乎沒作什麼。它歷來不提交或回滾一個鏈接,而是讓容器來管理事務的整個生命週期(好比 JEE 應用服務器的上下文)。 默認狀況下它會關閉鏈接,然而一些容器並不但願這樣,所以須要將 closeConnection 屬性設置爲 false 來阻止它默認的關閉行爲。例如:
  <transactionManager type="MANAGED">
    <property name="closeConnection" value="false"/>
  </transactionManager>

而後咱們就很好奇這些 MANAGED 之類的東西在哪有定義,咱們是否能夠配置本身的書屋管理器好比強大的 Spring的事務管理。

org.apache.ibatis.session.Configuration 在這個類裏咱們發現了

  typeAliasRegistry.registerAlias("JDBC", JdbcTransactionFactory.class);
  typeAliasRegistry.registerAlias("MANAGED", ManagedTransactionFactory.class);
  
  typeAliasRegistry.registerAlias("JNDI", JndiDataSourceFactory.class);
  typeAliasRegistry.registerAlias("POOLED", PooledDataSourceFactory.class);
  typeAliasRegistry.registerAlias("UNPOOLED", UnpooledDataSourceFactory.class);

也就是說他們都是別名而已。那麼咱們就能夠配置本身的類了,咱們直接在 type 位置寫上咱們的事務管理器全類名,或者使用別名機制也能夠。具體的對應的類須要什麼特性咱們直接看看他原本自帶的兩個類就明白了。

顯然下面的配置數據源也是如此,默認的採用了鏈接池,也就是咱們的 sqlSession 對象會被緩存起來不用每次去數據庫裏獲取。

7.databaseIdProvider

MyBatis 能夠根據不一樣的數據庫廠商執行不一樣的語句,這種多廠商的支持是基於映射語句中的databaseId 屬性。 MyBatis 會加載不帶 databaseId 屬性和帶有匹配當前數據庫 databaseId屬性的全部語句。 若是同時找到帶有 databaseId 和不帶 databaseId 的相同語句,則後者會被捨棄。

咱們經過設置屬性別名來使其變短 :

  <databaseIdProvider type="DB_VENDOR">
    <property name="SQL Server" value="sqlserver"/>
    <property name="DB2" value="db2"/>        
    <property name="Oracle" value="oracle" />
    <property name="MySQL" value="mysql" />
  </databaseIdProvider>

而後咱們在 mapper 的xml文件中就能夠匹配這些數據提供商:

  <select id="getEmployeeById" resultType="lwen.entries.Employee" databaseId="mysql">
      select * from employee where id=#{id}  </select>
  <select id="getEmployeeById" resultType="lwen.entries.Employee" databaseId="oracle">
      select * from employee where id=#{id}  </select>

那麼他會按照數據源來肯定當前是哪一個數據源,咱們須要使用哪一個sql語句。這些都是自動進行的,無需咱們的干預。

8.mappers

這個就是用來配置咱們的 mapper 的 xml 標籤了。咱們在裏面配置 xml 有如下三種方式:

1.使用 mapper 標籤

  <!--咱們的mapper文件的位置-->
  <mappers>
      <mapper resource="EmployeeMapper.xml"/>
      <mapper resource="EmployeeMapperInterface.xml"/>
  </mappers>

顯然這個地方的 mapper 標籤還有兩個屬性 分別就是 resource 和 uri 就是和上面是同樣的。

2.使用包掃描的方式

  <package name="lwen"/>

lwen 包下面的xml 映射文件都被加載進去。

3.註解

咱們可使用對應的註解 註解名 就是咱們的 sql 語句的動做。 @Select Update 等等

注意以上的標籤都是有順序的,順序不能隨便配置

相關文章
相關標籤/搜索