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>
environments
在mybatis-config.xml中有這樣的配置:
<!-- 對事務的管理和連接池的配置 --> <environments default="development"> <environment id="development"> <transactionManager type="JDBC" /> <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> </environment> </environments>
從這可以看出,environments主要用於配置數據庫相關,而且可以在里面配置多個environment。
因為有這些場景:
1)為了開發設置不同的數據庫配置
2)測試和生產環境數據庫不同
3)有多個數據庫卻共享相同的模式,即對不同的數據庫使用相同的SQL映射
我們可以配置幾個數據庫配置,我們可以這樣:
<!-- 對事務的管理和連接池的配置 --> <environments default="oracle_jdbc"> <environment id="oracle_jdbc"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="${jdbc.oracle.driverClassName}" /> <property name="url" value="${jdbc.oracle.url}" /> <property name="username" value="${jdbc.oracle.username}" /> <property name="password" value="${jdbc.oracle.password}" /> </dataSource> </environment> <environment id="mysql_jdbc"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="${jdbc.mysql.driverClassName}" /> <property name="url" value="${jdbc.mysql.url}" /> <property name="username" value="${jdbc.mysql.username}" /> <property name="password" value="${jdbc.mysql.password}" /> </dataSource> </environment> </environments>
用default指定默認的數據庫鏈接:(這里默認oracle)
<environments default="oracle_jdbc">
我們每個數據庫,對應一個SqlSessionFactory,可以明確的獲取哪一個數據庫的SqlSessionFactory。
根據數據庫環境,獲取SqlSessionFactory:
SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, environment); SqlSessionFactory factory = sqlSessionFactoryBuilder.build(reader, environment,properties);
我們的每個數據庫信息都定義在environment中,我們看下這下面的配置:
1.transactionManager
示例配置:
<transactionManager type="JDBC" />
type取值范圍:
JDBC:簡單的使用JDBC的提交和回滾設置,一覽與從數據員得到的鏈接來管理事務范圍
MANAGED:這個配置幾乎什么都沒做,它從來不提交或回滾一個鏈接,而它讓容器來管理事務的整個生命周期(比如spring、jee應用服務器的上下文)
在默認情況下,MANAGED會關閉連接,如果有時候不希望這樣時,可以從連接中停止它,將claseConnection屬性設置為false:
<transactionManager type="MANAGED"> <property name="closeConnection" value="false"/> </transactionManager>
2.dataSource
用來配置基本的JDBC數據源連接信息
示例配置:
<dataSource type="POOLED"> <property name="driver" value="${jdbc.mysql.driverClassName}" /> <property name="url" value="${jdbc.mysql.url}" /> <property name="username" value="${jdbc.mysql.username}" /> <property name="password" value="${jdbc.mysql.password}" /> </dataSource>
type取值范圍:
UNPOOLED:這個數據源的實現是每次被請求時打開和關閉連接。速度會有一些慢,適用於簡單的應用程序。
這種類型的數據源只需要配置下面的6種屬性(最后一項為可選):
driver | JDBC驅動名 |
url | JDBC URL地址 |
username | 數據庫用戶名 |
password | 數據庫密碼 |
defaultTransactionIsolationLevel | 默認的鏈接事務隔離級別 |
driver.encoding | utf-8(可選項) |
POOLED:這是JDBC鏈接對象的數據源連接池的實現,用來避免創建新的鏈接實例時必要的連接和認證時間。適用於當前Web應用程序用來快速響應請求
這種類型的數據源除了需要配置UNPOOLED中的基礎配置外,還可以配置下面的內容:
poolMaximumActiveConnections | 在任意時間正在使用鏈接的數量 |
poolMaximumIdleConnections | 任意時間存在的空閑連接數 |
poolMaximumCheckoutTime | 在被強制返回之前,連接池中被檢查的時間,默認值為20000毫秒 |
poolTimeToWait | 給連接池一個打印日志狀態機會的低層次設置,還有重新嘗試獲取連接,這些情況往往會需要很長時間。為了避免連接池沒有配置時靜默失敗。默認值20000毫秒 |
poolPingQuery | 發送到數據的偵測查詢,用來驗證連接是否正常工作,並且准備接受請求。默認為“NO PING QUERY SET”,這會引起許多數據庫驅動連接由一個錯誤信息而導致失敗 |
poolPingEnabled | 這是開啟或禁用偵測查詢,如果開啟,必須用一個合法的SQL語句,設置poolPingQuery屬性,默認值為false |
poolPingConnectionsNotUsedFor | 用來配置poolPingQuery多長時間被調用一次。可以被設置匹配標准的數據庫鏈接超時時間,來避免不必要的偵測。默認值0(也就是所有鏈接每一時刻都被偵測到,但僅僅當poolPingEnabled為true時適用)。 |
JNDI:這個數據源是為了使用如Spring或應用服務器這類的容器,容器可以集中或在外部配置數據源,然后設置JNDI上下文的引用。
這個數據源只需要配置兩個屬性:
initial_context | 用來從初始上下文中尋找環境(也就是initialContext.lookup(initial——context)),這是個可選屬性,如果被忽略,那么data_source屬性將直接以initialContext為背景再次尋找 |
data_source | 這是引用數據源實例位置的上下文的路徑,它會以initial_context查詢返回的環境為背景來查找,如果initial_context沒有返回結果時,直接以初始上下文為環境來查找。 |
和其他數據源配置類似,他可以通過名“env.”的前綴來直接向初始上下文發送屬性,比如:
env.encoding=UTF8