1. 程式人生 > >MyBatis全局配置文件標簽詳解

MyBatis全局配置文件標簽詳解

ons 需要 很多 tar ips 小寫 oid 標準 數據

一、全局配置文件結構

configuration 配置
  properties 屬性:可以加載properties配置文件的信息
  settings 設置:可以設置mybatis的全局屬性
  typeAliases 類型命名
  typeHandlers 類型處理器
  objectFactory 對象工廠
  plugins 插件
  environments 環境
    environment 環境變量
      transactionManager 事務管理器
      dataSource 數據源
  databaseIdProvider 數據庫廠商標識
  mappers 映射器

  1、為全局配置文件綁定dtd約束:
    1)聯網會自動綁定
    2)沒網的時候【/org/apache/ibatis/builder/xml/mybatis-3-config.dtd】:解壓mybatis 的jar包然後在eclipse中綁定

        window——preperances——XML Catalog ——Add——設置key為http://mybatis.org/dtd/mybatis-3-config.dtd,綁定本地文件位置location:

  2、 properties屬性

 1   <configuration>
 2     <!--
3     1.mybatis可以使用properties來引入外部properties配置文件的內容 4     resource:引入類路徑下的資源 5     url:引入網絡路徑或者磁盤路徑下的資源 6     --> 7     <properties resource="jdbc.properties"></properties> 8     <environments default="development"> 9       <environment id="development"> 10         <
transactionManager type="JDBC"/> 11         <dataSource type="POOLED"> 12           <property name="driver" value="${jdbc.driver}"/> 13           <property name="url" value="${jdbc.url}"/> 14           <property name="username" value="${jdbc.user}"/> 15           <property name="password" value="${jdbc.passowrd}"/> 16         </dataSource> 17       </environment> 18     </environments> 19     <!-- 將我們寫好的sql映射文件一定要註冊到全局配置文件中 --> 20     <mappers> 21     <mapper resource="EmployeeMapper.xml"/> 22     </mappers> 23   </configuration>

  3、settings包含很多重要的設置項

    setting:用來設置每一個設置

    name:設置項名

    value:設置項取值

  舉例:駝峰式命名

1   <settings>
2     <setting name="mapUnderscoreToCamelCase" value="true"/>
3   </settings>

    1).mapUnderscoreToCamelCase:自動完成數據表標準列名和持久化類標準屬性名之間的映射。

      例如:last_name和lastName

  4、typeAliases:給類起別名【不建議大家使用別名】

    作用:A type alias is simply a shorter name for a Java type

 1   <!-- typeAliases:別名處理器,可以為我們的java類型起別名,別名不區分大小寫 -->
 2   <typeAliases>
 3     <!-- typeAlias:為某個java類型起別名
 4     type:指定要起別名的類型全類名;默認別名就是類名小寫;
 5     alias:執行新的別名
 6     -->
 7     <typeAlias type="com.neuedu.mybatis.bean.Employee"/>
 8     <!-- 
 9     package:為某個包下的所有類批量起別名
10     name:指定包名(為當前包以及下面所有的後代包的每一個類都起一個默認別名【類名小寫】)
11     -->
12     <package name="com.neuedu.mybatis.bean"/>
13     <!-- 批量起別名的情況下,使用@Alias註解為某個類型指定新的別名 -->
14   </typeAliases>

  雖然有這麽多的別名可以使用:但是建議大家還是使用全類名,看SQL語句是怎麽被封裝為JAVA 對象的時候簡單!

  5、typeHandlers:類型處理器

      類型處理器:負責如何將數據庫的類型和java對象類型之間轉換的工具類

  6、environments【用於配置MyBatis的開發環境】

      environments:環境們,mybatis可以配置多種環境,default指定使用某種環境。可以達到快速切換環境。

        environment:配置一個具體的環境信息;必須有兩個標簽;id代表當前環境的唯一標識

          transactionManager:事務管理器

            type:事務管理器的類型;type="[JDBC|MANAGED]"),這兩個都是別名,在Configuration類中可以查看具體類!但是Spring對事務的控制才是最終的管理方案!

            JDBC:這個配置就是直接使用了JDBC的提交和回滾設置,它依賴於從數據源得到的連接來管理事務。

            MANAGED:這個配置幾乎沒做什麽,它從來不提交和回滾一個連接。而是讓容器來管理事務的整個生命周期。

            所以綜上:這裏如果要配置事務處理器,就配置為JDBC。表示使用本地的JDBC事務。

            當然也可以自定義事務管理器:只需要和人家一樣實現TransactionFactory接口,type指定為全類名。

          dataSource:數據源

            type:type="[UNPOOLED|POOLED|JNDI]"

            unpooled:無數據庫連接池

            pooled:有數據庫連接池

            JNDI:自定義數據源:實現DataSourceFactory接口,type也是全類名

        但是我們也說了,無論是事務管理器的配置還是數據源的配置我們都會使用spring來做,這裏只需要了解一下即可!

 1   <environments default="development">
 2     <environment id="test">
 3       <transactionManager type="JDBC"/>
 4       <dataSource type="POOLED">
 5         <property name="driver" value="${test.driver}"/>
 6         <property name="url" value="${test.url}"/>
 7         <property name="username" value="${test.user}"/>
 8         <property name="password" value="${test.passowrd}"/>
 9       </dataSource>
10     </environment>
11     <environment id="development">
12       <transactionManager type="JDBC"/>
13       <dataSource type="POOLED">
14         <property name="driver" value="${jdbc.driver}"/>
15         <property name="url" value="${jdbc.url}"/>
16         <property name="username" value="${jdbc.user}"/>
17         <property name="password" value="${jdbc.passowrd}"/>
18       </dataSource>
19     </environment>
20   </environments>

  補充:如何配置第三方數據源

    定制自己的第三方數據源,如下所示:

      要求:需要自定義一個類繼承UnpooledDataSourceFactory類,然後在構造器中初始化該對應的dataSource屬性,如下所示:

  自定義類為:

1   public class C3P0DataSource extends UnpooledDataSourceFactory{
2     public C3P0DataSource() {
3       this.dataSource = new ComboPooledDataSource(); 
4     }
5   }

  MyBatis的全局配置文件為:

 1   <environments default="development">
 2        <environment id="development">
 3             <transactionManager type="JDBC"/>
 4             <!--<dataSource type="POOLED">
 5                 <property name="driver" value="${jdbc.driver}"/>
 6                 <property name="url" value="${jdbc.url}"/>
 7                 <property name="username" value="${jdbc.username}"/>
 8                 <property name="password" value="${jdbc.password}"/>
 9             </dataSource> -->
10             <!-- 配置使用第三方的數據源。屬性需要配置為第三方數據源的屬性 -->
11             <dataSource type="com.neuedu.mapper.C3P0DataSource">
12                 <property name="driverClass" value="${jdbc.driver}"/>
13                 <property name="jdbcUrl" value="${jdbc.url}"/>
14                 <property name="user" value="${jdbc.username}"/>
15                 <property name="password" value="${jdbc.password}"/>
16             </dataSource>
17          </environment>
18   </environments>

  測試類:

 1   @Test
 2   public void test02(){
 3     //1.獲取sqlSessionFactory對象
 4     SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
 5     //2.利用sqlSessionFactory對象創建一個SqlSession對象
 6     SqlSession session = sqlSessionFactory.openSession();
 7     System.out.println(session.getConnection());
 8     //提交事務
 9     session.commit();
10   }

  當然這裏需要加入c3p0的jar包;

    c3p0-0.9.2.1.jar

    mchange-commons-java-0.2.3.4.jar

  7、MyBatis的增刪改查標簽:

      <select></select>

      <insert></insert>

      <update></update>

      <delete></delete>
    例如:

1   <insert id="saveEmployee">
2     INSERT INTO tbl_employee(user_name,email,gender) VALUES(#{userName},#{email},#{gender})
3   </insert>

  8、databaseIdProvider環境

    MyBatis is able to execute different statements depending on your database vendor.

    ? MyBatis 可以根據不同的數據庫廠商執行不同的語句

1   <databaseIdProvider type="DB_VENDOR">
2     <property name="SQL Server" value="sqlserver"/>
3     <property name="DB2" value="db2"/>
4     <property name="Oracle" value="oracle" />
5     <property name="MySQL" value="mysql" />
6   </databaseIdProvider>

    Type: DB_VENDOR

      –使用MyBatis提供的VendorDatabaseIdProvider解析數據庫 廠商標識。也可以實現DatabaseIdProvider接口來自定義。

    Property-name:數據庫廠商標識

    Property-value:為標識起一個別名,方便SQL語句使用

  這樣在執行不同數據庫的時候,就會執行不同數據庫的語句了!

    databaseId屬性:

      1).對於不同的數據庫,做不同的SQL操作時,SQL語句會有不同。例如:

        MySQL和Oracle的分頁[mysql分頁為limit,而ORACLE分頁我們使用rownumber]、插入主鍵的方式。

          MySQL:INSERT INTO tbl_employee(user_name,email,gender) VALUES(#{userName},#{email},#{gender})

          ORACLE:INSERT INTO employee(id,user_name,email) VALUES(test.seq.nextval,#{userName},#{email})

        所以要想使用ORACLE的自增序列還需要創建一個序列:

        如下所示:

          create sequence test_seq start with 1;

    這樣做的好處:在service層只需要調用一個mybatis的方法,而不需要關註底層選擇使用的數據庫。

      employeeDao.insert(employee);

  mybatis如何區分使用的是哪個數據庫呢?使用databaseId屬性

    ①.在mybatis-config.xml文件中進行配置

1   <databaseIdProvider type="DB_VENDOR">
2     <property name="ORACLE" value="oracle"/>
3     <property name="MySQL" value="mysql"/>
4   </databaseIdProvider>

    ②.在mybatis的映射文件中使用databaseId來區分使用的是哪一個數據庫

      在mybatis的全局配置文件配置了這個之後,我們只需要在sql映射文件中通過在執行語句的標簽上加一個屬性databaseId即可!

1   <select id="getEmployeeById" resultType="emp">
2     select * from tbl_employee where id = #{id}
3   </select>
4   <select id="getEmployeeById" resultType="emp" databaseId="mysql">
5     select * from tbl_employee where id = #{id}
6   </select>
7   <select id="getEmployeeById" resultType="emp" databaseId="oracle">
8     select * from tbl_employee where id = #{id}
9   </select>

    全局配置文件

 1   <environments default="dev_mysql">
 2     <environment id="dev_oracle">
 3       <transactionManager type="JDBC"/>
 4       <dataSource type="POOLED">
 5         <property name="driver" value="${jdbc.oracle.driver}"/>
 6         <property name="url" value="${jdbc.oracle.url}"/>
 7         <property name="username" value="${jdbc.oracle.user}"/>
 8         <property name="password" value="${jdbc.oracle.passowrd}"/>
 9       </dataSource>
10     </environment>
11     <environment id="dev_mysql">
12       <transactionManager type="JDBC"/>
13       <dataSource type="POOLED">
14         <property name="driver" value="${jdbc.driver}"/>
15         <property name="url" value="${jdbc.url}"/>
16         <property name="username" value="${jdbc.user}"/>
17         <property name="password" value="${jdbc.passowrd}"/>
18       </dataSource>
19     </environment>
20   </environments>

  9、mapper映射

    <!-- mappers:將sql映射註冊到全局配置中 -->

       mapper:註冊一個sql映射

      註冊配置文件:

        resource:引用類路徑下的sql映射文件:mybatis/mapper/EmployeeMapper.xml

        url:引用網絡路徑下或者磁盤路徑下的sql映射文件:url="file:///var/mappers/AuthorMapper.xml"

    註冊接口

      class:引用(註冊)接口

        1.有sql映射文件,映射文件名必須和接口同名,並且放在與接口同一個目錄下;

        2.沒有sql映射文件,所有的sql都是利用註解寫在接口上;

      推薦:

        1.比較重要的,復雜的Dao接口我們來寫sql映射文件

        2.不重要,見到的Dao接口為了開發快速可以使用註解

1   <mappers>
2     <mapper resource="mybatis/mapper/EmployeeMapper.xml"/>
3     <mapper class="com.neuedu.mybatis.mapper.EmployeeMapperAnnotation"/>
4     <!-- 批量註冊:
5       1.註解版肯定是沒問題的
6       2.但是對於Mapper.xml映射文件和接口分開的,就需要保證在同一個包下了,否則找不到 -->
7     <package name="com.neuedu.mybatis.mapper"/>
8   </mappers>

  10、最後就是全局配置文件中標簽實際上是有順序的!

MyBatis全局配置文件標簽詳解