四、MyBatis主配置文件

在定義sqlSessionFactory時需要指定MyBatis主配置文件:

 

Xml代碼 複製代碼 收藏代碼
  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>  
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">	<property name="configLocation" value="classpath:mybatis-config.xml" />	<property name="dataSource" ref="dataSource" /></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文件中相應屬性值。

 

 

 

Xml代碼 複製代碼 收藏代碼
  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>  
	<!-- 屬性替換 --><properties resource="mysql.properties">	<property name="jdbc.driverClassName" value="com.mysql.jdbc.Driver"/>	<property name="jdbc.url" value="jdbc:mysql://localhost:3306/student_manager"/>	<property name="username" value="root"/>	<property name="password" value="limingnihao"/></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)

 

 

例如:

 

 

Xml代碼 複製代碼 收藏代碼
  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>  
<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="enhancementEnabled" value="false" />	<setting name="defaultExecutorType" value="SIMPLE" /></settings>
 

 

 

4.3 typeAliases類型別名

 

 

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

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

 

 

 

Xml代碼 複製代碼 收藏代碼
  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>  
<typeAliases>	<typeAlias alias="UserEntity" type="com.manager.data.model.UserEntity" />	<typeAlias alias="StudentEntity" type="com.manager.data.model.StudentEntity" />	<typeAlias alias="ClassEntity" type="com.manager.data.model.ClassEntity" /></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直到語句被執行都不知道數據類型的這個現實導致的。

 

 

 

Java代碼 複製代碼 收藏代碼
  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. }  
public class LimingStringTypeHandler implements TypeHandler {	@Override	public void setParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {		System.out.println("setParameter - parameter: " + ((String) parameter) + ", jdbcType: " + jdbcType.TYPE_CODE);		ps.setString(i, ((String) parameter));	}	@Override	public Object getResult(ResultSet rs, String columnName) throws SQLException {		System.out.println("getResult - columnName: " + columnName);		return rs.getString(columnName);	}	@Override	public Object getResult(CallableStatement cs, int columnIndex) throws SQLException {		System.out.println("getResult - columnIndex: " + columnIndex);		return cs.getString(columnIndex);	}}
 

 

 

在配置文件的typeHandlers中添加typeHandler標籤。

 

 

Xml代碼 複製代碼 收藏代碼
  1. <typeHandlers>  
  2.     <typeHandler javaType="String" jdbcType="VARCHAR" handler="liming.student.manager.type.LimingStringTypeHandler"/>  
  3. </typeHandlers>  
<typeHandlers>	<typeHandler javaType="String" jdbcType="VARCHAR" handler="liming.student.manager.type.LimingStringTypeHandler"/></typeHandlers>

 

 

 

 

4.5 ObjectFactory對象工廠

 

 

每次MyBatis 爲結果對象創建一個新實例,都會用到ObjectFactory。默認的ObjectFactory 與使用目標類的構造函數創建一個實例毫無區別,如果有已經映射的參數,那也可能使用帶參數的構造函數。

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

ObjectFactory接口很簡單。它包含兩個創建用的方法,一個是處理默認構造方法的,另外一個是處理帶參數構造方法的。最終,setProperties方法可以被用來配置ObjectFactory。在初始化你的ObjectFactory實例後,objectFactory元素體中定義的屬性會被傳遞給setProperties方法。

 

 

 

 

Java代碼 複製代碼 收藏代碼
  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. }  
public class LimingObjectFactory extends DefaultObjectFactory {	private static final long serialVersionUID = -399284318168302833L;	@Override	public Object create(Class type) {		return super.create(type);	}	@Override	public Object create(Class type, List<Class> constructorArgTypes, List<Object> constructorArgs) {		System.out.println("create - type: " + type.toString());		return super.create(type, constructorArgTypes, constructorArgs);	}	@Override	public void setProperties(Properties properties) {		System.out.println("setProperties - properties: " + properties.toString() + ", someProperty: " + properties.getProperty("someProperty"));		super.setProperties(properties);	}}
 

 

 

配置文件中添加objectFactory標籤

 

 

Xml代碼 複製代碼 收藏代碼
  1. <objectFactory type="liming.student.manager.configuration.LimingObjectFactory">  
  2.     <property name="someProperty" value="100"/>  
  3. </objectFactory>  
<objectFactory type="liming.student.manager.configuration.LimingObjectFactory">	<property name="someProperty" value="100"/></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 引用。

例如:

 

 

Xml代碼 複製代碼 收藏代碼
  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>  
<mappers>	<mapper resource="com/manager/data/maps/UserMapper.xml" />	<mapper resource="com/manager/data/maps/StudentMapper.xml" />	<mapper resource="com/manager/data/maps/ClassMapper.xml" /></mappers>

 原文地址:http://limingnihao.iteye.com/blog/1060764

發佈了27 篇原創文章 · 獲贊 25 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章