MyBatis學習 之 四、MyBatis配置檔案

huidaoli發表於2013-08-01


目錄(?)[-]

  1. 四MyBatis主配置檔案
    1. properties屬性
    2. settings設定
    3. typeAliases型別別名
    4. typeHandlers型別控制程式碼
    5. ObjectFactory物件工廠
    6. plugins外掛
    7. environments環境
    8. mappers對映器
 

 

四、MyBatis主配置檔案

 

MyBatis學習 之 一、MyBatis簡介與配置MyBatis+Spring+MySql

MyBatis學習 之 二、SQL語句對映檔案(1)resultMap

MyBatis學習 之 二、SQL語句對映檔案(2)增刪改查、引數、快取

MyBatis學習 之 三、動態SQL語句

MyBatis學習 之 四、MyBatis配置檔案

 

   

在定義sqlSessionFactory時需要指定MyBatis主配置檔案:

 

  1. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">  
  2.     <property name="configLocation" value="classpath:mybatis-config.xml" />  
  3.     <property name="dataSource" ref="dataSource" />  
  4. </bean>  

 

 

 

MyBatis配置檔案中大標籤configuration下子標籤包括:

configuration

|--- properties

|--- settings

|--- typeAliases

|--- typeHandlers

|--- objectFactory

|--- plugins

|--- environments

|--- |--- environment

|--- |--- |--- transactionManager

|--- |--- |__ dataSource

|__ mappers

 

 

 

4.1 properties屬性

 

 

    properties和java的.properties的配置檔案有關。配置properties的resource指定.properties的路徑,然後再在properties標籤下配置property的name和value,則可以替換.properties檔案中相應屬性值。

 

 

 

  1.     <!-- 屬性替換 -->  
  2. <properties resource="mysql.properties">  
  3.     <property name="jdbc.driverClassName" value="com.mysql.jdbc.Driver"/>  
  4.     <property name="jdbc.url" value="jdbc:mysql://localhost:3306/student_manager"/>  
  5.     <property name="username" value="root"/>  
  6.     <property name="password" value="limingnihao"/>  
  7. </properties>  
 

 

4.2 settings設定

 

    這是MyBatis 修改操作執行過程細節的重要的步驟。下方這個表格描述了這些設定項、含義和預設值。

 

 

設定項

描述

允許值

預設值

cacheEnabled

對在此配置檔案下的所有cache 進行全域性性開/關設定。

true | false

true

lazyLoadingEnabled

全域性性設定懶載入。如果設為‘false’,則所有相關聯的都會被初始化載入。

true | false

true

aggressiveLazyLoading

當設定為‘true’的時候,懶載入的物件可能被任何懶屬性全部載入。否則,每個屬性都按需載入。

true | false

true

multipleResultSetsEnabled

允許和不允許單條語句返回多個資料集(取決於驅動需求)

true | false

true

useColumnLabel

使用列標籤代替列名稱。不同的驅動器有不同的作法。參考一下驅動器文件,或者用這兩個不同的選項進行測試一下。

true | false

true

useGeneratedKeys

允許JDBC 生成主鍵。需要驅動器支援。如果設為了true,這個設定將強制使用被生成的主鍵,有一些驅動器不相容不過仍然可以執行。

true | false

false

autoMappingBehavior

指定MyBatis 是否並且如何來自動對映資料表欄位與物件的屬性。PARTIAL將只自動對映簡單的,沒有巢狀的結果。FULL將自動對映所有複雜的結果。

NONE,

PARTIAL,

FULL

PARTIAL

defaultExecutorType

配置和設定執行器,SIMPLE 執行器執行其它語句。REUSE執行器可能重複使用prepared statements 語句,BATCH執行器可以重複執行語句和批量更新。

SIMPLE

REUSE

BATCH

SIMPLE

defaultStatementTimeout

設定一個時限,以決定讓驅動器等待資料庫迴應的多長時間為超時

正整數

Not Set

(null)

 

 

例如:

 

 

  1. <settings>  
  2.     <setting name="cacheEnabled" value="true" />  
  3.     <setting name="lazyLoadingEnabled" value="true" />  
  4.     <setting name="multipleResultSetsEnabled" value="true" />  
  5.     <setting name="useColumnLabel" value="true" />  
  6.     <setting name="useGeneratedKeys" value="false" />  
  7.     <setting name="enhancementEnabled" value="false" />  
  8.     <setting name="defaultExecutorType" value="SIMPLE" />  
  9. </settings>  
 

 

 

4.3 typeAliases型別別名

 

 

型別別名是Java 型別的簡稱。

它僅僅只是關聯到XML 配置,簡寫冗長的JAVA 類名。例如:

 

 

 

  1. <typeAliases>  
  2.     <typeAlias alias="UserEntity" type="com.manager.data.model.UserEntity" />  
  3.     <typeAlias alias="StudentEntity" type="com.manager.data.model.StudentEntity" />  
  4.     <typeAlias alias="ClassEntity" type="com.manager.data.model.ClassEntity" />  
  5. </typeAliases>  
 

 

 

    使用這個配置,“StudentEntity”就能在任何地方代替“com.manager.data.model.StudentEntity”被使用。

 

      對於普通的Java型別,有許多內建的型別別名。它們都是大小寫不敏感的,由於過載的名字,要注意原生型別的特殊處理。

 

 

 

別名

對映的型別

_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

 

 

 

4.4 typeHandlers型別控制程式碼

 

 

無論是MyBatis在預處理語句中設定一個引數,還是從結果集中取出一個值時,型別處理器被用來將獲取的值以合適的方式轉換成Java型別。下面這個表格描述了預設的型別處理器。

 

 

 

型別處理器

Java型別

JDBC型別

BooleanTypeHandler

Boolean,boolean

任何相容的布林值

ByteTypeHandler

Byte,byte

任何相容的數字或位元組型別

ShortTypeHandler

Short,short

任何相容的數字或短整型

IntegerTypeHandler

Integer,int

任何相容的數字和整型

LongTypeHandler

Long,long

任何相容的數字或長整型

FloatTypeHandler

Float,float

任何相容的數字或單精度浮點型

DoubleTypeHandler

Double,double

任何相容的數字或雙精度浮點型

BigDecimalTypeHandler

BigDecimal

任何相容的數字或十進位制小數型別

StringTypeHandler

String

CHAR和VARCHAR型別

ClobTypeHandler

String

CLOB和LONGVARCHAR型別

NStringTypeHandler

String

NVARCHAR和NCHAR型別

NClobTypeHandler

String

NCLOB型別

ByteArrayTypeHandler

byte[]

任何相容的位元組流型別

BlobTypeHandler

byte[]

BLOB和LONGVARBINARY型別

DateTypeHandler

Date(java.util)

TIMESTAMP型別

DateOnlyTypeHandler

Date(java.util)

DATE型別

TimeOnlyTypeHandler

Date(java.util)

TIME型別

SqlTimestampTypeHandler

Timestamp(java.sql)

TIMESTAMP型別

SqlDateTypeHandler

Date(java.sql)

DATE型別

SqlTimeTypeHandler

Time(java.sql)

TIME型別

ObjectTypeHandler

Any

其他或未指定型別

EnumTypeHandler

Enumeration型別

VARCHAR-任何相容的字串型別,作為程式碼儲存(而不是索引)。

 

 

 

你可以重寫型別處理器或建立你自己的型別處理器來處理不支援的或非標準的型別。要這樣做的話,簡單實現TypeHandler介面(org.mybatis.type),然後對映新的型別處理器類到Java型別,還有可選的一個JDBC型別。然後再typeHandlers中新增這個型別處理器。

新定義的型別處理器將會覆蓋已經存在的處理Java的String型別屬性和VARCHAR引數及結果的型別處理器。要注意MyBatis不會審視資料庫元資訊來決定使用哪種型別,所以你必須在引數和結果對映中指定那是VARCHAR型別的欄位,來繫結到正確的型別處理器上。這是因為MyBatis直到語句被執行都不知道資料型別的這個現實導致的。

 

 

 

  1. public class LimingStringTypeHandler implements TypeHandler {  
  2.   
  3.     @Override  
  4.     public void setParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {  
  5.         System.out.println("setParameter - parameter: " + ((String) parameter) + ", jdbcType: " + jdbcType.TYPE_CODE);  
  6.         ps.setString(i, ((String) parameter));  
  7.     }  
  8.   
  9.     @Override  
  10.     public Object getResult(ResultSet rs, String columnName) throws SQLException {  
  11.         System.out.println("getResult - columnName: " + columnName);  
  12.         return rs.getString(columnName);  
  13.     }  
  14.   
  15.     @Override  
  16.     public Object getResult(CallableStatement cs, int columnIndex) throws SQLException {  
  17.         System.out.println("getResult - columnIndex: " + columnIndex);  
  18.         return cs.getString(columnIndex);  
  19.     }  
  20. }  
 

 

 

在配置檔案的typeHandlers中新增typeHandler標籤。

 

 

  1. <typeHandlers>  
  2.     <typeHandler javaType="String" jdbcType="VARCHAR" handler="liming.student.manager.type.LimingStringTypeHandler"/>  
  3. </typeHandlers>  

 

 

 

 

4.5 ObjectFactory物件工廠

 

 

每次MyBatis 為結果物件建立一個新例項,都會用到ObjectFactory。預設的ObjectFactory 與使用目標類的建構函式建立一個例項毫無區別,如果有已經對映的引數,那也可能使用帶引數的建構函式。

如果你重寫ObjectFactory 的預設操作,你可以通過繼承org.apache.ibatis.reflection.factory.DefaultObjectFactory建立一下你自己的。

ObjectFactory介面很簡單。它包含兩個建立用的方法,一個是處理預設構造方法的,另外一個是處理帶引數構造方法的。最終,setProperties方法可以被用來配置ObjectFactory。在初始化你的ObjectFactory例項後,objectFactory元素體中定義的屬性會被傳遞給setProperties方法。

 

 

 

 

  1. public class LimingObjectFactory extends DefaultObjectFactory {  
  2.   
  3.     private static final long serialVersionUID = -399284318168302833L;  
  4.   
  5.     @Override  
  6.     public Object create(Class type) {  
  7.         return super.create(type);  
  8.     }  
  9.   
  10.     @Override  
  11.     public Object create(Class type, List<Class> constructorArgTypes, List<Object> constructorArgs) {  
  12.         System.out.println("create - type: " + type.toString());  
  13.         return super.create(type, constructorArgTypes, constructorArgs);  
  14.     }  
  15.   
  16.     @Override  
  17.     public void setProperties(Properties properties) {  
  18.         System.out.println("setProperties - properties: " + properties.toString() + ", someProperty: " + properties.getProperty("someProperty"));  
  19.         super.setProperties(properties);  
  20.     }  
  21.   
  22. }  
 

 

 

配置檔案中新增objectFactory標籤

 

 

  1. <objectFactory type="liming.student.manager.configuration.LimingObjectFactory">  
  2.     <property name="someProperty" value="100"/>  
  3. </objectFactory>  
 

 

 

4.6 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的發行包中有。你應該理解你覆蓋方法的行為,假設你所做的要比監視呼叫要多。如果你嘗試修改或覆蓋一個給定的方法,你可能會打破MyBatis的核心。這是低層次的類和方法,要謹慎使用外掛。

使用外掛是它們提供的非常簡單的力量。簡單實現攔截器介面,要確定你想攔截的指定簽名。

 

 

 

4.7 environments環境

MyBatis 可以配置多個環境。這可以幫助你SQL 對映對應多種資料庫等。

 

 

 

4.8 mappers對映器

這裡是告訴MyBatis 去哪尋找對映SQL 的語句。可以使用類路徑中的資源引用,或者使用字元,輸入確切的URL引用。

例如:

 

 

  1. <mappers>  
  2.     <mapper resource="com/manager/data/maps/UserMapper.xml" />  
  3.     <mapper resource="com/manager/data/maps/StudentMapper.xml" />  
  4.     <mapper resource="com/manager/data/maps/ClassMapper.xml" />  
  5. </mappers>  

 

MyBatis學習 之 一、MyBatis簡介與配置MyBatis+Spring+MySql

MyBatis學習 之 二、SQL語句對映檔案(1)resultMap

MyBatis學習 之 二、SQL語句對映檔案(2)增刪改查、引數、快取

MyBatis學習 之 三、動態SQL語句

MyBatis學習 之 四、MyBatis配置檔案

相關文章