mybatis配置文件
文檔頂層結構:
configuration 配置
properties 屬性
settings 設置
typeAliases 類型命名
typeHandlers 類型處理器
objectFactory 對象工廠
plugins 插件
environments 環境
environment 環境變量
transactionManager 事務管理器
dataSource 數據源
databaseIdProvider 數據庫廠商標識
transactionManager 事務管理器
mappers 映射器
註意:這些元素在mybatis的xml配置文件中,順序是不可以顛倒的,否則無法構建SqlSessionFactoryBuilder實例,
也就無法構建SqlSessionFactory工廠實例,更無法構建SqlSession操作數據庫命令SQL對象實例。
回顧一下mybatis的步驟:
1)核心配置文件配置
2)pojo模型創建
3)映射文件配置
4)獲取SqlSessionFactory
5)獲取SqlSession
6)CRUD操作
7)事務操作
8)關閉SqlSession
mybatis的基本操作在這裏:
mybatis初體驗(一)
這篇文章總結一下核心配置文件mybatis-config.xml的配置方法。
初體驗中的mybatis-config.xml的配置:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 對事務的管理和連接池的配置 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl" />
<property name="username" value="ibatis" />
<property name="password" value="ibatis" />
</dataSource>
</environment>
</environments>
<!-- mapping 文件路徑配置 -->
<mappers>
<mapper resource="com/yu/res/UserMapper.xml" />
</mappers>
</configuration>
Properties
由上面的配置可以看出,我們的數據庫信息是直接寫到了配置裏
而一般情況下,對於這種配置信息,一般我們都會把它放到properties資源文件中。
1.創建一個資源文件jdbc.properties:
jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@localhost:1521:orcl
jdbc.username=mybatis
jdbc.password=mybatis
2.mybatis-config.xml中引入
<properties resource="jdbc.properties" />
當然也可以在<properties/>標簽中定義屬性:
<properties resource="jdbc.properties">
<property name="jdbc.driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
</properties>
3.使用properties文件裏的屬性
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
說下這些配置的加載順序:
.在 properties 元素體內指定的屬性首先被讀取。
.從類路徑下資源或 properties 元素的 url 屬性中加載的屬性第二被讀取,它會 覆蓋已經存在的完全一樣的屬性。
.作為方法參數傳遞的屬性最後被讀取, 它也會覆蓋任一已經存在的完全一樣的 屬性,這些屬性可能是從 properties 元素體內和資源/url 屬性中加載的。
引用自:http://mybatis.github.io/mybatis-3/zh/configuration.html
所以,屬性的優先級為:方法直接傳遞參數 > 通過resource、url引用的資源 > properties元素體內定義
Settings
setting設置,關系到mybatis的主要設置,關系到mybatis運行時的行為方式。
配置方式:
<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="defaultExecutorType" value="SIMPLE" />
<setting name="defaultStatementTimeout" value="25" />
<setting name="safeRowBoundsEnabled" value="false" />
<setting name="mapUnderscoreToCamelCase" value="false" />
<setting name="localCacheScope" value="SESSION" />
<setting name="jdbcTypeForNull" value="OTHER" />
<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString" />
</settings>
配置項說明:(從 http://mybatis.github.io/mybatis-3/zh/configuration.html copy過來的 )
設置參數 | 描述 | 有效值 | 默認值 |
---|---|---|---|
cacheEnabled | 這個配置使全局的映射器啟用或禁用 緩存。 | true | false | true |
lazyLoadingEnabled | 全局啟用或禁用延遲加載。當禁用時, 所有關聯對象都會即時加載。 This value can be superseded for an specific relation by using the fetchType attribute on it. | true | false | false |
aggressiveLazyLoading | 當啟用時, 有延遲加載屬性的對象在被 調用時將會完全加載任意屬性。否則, 每種屬性將會按需要加載。 | true | false | true |
multipleResultSetsEnabled | 允許或不允許多種結果集從一個單獨 的語句中返回(需要適合的驅動) | true | false | true |
useColumnLabel | 使用列標簽代替列名。 不同的驅動在這 方便表現不同。 參考驅動文檔或充分測 試兩種方法來決定所使用的驅動。 | true | false | true |
useGeneratedKeys | 允許 JDBC 支持生成的鍵。 需要適合的 驅動。 如果設置為 true 則這個設置強制 生成的鍵被使用, 盡管一些驅動拒絕兼 容但仍然有效(比如 Derby) | true | false | False |
autoMappingBehavior | 指定 MyBatis 如何自動映射列到字段/ 屬性。PARTIAL 只會自動映射簡單, 沒有嵌套的結果。FULL 會自動映射任 意復雜的結果(嵌套的或其他情況) 。 | NONE, PARTIAL, FULL | PARTIAL |
defaultExecutorType | 配置默認的執行器。SIMPLE 執行器沒 有什麽特別之處。REUSE 執行器重用 預處理語句。BATCH 執行器重用語句 和批量更新 | SIMPLE REUSE BATCH | SIMPLE |
defaultStatementTimeout | 設置超時時間, 它決定驅動等待一個數 據庫響應的時間。 | Any positive integer | Not Set (null) |
safeRowBoundsEnabled | Allows using RowBounds on nested statements. | true | false | False |
mapUnderscoreToCamelCase | Enables automatic mapping from classic database column names A_COLUMN to camel case classic Java property names aColumn. | true | false | False |
localCacheScope | MyBatis uses local cache to prevent circular references and speed up repeated nested queries. By default (SESSION) all queries executed during a session are cached. If localCacheScope=STATEMENT local session will be used just for statement execution, no data will be shared between two different calls to the same SqlSession. | SESSION | STATEMENT | SESSION |
jdbcTypeForNull | Specifies the JDBC type for null values when no specific JDBC type was provided for the parameter. Some drivers require specifying the column JDBC type but others work with generic values like NULL, VARCHAR or OTHER. | JdbcType enumeration. Most common are: NULL, VARCHAR and OTHER | OTHER |
lazyLoadTriggerMethods | Specifies which Object‘s methods trigger a lazy load | A method name list separated by commas | equals,clone,hashCode,toString |
defaultScriptingLanguage | Specifies the language used by default for dynamic SQL generation. | A type alias or fully qualified class name. | org.apache.ibatis.scripting.xmltags.XMLDynamicLanguageDriver |
callSettersOnNulls | 當結果集中含有Null值時是否執行映射對象的setter或者Map對象的put方法。此設置對於原始類型如int,boolean等無效。 | true | false | false |
logPrefix | Specifies the prefix string that MyBatis will add to the logger names. | Any String | Not set |
logImpl | Specifies which logging implementation MyBatis should use. If this setting is not present logging implementation will be autodiscovered. | SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING | Not set |
proxyFactory | Specifies the proxy tool that MyBatis will use for creating lazy loading capable objects. | CGLIB | JAVASSIST | CGLIB |
typeAliases
類型別名。
給java類型取一個別名,方便在核心配置、映射配置中來使用這個java類型。
在 mybatis初體驗(一) 中的UserMapper.xml配置中,有這樣的配置信息:
<select id="findUserById" resultType="com.yu.model.User" parameterType="long">
select * from t_user where id = #{id}
</select>
可以看到resultType屬性的值為com.yu.model.User,表示這個查詢返回的類型為com.yu.model.User類型。
如果有很多種類型的話,每次都得把類型的全路徑寫上,感覺就很費事。
所以就可以用mybatis提供的typeAliases來進行別名配置。
在核心配置文件中加上配置:
<typeAliases>
<typeAlias type="com.yu.model.User" alias="User" />
<typeAlias type="com.yu.model.Org" alias="Org"/>
</typeAliases>
然後修改UserMapper.xml的配置:
<select id="findUserById" resultType="User" parameterType="long">
select * from t_user where id = #{id}
</select>
這樣就簡便多了。
當然,這是對於我們自定義的類型,或者其他類型,用這種設置別名的方式。
其實mybatis給我們提供了很多內建的類型別名,使我們不用在typeAliases中指定,就可以直接使用,下面是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 |
typeHandlers
類型處理器。
用途:
1)獲取數據庫的值,以合適的方式轉變為對應的java類型
2)將java類型,以合適的方式轉化為數據庫的保存類型
mybatis中默認的類型處理器:
類型處理器 | Java 類型 | JDBC 類型 |
---|---|---|
BooleanTypeHandler | java.lang.Boolean, boolean | 任何兼容的布爾值 |
ByteTypeHandler | java.lang.Byte, byte | 任何兼容的數字或字節類型 |
ShortTypeHandler | java.lang.Short, short | 任何兼容的數字或短整型 |
IntegerTypeHandler | java.lang.Integer, int | 任何兼容的數字和整型 |
LongTypeHandler | java.lang.Long, long | 任何兼容的數字或長整型 |
FloatTypeHandler | java.lang.Float, float | 任何兼容的數字或單精度浮點型 |
DoubleTypeHandler | java.lang.Double, double | 任何兼容的數字或雙精度浮點型 |
BigDecimalTypeHandler | java.math.BigDecimal | 任何兼容的數字或十進制小數類型 |
StringTypeHandler | java.lang.String | CHAR 和 VARCHAR 類型 |
ClobTypeHandler | java.lang.String | CLOB 和 LONGVARCHAR 類型 |
NStringTypeHandler | java.lang.String | NVARCHAR 和 NCHAR 類型 |
NClobTypeHandler | java.lang.String | NCLOB 類型 |
ByteArrayTypeHandler | byte[] | 任何兼容的字節流類型 |
BlobTypeHandler | byte[] | BLOB 和 LONGVARBINARY 類型 |
DateTypeHandler | java.util.Date | TIMESTAMP 類型 |
DateOnlyTypeHandler | java.util.Date | DATE 類型 |
TimeOnlyTypeHandler | java.util.Date | TIME 類型 |
SqlTimestampTypeHandler | java.sql.Timestamp | TIMESTAMP 類型 |
SqlDateTypeHandler | java.sql.Date | DATE 類型 |
SqlTimeTypeHandler | java.sql.Time | TIME 類型 |
ObjectTypeHandler | Any | 其他或未指定類型 |
EnumTypeHandler | Enumeration Type | VARCHAR-任何兼容的字符串類型, 作為代碼存儲(而不是索引) |
EnumOrdinalTypeHandler | Enumeration Type | Any compatible NUMERIC or DOUBLE, as the position is stored (not the code itself). |
當然也可以自定義類型處理器,
比如有一個字段的值是一個逗號隔開的字符串,如果希望查詢結果映射到java類型時是一個數組,而保存到數據庫時又會是以逗號隔開的字符串。
這種情況需要自定義類型處理器來處理。
關於自定義類型處理器,會單獨做一個總結。
mappers
在 mybatis初體驗(一) 中的UserMapper.xml配置中,有這樣的配置信息:
<!-- mapping 文件路徑配置 -->
<mappers>
<mapper resource="com/yu/res/UserMapper.xml" />
</mappers>
用於引用定義好的映射定義,告訴mybatis去哪裏找我們的sql定義配置。有以下幾種用法:
直接引用xml文件
<mappers>
<mapper resource="com/yu/res/UserMapper.xml" />
</mappers>
通過絕對路徑引用,註意在絕對路徑前加上:“file:///”
<mappers>
<mapper url="file:///D:/workspace/mywork/MyBatis/src/com/yu/res/UserMapper.xml"/>
</mappers>
引用mapper接口對象的方式:
<mappers>
<mapper resource="com.yu.mapper.UserMapper" />
</mappers>
引用mapper接口包的方式:
<mappers>
<package name="com.yu.mapper"/>
</mappers>
這篇文章介紹了mybatis核心配置文件mybatis-config.xml的一些基本配置。
mybatis配置文件