1.首先講解的是MyBatis核心配置文件configuration.xml的配置
一個完整的configuration.xml配置順序如下:
1
properties,settings,typeAliases,typeHandlers,objectFactory,objectWrapperFactory,plugins,environments,databaseIdProvider,mappers.
如果沒有按照上面的標簽順序來配置,編譯器會提示The content of element type "configuration" must match 的錯誤?。。?
1)properties屬性:
該屬性允許我們將配置信息填寫在外部文件中,然后通過動態配置來獲取外部文件的配置信息,比如:
1.在src目錄下創建db.properties文件
username=root
password=123456
url=jdbc:mysql://localhost:3306/mybatis
driver=com.mysql.jdbc.Driver
2.可以在configuration.xml中配置<properties resource="db.properties"/>來引用外部文件
3.這樣我們就可以使用動態配置來獲取外部文件的配置了:
<dataSource type="POOLED">
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
<property name="url" value="${url}"/>
<property name="driver" value="${driver}"/>
</dataSource>
?
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
>
?
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
>
所以可以再xxxMapper.xml文件中這樣配置:
1
<?
xml version="1.0" encoding="UTF-8"
?>
2
<!
DOCTYPE mapper
3
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
4
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"
>
5
<
mapper
namespace
="com.dao.UserDao"
>
6
<
select
id
="selectById"
parameterType
="int"
resultType
="UserEntity"
>
7
select * from user where id=#{id}
8
</
select
>
9
</
mapper
>
使用這個配置,“UserEntity”就能在任何地方代替“com.manager.data.model.UserEntity”被使用。
還有一些與通用JAVA類型建立的別名。它們是大小寫敏感的,注意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)typeHandles類型句柄
無論是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標簽
<
typeHandlers
>
<
typeHandler
javaType
="String"
jdbcType
="VARCHAR"
handler
="liming.student.manager.type.LimingStringTypeHandler"
/>
</
typeHandlers
>
?
5)對象工廠ObjectFactory
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標簽
<
objectFactory
type
="liming.student.manager.configuration.LimingObjectFactory"
>
<
property
name
="someProperty"
value
="100"
/>
</
objectFactory
>
?
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的核心。這是低層次的類和方法,要謹慎使用插件。
使用插件是它們提供的非常簡單的力量。簡單實現攔截器接口,要確定你想攔截的指定簽名。
?
7)environment環境
MyBatis?可以配置多個環境。這可以幫助你SQL?映射對應多種數據庫等。
?
8)映射器
這里是告訴MyBatis?去哪尋找映射SQL?的語句??梢允褂妙惵窂街械馁Y源引用,或者使用字符,輸入確切的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
>
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

