MyBatis主配置文件

MyBatis的使用非常簡單,使用流程整體可以分成以下四步:

public class UserDaoTest {

    private SqlSessionFactory sqlSessionFactory;

    @Before
    public void setUp() throws Exception{
        ClassPathResource resource = new ClassPathResource("mybatis-config.xml");
        InputStream inputStream = resource.getInputStream();
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    }

    @Test
    public void selectUserTest(){
        String id = "{0003CCCA-AEA9-4A1E-A3CC-06D884BA3906}";
        SqlSession sqlSession = sqlSessionFactory.openSession();
        CbondissuerMapper cbondissuerMapper = sqlSession.getMapper(CbondissuerMapper.class);
        Cbondissuer cbondissuer = cbondissuerMapper.selectByPrimaryKey(id);
        System.out.println(cbondissuer);
        sqlSession.close();
    }

}
  • step1:根據主配置文件生成SqlSessionFactory
  • step2:從SqlSessionFactory獲取SqlSession;
  • step3:利用SqlSession根據Mapper文件進行增刪改查;
  • step4:關閉SqlSession

上面的流程中涉及兩種配置文件:

  • MyBatis主配置文件:MyBatis的主要行為屬性都是通過這個配置文件配置的,包括屬性配置、類型轉換配置、插件配置等,上面代碼中的mybatis-config.xml文件就是MyBatis的主配置文件;
  • Mapper映射文件:SQL映射文件,將MyBatis的接口映射成具體的SQL語句,是我們開發時主要配置的文件。

今天我們就先來介紹下MyBatis的主配置文件,看看這個配置文件能配置MyBatis的哪些行為屬性。

一個主配置文件的列子


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

    <!--configuration中的這些屬性是有順序的,最好按照本列子中的順序配置-->

    <!--通過properties配置的屬性,我們可以在其他的配置中使用${}使用-->
    <!--在這邊配置的屬性,我們還能在Mapper.xml中使用${}形式使用-->
    
    <!--可以在多個地方進行屬性配置-->
    <!--通過方法參數傳遞的屬性具有最高優先級,
        resource/url 屬性中指定的配置文件次之,
        最低優先級的則是 properties 元素中指定的屬性。-->
    <properties resource="./app.properties">
        <property name="username" value="username1"/>
        <property name="password" value="password1"/>
        <!--MyBatis支持默認值,假如某些屬性沒取到值就取默認值-->
        <!--開啟默認值功能-->
        <property name="org.apache.ibatis.parsing.PropertyParser.enable-default-value" value="true"/>
        <!--設置分隔符為-->
        <property name="org.apache.ibatis.parsing.PropertyParser.default-value-separator" value="?:"/>
        <!-- 經過上面的配置,就可以像如下方式使用-->
        <!-- 如果配置了username屬性就使用這個配置,如果沒配置就使用ut_user這個默認值-->
        <!-- <property name="username" value="${db:username?:ut_user}"/>-->
    </properties>

    <!--一些重要的全局配置-->
    <!--關於配置的含義,請看下面的注釋-->
    <settings>
        <setting name="cacheEnabled" value="true"/>
        <setting name="lazyLoadingEnabled" value="true"/>
        <setting name="multipleResultSetsEnabled" value="true"/>
        <setting name="useColumnLabel" value="true"/>
        <setting name="useGeneratedKeys" value="false"/>
        <setting name="autoMappingBehavior" value="PARTIAL"/>
        <setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
        <setting name="defaultExecutorType" value="SIMPLE"/>
        <setting name="defaultStatementTimeout" value="25"/>
        <setting name="defaultFetchSize" value="100"/>
        <setting name="safeRowBoundsEnabled" value="false"/>
        <setting name="mapUnderscoreToCamelCase" value="false"/>
        <setting name="localCacheScope" value="STATEMENT"/>
        <setting name="jdbcTypeForNull" value="OTHER"/>
        <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
        <setting name="logImpl" value="STDOUT_LOGGING" />
    </settings>

    <!--類型別名,指定了類型別名後就可以使用別名來代替全限定名-->
    <typeAliases>
        <typeAlias alias="Cbondissuer" type="com.csx.demo.spring.boot.entity.Cbondissuer"/>
        <!--為一個包下面的所有類設定別名,此時會使用 Bean 的首字母小寫的非限定類名來作為它的別名-->
        <package name="domain.blog"/>
    </typeAliases>

    <!--每次 MyBatis 創建結果對象的新實例時,它都會使用一個對象工廠(ObjectFactory)實例來完成實例化工作。 
        默認的對象工廠需要做的僅僅是實例化目標類,要麼通過默認無參構造方法,要麼通過存在的參數映射來調用帶有
        參數的構造方法。 如果想覆蓋對象工廠的默認行為,可以通過創建自己的對象工廠來實現。-->
    <objectFactory type="org.mybatis.example.ExampleObjectFactory">
        <property name="someProperty" value="100"/>
    </objectFactory>

    <!--設置插件-->
    <plugins>
        <plugin interceptor="com.github.pagehelper.PageInterceptor">
            <!--&lt;!&ndash;默認值為 false,當該參數設置為 true 時,如果 pageSize=0 或者 RowBounds.limit = 0 就會查詢出全部的結果&ndash;&gt;-->
            <!--如果某些查詢數據量非常大,不應該允許查出所有數據-->
            <property name="pageSizeZero" value="true"/>
        </plugin>
    </plugins>

    <!--可以配置多個數據源,通過default屬性設置哪個生效-->
    <environments default="dev">
        <environment id="dev">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://xx.xx.xx.xx:3308/xx"/>
                <property name="username" value="${username:ut_user}"/>
                <property name="password" value="${password}"/>
                <property name="poolMaximumIdleConnections" value="10"/>
            </dataSource>
        </environment>
        <environment id="stg">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://xx.xx.xx.xx:3308/xx"/>
                <property name="username" value="${username:ut_user}"/>
                <property name="password" value="${password}"/>
                <property name="poolMaximumIdleConnections" value="10"/>
            </dataSource>
        </environment>
    </environments>

    <!--MyBatis 可以根據不同的數據庫廠商執行不同的語句,這種多廠商的支持是基於映射語句中的 databaseId 屬性。 
        MyBatis 會加載不帶 databaseId 屬性和帶有匹配當前數據庫 databaseId 屬性的所有語句。 如果同時找到
        帶有 databaseId 和不帶 databaseId 的相同語句,則後者會被捨棄。 -->
    <databaseIdProvider type="DB_VENDOR">
        <!--開啟MySQL,加入此時在Mapper文件中有兩個id一樣的查詢語句,但是一條的databaseId是mysql,
            另一條的databaseId是oracle,那麼databaseId是mysql的將被執行-->
        <property name="MySQL" value="mysql" />
        <!--<property name="Oracle" value="oracle" />-->
    </databaseIdProvider>

    <mappers>
        <!--這邊可以使用package和resource兩種方式加載mapper-->
        <!--推薦使用resource這種-->
        <mapper resource="./mappers/CbondissuerMapper.xml"/>
    </mappers>

</configuration>

Setting配置項的含義

設置名 描述 有效值 默認值
cacheEnabled 全局性地開啟或關閉所有映射器配置文件中已配置的任何緩存。 true | false true
lazyLoadingEnabled 延遲加載的全局開關。當開啟時,所有關聯對象都會延遲加載。 特定關聯關係中可通過設置 fetchType 屬性來覆蓋該項的開關狀態。 true | false false
aggressiveLazyLoading 開啟時,任一方法的調用都會加載該對象的所有延遲加載屬性。 否則,每個延遲加載屬性會按需加載(參考 lazyLoadTriggerMethods)。 true | false false (在 3.4.1 及之前的版本中默認為 true)
multipleResultSetsEnabled 是否允許單個語句返回多結果集(需要數據庫驅動支持)。 true | false true
useColumnLabel 使用列標籤代替列名。實際表現依賴於數據庫驅動,具體可參考數據庫驅動的相關文檔,或通過對比測試來觀察。 true | false true
useGeneratedKeys 允許 JDBC 支持自動生成主鍵,需要數據庫驅動支持。如果設置為 true,將強制使用自動生成主鍵。儘管一些數據庫驅動不支持此特性,但仍可正常工作(如 Derby)。 true | false False
autoMappingBehavior 指定 MyBatis 應如何自動映射列到字段或屬性。 NONE 表示關閉自動映射;PARTIAL 只會自動映射沒有定義嵌套結果映射的字段。 FULL 會自動映射任何複雜的結果集(無論是否嵌套)。 NONE, PARTIAL, FULL PARTIAL
autoMappingUnknownColumnBehavior 指定發現自動映射目標未知列(或未知屬性類型)的行為。NONE: 不做任何反應WARNING: 輸出警告日誌('org.apache.ibatis.session.AutoMappingUnknownColumnBehavior'的日誌等級必須設置為 WARNFAILING: 映射失敗 (拋出 SqlSessionException) NONE, WARNING, FAILING NONE
defaultExecutorType 配置默認的執行器。SIMPLE 就是普通的執行器;REUSE 執行器會重用預處理語句(PreparedStatement); BATCH 執行器不僅重用語句還會執行批量更新。 SIMPLE REUSE BATCH SIMPLE
defaultStatementTimeout 設置超時時間,它決定數據庫驅動等待數據庫響應的秒數。 任意正整數 未設置 (null)
defaultFetchSize 為驅動的結果集獲取數量(fetchSize)設置一個建議值。此參數只可以在查詢設置中被覆蓋。 任意正整數 未設置 (null)
defaultResultSetType 指定語句默認的滾動策略。(新增於 3.5.2) FORWARD_ONLY | SCROLL_SENSITIVE | SCROLL_INSENSITIVE | DEFAULT(等同於未設置) 未設置 (null)
safeRowBoundsEnabled 是否允許在嵌套語句中使用分頁(RowBounds)。如果允許使用則設置為 false。 true | false False
safeResultHandlerEnabled 是否允許在嵌套語句中使用結果處理器(ResultHandler)。如果允許使用則設置為 false。 true | false True
mapUnderscoreToCamelCase 是否開啟駝峰命名自動映射,即從經典數據庫列名 A_COLUMN 映射到經典 Java 屬性名 aColumn。 true | false False
localCacheScope MyBatis 利用本地緩存機制(Local Cache)防止循環引用和加速重複的嵌套查詢。 默認值為 SESSION,會緩存一個會話中執行的所有查詢。 若設置值為 STATEMENT,本地緩存將僅用於執行語句,對相同 SqlSession 的不同查詢將不會進行緩存。 SESSION | STATEMENT SESSION
jdbcTypeForNull 當沒有為參數指定特定的 JDBC 類型時,空值的默認 JDBC 類型。 某些數據庫驅動需要指定列的 JDBC 類型,多數情況直接用一般類型即可,比如 NULL、VARCHAR 或 OTHER。 JdbcType 常量,常用值:NULL、VARCHAR 或 OTHER。 OTHER
lazyLoadTriggerMethods 指定對象的哪些方法觸發一次延遲加載。 用逗號分隔的方法列表。 equals,clone,hashCode,toString
defaultScriptingLanguage 指定動態 SQL 生成使用的默認腳本語言。 一個類型別名或全限定類名。 org.apache.ibatis.scripting.xmltags.XMLLanguageDriver
defaultEnumTypeHandler 指定 Enum 使用的默認 TypeHandler 。(新增於 3.4.5) 一個類型別名或全限定類名。 org.apache.ibatis.type.EnumTypeHandler
callSettersOnNulls 指定當結果集中值為 null 的時候是否調用映射對象的 setter(map 對象時為 put)方法,這在依賴於 Map.keySet() 或 null 值進行初始化時比較有用。注意基本類型(int、boolean 等)是不能設置成 null 的。 true | false false
returnInstanceForEmptyRow 當返回行的所有列都是空時,MyBatis默認返回 null。 當開啟這個設置時,MyBatis會返回一個空實例。 請注意,它也適用於嵌套的結果集(如集合或關聯)。(新增於 3.4.2) true | false false
logPrefix 指定 MyBatis 增加到日誌名稱的前綴。 任何字符串 未設置
logImpl 指定 MyBatis 所用日誌的具體實現,未指定時將自動查找。 SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING 未設置
proxyFactory 指定 Mybatis 創建可延遲加載對象所用到的代理工具。 CGLIB | JAVASSIST JAVASSIST (MyBatis 3.3 以上)
vfsImpl 指定 VFS 的實現 自定義 VFS 的實現的類全限定名,以逗號分隔。 未設置
useActualParamName 允許使用方法簽名中的名稱作為語句參數名稱。 為了使用該特性,你的項目必須採用 Java 8 編譯,並且加上 -parameters 選項。(新增於 3.4.1) true | false true
configurationFactory 指定一個提供 Configuration 實例的類。 這個被返回的 Configuration 實例用來加載被反序列化對象的延遲加載屬性值。 這個類必須包含一個簽名為static Configuration getConfiguration() 的方法。(新增於 3.2.3) 一個類型別名或完全限定類名。 未設置

MyBatis內置別名

別名 映射的類型
_byte byte
_long long
_short short
_int int
_integer int
_double double
_float float
_boolean boolean
string String
byte Byte
long Long
short Short
int Integer
integer Integer
double Double
float Float
boolean Boolean
date Date
decimal BigDecimal
bigdecimal BigDecimal
object Object
map Map
hashmap HashMap
list List
arraylist ArrayList
collection Collection
iterator Iterator

參考

Tags: