MyBatis配置文件詳解


用maven搭建的MyBatis環境,目錄結構如下

  

配置文件在src/main/resources目錄下,是configuration.xml

1:先看一下簡單的配置:

  

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

    <!-- 可以配置多個運行環境,但是每個SqlSessionFactory 實例只能選擇一個運行環境 -->
    <environments default="work">
        <environment id="work">
            <transactionManager type="JDBC"></transactionManager>
            <!-- UNPOOLED POOLED JNDI -->
            <dataSource type="UNPOOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis" />
                <property name="username" value="root" />
                <property name="password" value="密碼" />
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/zhao/mapper/StudentMapper.xml"/>
    </mappers>
</configuration>

congfiguration:根元素

<configuraion> 

  environments:配置MyBatis環境,可以配置過個運行環境,但是SqlSessionFactory只能選擇一個運行環境

  <environments default="development">
    <environment id="development">

      transactionManager:事務管理器

        type=JDBC或者MANAGED

          JDBC:使用JDBC的提交和回滾設置;

          MANAGED:讓容器管理事務的整個生命周期

      <transactionManager type="JDBC"></transactionManager>
      dataSource:數據源     

        dataSource 元素使用標准的JDBC 數據源接口來配置JDBC 連接對象源。

        MyBatis 內置了三種數據源類型:

          UNPOOLED – 這個數據源的實現是每次被請求時簡單打開和關閉連接。它有一點慢,  這是對簡單應用程序的一個很好的選擇, 因為它不需要及時的可用連接。 不同的數據庫對這 個的表現也是不一樣的, 所以對某些數據庫來說配置數據源並不重要,  這個配置也是閑置的。 UNPOOLED 類型的數據源僅僅用來配置以下 5 種屬性:

      •     driver – 這是 JDBC 驅動的 Java 類的完全限定名(如果你的驅動包含,它也不是 數據源類)。
      •     url – 這是數據庫的 JDBC URL 地址。
      •     username – 登錄數據庫的用戶名。
      •     password – 登錄數據庫的密碼。
      •     defaultTransactionIsolationLevel – 默認的連接事務隔離級別。

        作為可選項,你可以傳遞數據庫驅動的屬性。要這樣做,屬性的前綴是以“driver.”開 頭的,例如:

      •     driver.encoding=UTF8

        這 樣 就 會 傳 遞 以 值 “ UTF8 ” 來 傳 遞 屬 性 “ encoding ”, 它 是 通 過  DriverManager.getConnection(url,driverProperties)方法傳遞給數據庫驅動。

          POOLED – 這是 JDBC 連接對象的數據源連接池的實現,用來避免創建新的連接實例  時必要的初始連接和認證時間。這是一種當前 Web 應用程序用來快速響應請求很流行的方 法。

        除了上述(UNPOOLED)的屬性之外,還有很多屬性可以用來配置 POOLED 數據源:    

            poolMaximumActiveConnections – 在任意時間存在的活動(也就是正在使用)連  接的數量。默認值:10  

            poolMaximumIdleConnections – 任意時間存在的空閑連接數。

      •    poolMaximumCheckoutTime – 在被強制返回之前,池中連接被檢查的時間。默認 值:20000 毫秒(也就是 20  秒)
      •    poolTimeToWait – 這是給連接池一個打印日志狀態機會的低層次設置,還有重新 嘗試獲得連接, 這些情況下往往需要很長時間  為了避免連接池沒有配置時靜默失 敗)。默認值:20000 毫秒(也就是 20 秒)
      •     poolPingQuery – 發送到數據的偵測查詢,用來驗證連接是否正常工作,並且准備 接受請求。默認是“NO PING QUERY  SET” ,這會引起許多數據庫驅動連接由一 個錯誤信息而導致失敗。
      •    poolPingEnabled – 這是開啟或禁用偵測查詢。如果開啟,你必須用一個合法的 SQL 語句(最好是很快速的)設置  poolPingQuery 屬性。默認值:false。
      •    poolPingConnectionsNotUsedFor – 這是用來配置 poolPingQuery 多次時間被用一次。  這可以被設置匹配標准的數據庫連接超時時間, 來避免不必要的偵測。 默認值: 0(也就是所有連接每一時刻都被偵測-但僅僅當 poolPingEnabled 為  true 時適用)。

          JNDI – 這個數據源的實現是為了使用如 Spring 或應用服務器這類的容器, 容器可以集  中或在外部配置數據源,然后放置一個 JNDI 上下文的引用。這個數據源配置只需要兩個屬 性:

      •   initial_context – 這 個 屬 性 用 來 從 初 始 上 下 文 中 尋 找 環 境 ( 也 就 是  initialContext.lookup(initial——context) 。這是個可選屬性,如果被忽略,那么 data_source 屬性將會直接以  initialContext 為背景再次尋找。
      • data_source – 這是引用數據源實例位置的上下文的路徑。它會以由 initial_context  查詢返回的環境為背景來查找,如果 initial_context 沒有返回結果時,直接以初始 上下文為環境來查找。

和其他數據源配置相似, 它也可以通過名為 “env.” 的前綴直接向初始上下文發送屬性。 比如:

    •   env.encoding=UTF8

在初始化之后,這就會以值“UTF8”向初始上下文的構造方法傳遞名為“encoding” 的屬性。


      <dataSource type="UNPOOLED">
        <property name="driver" value="com.mysql.jdbc.Driver" />
      </dataSource>
    </environment>
  </environments>

  mapper:指定映射文件或映射類  

  <mappers>

    <mapper resource="com/zhao/mapper/StudentMapper.xml"/>
  </mappers>

</configuration>:

2:StudentMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "mybatis-3-mapper.dtd" >
<mapper namespace="com.zhao.mapper.StudentMapper">
    <insert id="saveStudent" parameterType="com.zhao.entity.Student">
        insert into student values(default,#{name},#{password})
    </insert>
</mapper>

這個是個簡單的插入過程,我們的parameterType是個全路徑com.zhao.entity.Student,如果每個都寫這么全的話 會很麻煩,所以我們可以配置它的別名,當然,別名要配置在configuration.xml中

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

以后再StudentMapper.xml中直接寫Student就好了,這么看就方便多了。

目前就用到這么多內容,configuration.xml就先說到這。

接下來說說StudentMapper.xml,在這個文件中定義了我們的一些操作,比如說insert delete select等操作,我們都有標簽。在這個配置文件中主要有兩個東西需要記住,一個是

<mapper>標簽的namespace屬性,我們通過這個屬性來定位到這個配置文件。還有一個是<resultMap>,這個最有意思。

package com.zhao.entity;

public class Student {
    private int id;
    private String name;
    private String password;

    public Student() {
    }

    public Student(String name, String password) {
        this.name = name;
        this.password = password;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "Student [id=" + id + ", name=" + name + ", password=" + password + "]";
    }

}

 

可看到我們的數據表的列和實體類的屬性並不一樣,所以需要進行簡單的配置。我們執行插入的操作可能還不那么明顯,如果我們執行的是查詢操作

    <select id="selectStudentById" parameterType="int"  resultType="Student">
        select * from student where stu_id=#{id}
    </select>

前面我們已經設置了別名,resultType可以直接寫成Student,不用寫com.zhao.entity.Student了。接下來進行測試

    @Test
    public void testSelect() throws IOException {
        Reader reader=Resources.getResourceAsReader("configuration.xml");
        SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(reader);
        SqlSession session=factory.openSession();
        
        Student student=session.selectOne("com.zhao.mapper.StudentMapper.selectStudentById", 1);
        System.out.println(student);
        session.commit();
        session.close();
    }

返回值為Null,顯然我們從數據庫查出來的內容是stu_id  stu_name  stu_password ,可是我們的返回值類型是Student,沒辦法完成封裝,所以我們需要resultMap

    <resultMap type="Student" id="result">
        <id column="stu_id" property="id"/>
        <result column="stu_name" property="name"/>
        <result column="stu_password" property="password"/>
    </resultMap>

這里的Student依舊是我們的別名,然后通過下面的內容完成一一對應。還有 在select里也需要寫上resultMap="result"

接下來測試

這樣的結果才是對的。

 


免責聲明!

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



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