目錄(?)[-]
- 四MyBatis主配置檔案
- properties屬性
- settings設定
- typeAliases型別別名
- typeHandlers型別控制程式碼
- ObjectFactory物件工廠
- plugins外掛
- environments環境
- mappers對映器
四、MyBatis主配置檔案
MyBatis學習 之 一、MyBatis簡介與配置MyBatis+Spring+MySql
MyBatis學習 之 二、SQL語句對映檔案(1)resultMap
MyBatis學習 之 二、SQL語句對映檔案(2)增刪改查、引數、快取
MyBatis學習 之 三、動態SQL語句
MyBatis學習 之 四、MyBatis配置檔案
在定義sqlSessionFactory時需要指定MyBatis主配置檔案:
- <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檔案中相應屬性值。
- <!-- 屬性替換 -->
- <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) |
例如:
- <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 類名。例如:
- <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直到語句被執行都不知道資料型別的這個現實導致的。
- 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標籤。
- <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方法。
- 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標籤
- <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引用。
例如:
- <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>
MyBatis學習 之 一、MyBatis簡介與配置MyBatis+Spring+MySql
MyBatis學習 之 二、SQL語句對映檔案(1)resultMap
MyBatis學習 之 二、SQL語句對映檔案(2)增刪改查、引數、快取
MyBatis學習 之 三、動態SQL語句
MyBatis學習 之 四、MyBatis配置檔案