MyBatis的兩個配置文件


MyBatis有兩個基本的配置文件,一個用來配置環境信息(mybatis.xml),一個用來寫SQL語句(xxMapper.xml)。

mybatis.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

    <!-- 加載類路徑下的屬性文件 -->
    <properties resource="db.properties"/>

    <!-- 設置一個默認的連接環境信息 -->
    <environments default="mysql_developer">
        <environment id="mysql_developer">
            <!-- mybatis使用jdbc事務管理方式 -->
            <transactionManager type="JDBC"></transactionManager>
            <!-- mybatis使用連接池方式來獲取連接 -->
            <dataSource type="POOLED">
                <!-- 配置與數據庫交互的4個必要屬性,不要直接寫,單獨寫在一個配置文件中 -->
                <property name="driver" value="${mysql.driver}"/>
                <property name="url" value="${mysql.url}"/>
                <property name="username" value="${mysql.username}"/>
                <property name="password" value="${mysql.password}"/>
            </dataSource>
        </environment>
        <!-- 連接環境信息,取一個任意唯一的名字 -->
        <environment id="oracle_developer">
            <!-- mybatis使用jdbc事務管理方式 -->
            <transactionManager type="jdbc"/>
            <!-- mybatis使用連接池方式來獲取連接 -->
            <dataSource type="pooled">
                <!-- 配置與數據庫交互的4個必要屬性 -->
                <property name="driver" value="${oracle.driver}"/>
                <property name="url" value="${oracle.url}"/>
                <property name="username" value="${oracle.username}"/>
                <property name="password" value="${oracle.password}"/>
            </dataSource>
        </environment>
    </environments>

    <!-- 加載映射文件-->
    <mappers>
        <mapper resource="com/winner/entity/StudentMapper.xml"/>
    </mappers>

</configuration>

xxMapper.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace可以寫類的全限定名,這樣做的好處是
  sqlSession.insert(Student.class.getName()+".addStudent");
-->
<mapper namespace="com.winner.entity.StudentMapper">

  <!--實體與表的映射,type是類名,但是沒有表名,可以理解表名在下面的sql語句中--> <resultMap id="studentMap" type="com.winner.entity.Student"> <id property="id" column="id"/> <result property="name" column="name"/> <result property="sal" column="sal"/> </resultMap> <insert id="addStudent" parameterType="com.winner.entity.Student"> <![CDATA[ INSERT INTO student(id,name,sal) VALUES (#{id},#{name},#{sal}) ]]> </insert> </mapper>

從配置文件中可以看出,映射關系中並沒有致命表的名字,可以這么理解,因為下面的sql語句中有表名,這里就省略了.

下面分析一下sql語句:

<insert id="addStudent" parameterType="com.winner.entity.Student">
        <![CDATA[ INSERT INTO student(id,name,sal) VALUES (#{id},#{name},#{sal}) ]]>
</insert>

#{id},#{name},#{sal}使用Student的getId(),getName(),getSal()替換.
new Student(1, "zhangsan", 1000d)->getId:1,getName:zhangsan,getSal:1000d
所以上述的sql語句實際上等價於:
INSERT INTO student(id,name,sal) VALUES (1,"zhangsan",1000d)

typeAliases
別名是一個較短的Java 類型的名稱,typeAliases是為Java類型命名一個短的名字,它只和XML配置有關,用來減少類完全限定名的多於部分,例如:

<typeAliases>
    <typeAlias type="com.winner.entity.Student" alias="Student"/>
</typeAliases>

有了這個配置,"Student"可以任意用來代替"com.winner.entity.Student"所使用的地方。這個設置在mybatis.xml文件中配置.

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.winner.entity.StudentMapper">
    <resultMap id="studentMap" type="student">
        <id property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="sal" column="sal"/>
    </resultMap>
    <insert id="addStudent" parameterType="Student">
        <![CDATA[ INSERT INTO student(id,name,sal) VALUES (#{id},#{name},#{sal}) ]]>
    </insert>
</mapper>

environments
  MyBatis能夠配置多套運行環境,這有助於將SQL 映射到多個數據庫上。例如,在開發、測試、生產環境中,可能有不同的配置。或者可能有多個共享同一schema 的生產用數據庫,或者想將相同的SQL映射應用到兩個數據庫等等許多用例。
  但是請記住:雖然可以配置多個運行環境,但是每個SqlSessionFactory實例只能選擇一個運行環境。
  因此,如果想連接兩個數據庫,就需要創建兩個SqlSessionFactory實例,一個數據庫對應一個SqlSessionFactory 實例。如果是三個數據庫,那就創建三個實例,如此類推。

  每個數據庫對應一個SqlSessionFactory實例。要指定哪個運行環境被創建,只需要簡單地將運行環境作為可選參數傳遞給SqlSessionFactoryBuilder,下面是兩個接受運行環境的方法

SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader,environment);
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader,environment,properties);

如果環境參數被忽略,那默認的環境配置將被加載,如下面

SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader);
SqlSessionFactory factory
= sqlSessionFactoryBuilder.build(reader,properties);

environments 元素定義了運行環境是怎么配置的。

<environments default="development">
  <environment id="development">
    <transactionManager type="JDBC">
      <property name="..." value="..."/>
    </transactionManager>
  <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>

注意這里關鍵的部分:
--默認的運行環境ID,引用一個已經定義好的運行環境ID(例如:default="development")
--每個定義的運行環境ID(例如:id="development")
--事務管理器配置(例如:type="JDBC")
--數據源配置(例如:type="POOLED")

<environments default="test">
  <environment id="development">   ......   </environment>
  <environment id="production">   ......   </environment>
  <environment id="test">   ......   </environment>
</environments>

上面例子中, <environments default="test">配置表明,目前使用的是test的運行環境。
當然,您也可以修改為使用production的運行環境: <environments default="production">

事務管理器
MyBatis有兩種事務管理類型(即type=”[JDBC|MANAGED]” ):
--JDBC – 這個配置直接使用JDBC的提交和回滾功能。它依賴於從數據源獲得連接來管理事務的生命周期。
--MANAGED – 這個配置基本上什么都不做。它從不提交或者回滾一個連接的事務。而是讓容器(例如: Spring或者J2EE應用服務器)來管理事務的生命周期 。默認情況下,它會關閉連接,但是一些容器並不會如此,因此,如果您需要通過關閉連接來停止事務,將
屬性closeConnection設置為false。例如:

<transactionManager type="MANAGED">
  <property name="closeConnection" value="false"/>
</transactionManager>

這兩個事務管理類型都不需要任何屬性。然而它們都是類型別名,換句話說,您可以設置成指向己實現了TransactionFactory接口的完整類名或者別名。

public interface TransactionFactory {
  void setProperties(Properties props);
  Transaction newTransaction(Connection conn, boolean autoCommit);
}

實例化后,任何在XML文件配置的屬性都將傳遞給setProperties()方法。在您的實現中還需要創建一個非常簡單的Transaction接口的實現:

public interface Transaction {
  Connection getConnection();
  void commit() throws SQLException;
  void rollback() throws SQLException;
  void close() throws SQLException;
}

通過這兩個接口,您能夠完全自定義MyBatis如何來處理事務。
dataSource元素
dataSource元素使用標准的JDBC數據源接口來配置JDBC連接對象源。大部分MyBatis應用都像上面例子那樣配置一個數據源,但這不是必須的。需要認清的
是,只有使用了延遲加載才需要數據源。MyBatis內置了三種數據源類型.
--UNPOOLED – 這個類型的數據源實現只是在每次需要的時候簡單地打開和關閉連接。雖然有點慢,但是對於不需要立即響應的簡單的應用來說,不失為一種好的選擇。不同的數據庫在性能方面也會有所不同,因此對於一些數據庫,不使用連接池時,這個配置就是比較理想的。UNPOOLED數據源有四個配置屬性:
---driver – 指定JDBC驅動器。
---url – 連接數據庫實例的JDBC URL。
---username –登陸數據庫的用戶名。
---password - 登陸數據庫的密碼。
---defaultTransactionIsolationLevel – 指定連接的默認事務隔離級別。
另外,您也可以通過在屬性前加前綴“ driver” 的方式,把屬性傳遞給數據庫驅動器,例如:
---driver.encoding=UTF8
這將會通過DriverManager.getConnection(url, driverProperties) 方法,將值是UTF8”的屬性“ encoding”傳遞給數據庫驅動器。
-POOLED – 這個數據源的實現緩存了JDBC連接對象,用於避免每次創建新的數據庫連接時都初始化和進行認證,加快程序響應。並發WEB應用通常通過這種做法來獲得快速響應。另外,除了上面(UNPOOLED)的屬性外,對POOLED數據源,還有很多屬性可以設置。
---poolMaximumActiveConnections – 在任何特定的時間內激活(能夠被使用)的連接數量,默認是10。
---poolMaximumIdleConnections –在任何特定的時間內空閑的連接數。
---poolMaximumCheckoutTime – 在連接池被強行返回前,一個連接能夠“ 檢出” 的總時間。默認是20000ms( 20秒)。
---poolTimeToWait – 這是一上比較底層的設置,如果連接占用了很長時間,能夠給連接池一個機會去打印日志,並重新嘗試連接。默認是20000ms( 20秒)。
---poolPingQuery –Ping Query 是發送給數據庫的Ping 信息,測試數據庫連接是否良好和是否准備好了接受請求。默認值是“ NO PING QUERY SET” ,讓大部分數據庫都不使用Ping,返回一個友好的錯誤信息(譯者注: MyBatis通過向數據執行SQL語句來確定與數據庫連接狀況)。
---poolPingEnabled – 這是允許或者禁ping query 的開關。如果允許,您同時也要用一條可用的(並且應該是最高效的) SQL 語句來設置poolPingQuery 屬性的值。默認是:false(即禁止)。
---poolPingConnectionsNotUsedFor – 這個屬性配置執行poolPingQuery 的間隔時間。通常設置為與數據庫連接的超時時間,來避免不必要的pings 。默認是: 0(允許所有連接隨時進行ping 測試,當然只有poolPingEnabled 設置為true 才會生效)。
-JNDI – 這個數據源的配置是為了准備與像Spring 或應用服務器能夠在外部或者內部配置數據源的容器一起使用,然后在JNDI 上下文中引用它。這個數據源只需配置兩個屬性:
---initial_context – 這個屬性被用來從InitialContext 中查找一個上下文。如:initialContext.lookup(initial_context)這個屬性是可選的,如果忽略,那么數據源就會直接從InitialContext中查找。
---data_source – 這個屬性是引用一個能夠被找到的數據源實例的上下文路徑。它會查找根據initial_context 從 initialContext中搜尋返回的上下文。或者在initial_context 沒有提供的情況下直接在InitialContext 中進行查找。
Mappers元素
現在, MyBatis的行為屬性都已經在上面的配置元素中配置好了,接下來開始定義映射SQL語句。但首先,我們需要告訴MyBatis在哪里能夠找到我們定義的映射SQL語句。在這方面,JAVA自動發現沒有提供好的方法,因此最好的方法是告訴MyBatis在哪里能夠找到這些映射文件。您可以使用類資源路徑或者URL(包括file:/// URLs),例如:

// Using classpath relative resources
<mappers>
  <mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
  <mapper resource="org/mybatis/builder/BlogMapper.xml"/>
  <mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>
// Using url fully qualified paths
<mappers>
  <mapper url="file:///var/sqlmaps/AuthorMapper.xml"/>
  <mapper url="file:///var/sqlmaps/BlogMapper.xml"/>
  <mapper url="file:///var/sqlmaps/PostMapper.xml"/>
</mappers>

這些配置告訴MyBatis在哪里找到SQL映射文件。而其它的更詳細的信息配置在每一個SQL映射文件里。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM