1. 程式人生 > >mybatis3.0-[topic10-14] -全域性配置檔案_plugins外掛簡介/ typeHandlers_型別處理器簡介 /enviroments_執行環境 /多資料庫支援/mappers_sql對映註冊

mybatis3.0-[topic10-14] -全域性配置檔案_plugins外掛簡介/ typeHandlers_型別處理器簡介 /enviroments_執行環境 /多資料庫支援/mappers_sql對映註冊

mybatis3.0-全域性配置檔案_   下面為中文官網解釋

/plugins外掛簡介     目前瞭解即可

外掛(plugins) 
MyBatis 允許你在已對映語句執行過程中的某一點進行攔截呼叫。預設情況下,MyBatis 允許使用外掛來攔截的方法呼叫包括:

Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
ParameterHandler (getParameterObject, setParameters)
ResultSetHandler (handleResultSets, handleOutputParameters)
StatementHandler (prepare, parameterize, batch, update, query)
這些類中方法的細節可以通過檢視每個方法的簽名來發現,或者直接檢視 MyBatis 發行包中的原始碼。

/typeHandlers_型別處理器簡介   目前瞭解即可

 

無論是 MyBatis 在預處理語句(PreparedStatement)中設定一個引數時,還是從結果集中取出一個值時,
都會用型別處理器將獲取的值以合適的方式轉換成 Java 型別。下表描述了一些預設的型別處理器。 提示 從 MyBatis
3.4.5 (JDK1.8) 開始,MyBatis 預設支援 JSR-310(日期和時間 API) 。

/enviroments_執行環境     <--4 -->

MyBatis 可以配置成適應多種環境,這種機制有助於將 SQL 對映應用於多種資料庫之中, 現實情況下有多種理由需要這麼做。
例如,開發、測試和生產環境需要有不同的配置;或者共享相同 Schema 的多個生產資料庫, 想使用相同的 SQL 對映。許多類似的用例。

不過要記住:儘管可以配置多個環境,每個 SqlSessionFactory 例項只能選擇其一。
事務管理器(transactionManager)

資料來源(dataSource)

 

/多資料庫支援      <--5 -->

/mappers_sql對映註冊      <--6 -->

既然 MyBatis 的行為已經由上述元素配置完了,我們現在就要定義 SQL 對映語句了。
但是首先我們需要告訴 MyBatis 到哪裡去找到這些語句。
Java 在自動查詢這方面沒有提供一個很好的方法,所以最佳的方式是告訴 MyBatis 到哪裡去找對映檔案。

你可以使用相對於類路徑的資源引用, 或完全限定資源定位符(包括 file:/// 的 URL),或類名和包名等。

 

筆記要點


出錯分析與總結

使用包名的批量註冊, conf下的com.dao 和src下的com.dao目錄一直,也更加好看,
相當於把conf下的com.dao 的在物理位置上放到了src下的com.dao目錄. 全域性配置的mappers中新增:
<package name="com.dao"/>

推薦:比較重要的, 複雜的Dao 介面我們來寫sql對映檔案;
不重要的,簡單的Dao介面為了開發快速可以使用註解;

 

全域性配置檔案 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="dbconfig.properties"></properties>
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
    <!--.typeAliases : 別名處理器,可以為我們的java類的型別起別名 -->
    <typeAliases>
        <package name="com.bean"/>
    </typeAliases>

    <!-- 4.environments; 環境,mybatis可以配置多個環境,
        environments:配置一個具體的環境資訊,必須有以下兩個標籤:
            transactionManager: 事務管理器;
                    在 MyBatis 中有兩種型別(也就是 type=”[JDBC|MANAGED]”):
                        Spring中會自動覆蓋;

            dataSource:資料來源的type型別;
                有三種內建的資料來源型別(也就是 type=”[UNPOOLED|
                        POOLED|
                        JNDI]
                 自定義資料來源:實現DatasourceFactory介面即可,
        -->
    <environments default="development">
            <!--測試環境-->
        <environment id="test">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <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="123456"/>
            </dataSource>
        </environment>
            <!--開發環境-->
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <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="123456"/>
            </dataSource>
        </environment>
    </environments>
    <!--
        5.databaseIdProvider : 支援多資料庫廠商;
            type="DB_VENDOR" ,
            作用就是得到資料庫廠商的標識(驅動:getDatabaseProductName()).mybatis
            -->
    <databaseIdProvider type="DB_VENDOR">
        <property name="SQL Server" value="sqlserver"/>
        <property name="DB2" value="db2"/>
        <property name="MySQL" value="mysql"/>
        <property name="Oracle" value="oracle" />
    </databaseIdProvider>
        <!--6. 將我們寫好的sql對映檔案{EmployeeMapper.xml},
        一定要註冊到本全域性配置檔案{mybatis-config.xml}中-->
    <mappers>
        <!--
            一個mapper; 註冊一個sql對映!
            resource: 引用類路徑下的sql對映檔案,
                   eg: resource="EmployeeMapper.xml"/>
            或完全限定資源定位符:引用網路路徑或者磁碟路徑下的sql對映檔案(包括 file:/// 的 URL),
                   eg:<mapper url="file:///var/conf/*********.xml"/>
            或類名(使用對映器介面實現類的完全限定類名):
                註冊介面:class,引用註冊介面.
                        1.有sql對映檔案
                        2,沒有sql對映檔案,所有的sql都是利用註解進行;
                        eg:    <mapper class="com.dao.EmployeeMapperAnnotation"/>
            批量註冊: 包名(將包內的對映器介面實現全部註冊為對映器):

            推薦:比較重要的, 複雜的Dao 介面我們來寫sql對映檔案;
                不重要的,簡單的Dao介面為了開發快速可以使用註解;
            -->
        <package name="com.dao"/>

    </mappers>
</configuration>

 

工程組織

 


測試程式碼

使用註解,建立EmployeeMapperAnnotation介面, 並加上註解

@Select("select * from tbl_employee where id=#{id}")

 :

package com.dao;

import com.bean.*;
import org.apache.ibatis.annotations.Select;

public interface EmployeeMapperAnnotation {
    @Select("select * from tbl_employee where id=#{id}")
    public Employee getEmpById(Integer id);
}

 

測試類:test_tp14    測試成功

package com.test;

public class test_tp14 {
    public SqlSessionFactory getSqlSessionFactory() throws IOException {
        String resource = "mybatis-config.xml";
        InputStream inputStream=Resources.getResourceAsStream(resource);
        return new SqlSessionFactoryBuilder().build(inputStream);
    }
    @Test
    public void test02() throws IOException{
        SqlSession openSession = getSqlSessionFactory().openSession();

        try {
            EmployeeMapperAnnotation mapper=openSession.getMapper(EmployeeMapperAnnotation.class);
            Employee empById = mapper.getEmpById(1);
            System.out.println(empById);
        } finally {
            openSession.close();
        }
    }

}

上個部落格的 測試類:test_tp04    也測試成功

package com.test;
import com.bean.*;
import com.dao.*;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;

/**介面式程式設計:
 * 1.  原生: Dao 介面-->Dao介面的實現類
 *   mybatis: Mapper --> 有一個與之對應的 XXMapper.xml
 * 2. SqlSession
 *      代表與資料庫的一次會話,用完必須關閉資源;
 *3.SqlSession 和connection 一樣都是非執行緒安全,不能宣告為全域性變數;
 *         每次使用都需要重新生命.
 * 4.mapper介面沒有實現類, 但是mybatis 會為這個介面生成一個代理物件:
 *        (需要先將介面和XML檔案進行繫結!)
 *        EmployeeMapper empMapper=openSession.getMapper(EmployeeMapper.class);
 *  5.兩個重要的配置檔案:
 *      mybatis的全域性配置檔案: 包含資料庫連線池資訊,事物管理器資訊,系統檔案的資訊.....
 *      SQL對映檔案: 儲存了每一個SL語句的對映資訊,
 */
public class Test_tp04 {
    //建立一個模板,直接返回一個新建的SqlSessionFactory
    public SqlSessionFactory getSqlSessionFactory() throws IOException {
        String resource = "mybatis-config.xml";
        InputStream inputStream=Resources.getResourceAsStream(resource);
        return new SqlSessionFactoryBuilder().build(inputStream);
    }
    @Test          //第四節測試,測試介面式程式設計
    public void test01() throws IOException{
        //1.獲取sqlSessionFactory物件
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();  //呼叫模板的方法

        //2.獲取一個SqlSession物件
        SqlSession openSession = sqlSessionFactory.openSession();

        try {
            //3.獲取介面的實現類
            EmployeeMapper mapper=openSession.getMapper(EmployeeMapper.class);
            Employee employee = mapper.getEmpById(1);
            System.out.println("mapper.getClass(): "+mapper.getClass());
            System.out.println(employee);
        } finally {
            openSession.close();
        }
    }
}
View Code


測試結果

DEBUG 11-27 18:20:35,719 ==>  Preparing: select * from tbl_employee where id=?   (BaseJdbcLogger.java:145) 
DEBUG 11-27 18:20:35,736 ==> Parameters: 1(Integer)  (BaseJdbcLogger.java:145) 
DEBUG 11-27 18:20:35,748 <==      Total: 1  (BaseJdbcLogger.java:145) 
Employee{id=1, lastname='tom', email='[email protected]', gender='0'}