mybatis-config.xml
阿新 • • 發佈:2018-12-30
mybatis-config.xml 配置詳解:
properties、 settings、typeAliases、 typeHandlers、 objectFactory、objectWrapperFactory、plugins、 environments、 databaseIdProvider、 mappers。
<!-- 引入properties檔案 ${jdbc.driverClassName-->
<properties resource="jdbc.properties" />
<!-- 引數設定 -->
<settings>
<!-- 這個配置使全域性的對映器啟用或禁用快取 -->
<setting name="cacheEnabled" value="true" />
<!-- 全域性啟用或禁用延遲載入。當禁用時,所有關聯物件都會即時載入 -->
<setting name="lazyLoadingEnabled" value="true" />
<!-- 當啟用時,有延遲載入屬性的物件在被呼叫時將會完全載入任意屬性。否則,每種屬性將會按需要載入 -->
<setting name="aggressiveLazyLoading" value="true" />
<!-- 允許或不允許多種結果集從一個單獨的語句中返回(需要適合的驅動) -->
<setting name="multipleResultSetsEnabled" value="true" />
<!-- 使用列標籤代替列名。不同的驅動在這方便表現不同。參考驅動文件或充分測試兩種方法來決定所使用的驅動 -->
<setting name="useColumnLabel" value="true" />
<!-- 允許JDBC支援生成的鍵。需要適合的驅動。如果設定為true則這個設定強制生成的鍵被使用,儘管一些驅動拒絕相容但仍然
有效(比如Derby) -->
<setting name="useGeneratedKeys" value="true" />
<!-- 指定MyBatis如何自動對映列到欄位/屬性。PARTIAL只會自動對映簡單,沒有巢狀的結果。FULL會自動對映任意複雜的結果(
巢狀的或其他情況) -->
<setting name="autoMappingBehavior" value="PARTIAL" />
<!--當檢測出未知列(或未知屬性)時,如何處理,預設情況下沒有任何提示,這在測試的時候很不方便,不容易找到錯誤。
NONE : 不做任何處理 (預設值);WARNING : 警告日誌形式的詳細資訊;FAILING : 對映失敗,丟擲異常和詳細資訊-->
<setting name="autoMappingUnknownColumnBehavior" value="WARNING"/>
<!-- 配置預設的執行器。SIMPLE執行器沒有什麼特別之處。REUSE執行器重用預處理語句。BATCH執行器重用語句和批量更新 -->
<setting name="defaultExecutorType" value="SIMPLE" />
<!-- 設定超時時間,它決定驅動等待一個數據庫響應的時間 -->
<setting name="defaultStatementTimeout" value="25000" />
<!--設定查詢返回值數量,可以被查詢數值覆蓋 -->
<setting name="defaultFetchSize" value="100"/>
<!-- 允許在巢狀語句中使用分頁-->
<setting name="safeRowBoundsEnabled" value="false"/>
<!--是否開啟自動駝峰命名規則(camel case)對映,即從經典資料庫列名 A_COLUMN 到經典 Java 屬性名 aColumn 的類似對映
。-->
<setting name="mapUnderscoreToCamelCase" value="false"/>
<!--MyBatis 利用本地快取機制(Local Cache)防止迴圈引用(circular references)和加速重複巢狀查詢。 預設值為
SESSION,這種情況下會快取一個會話中執 行的所有查詢。 若設定值為 STATEMENT,本地會話僅用在語句執行上,對相同
SqlSession 的不同調用將不會共享資料。-->
<setting name="localCacheScope" value="SESSION"/>
<!-- 當沒有為引數提供特定的 JDBC 型別時,為空值指定 JDBC 型別。 某些驅動需要指定列的 JDBC 型別,多數情況直接用一般
型別即可,比如 NULL、VARCHAR
OTHER。-->
<setting name="jdbcTypeForNull" value="OTHER"/>
<!-- 指定哪個物件的方法觸發一次延遲載入。-->
<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>
<!-- 別名定義 -->
<typeAliases>
<typeAlias alias="User" type="com.cpit.model.User" />
</typeAliases>
<!--自定義型別處理器 -->
<typeHandlers>
<!-- <typeHandler handler="com.cpit.MyHandlder" /> -->
<!--掃描整個包下的自定義型別處理器-->
<package name="com.cpit.util"/>
</typeHandlers>
<!--plugins外掛之 分頁攔截器 -->
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<property name="helperDialect" value="mysql"/>
</plugin>
</plugins>
<!--配置environment環境-->
<environments default="development">
<!-- 環境配置,每個SqlSessionFactory對應一個環境 -->
<environment id="dev">
<!-- 事務配置 type= JDBC、MANAGED
1.JDBC:這個配置直接簡單使用了JDBC的提交和回滾設定。它依賴於從資料來源得到的連線來管理事務範圍。
2.MANAGED:這個配置幾乎沒做什麼。它從來不提交或回滾一個連線。而它會讓容器來管理事務的整個生命週期(比如
Spring或JEE應用伺服器的上下文)。
預設情況下它會關閉連線。然而一些容器並不希望這樣,因此如果你需要從連線中停止它,將closeConnection屬性設
置為false -->
<transactionManager type="JDBC" />
<!-- <transactionManager type="MANAGED"><property name="closeConnection"
value="false"/></transactionManager> -->
<!-- 資料來源型別:type = UNPOOLED、POOLED、JNDI
1.UNPOOLED:這個資料來源的實現是每次被請求時簡單開啟和關閉連線。它有一點慢,這是對簡單應用程式的一個很好的選
擇,因為它不需要及時的可用連線。
不同的資料庫對這個的表現也是不一樣的,所以對某些資料庫來說配置資料來源並不重要,這個配置也是閒置
的 。
2.POOLED:這是JDBC連線物件的資料來源連線池的實現,用來避免建立新的連線例項時必要的初始連線和認證時間。
這是一種當前Web應用程式用來快速響應請求很流行的方法。
3.JNDI:這個資料來源的實現是為了使用如Spring或應用伺服器這類的容器,容器可以集中或在外部配置資料來源,然後放置
一個JNDI上下文的引用 -->
<dataSource type="UNPOOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/test" />
<property name="username" value="" />
<property name="password" value="" />
<!-- 在任意時間存在的活動(也就是正在使用)連線的數量 -->
<property name="poolMaximumActiveConnections" value="10" />
<!-- 任意時間存在的空閒連線數 -->
<property name="poolMaximumIdleConnections" value="5" />
<!-- 在被強制返回之前,池中連線被檢查的時間 -->
<property name="poolMaximumCheckoutTime" value="20000" />
<!-- 這是給連線池一個列印日誌狀態機會的低層次設定,還有重新嘗試獲得連線,這些情況下往往需要很長時間(為了
避免連線池沒有配置時靜默失敗) -->
<property name="poolTimeToWait" value="20000" />
<!-- 傳送到資料的偵測查詢,用來驗證連線是否正常工作,並且準備接受請求。 -->
<property name="poolPingQuery" value="NO PING QUERY SET" />
<!-- 這是開啟或禁用偵測查詢。如果開啟,你必須用一個合法的SQL語句(最好是很快速的)設定poolPingQuery屬性
-->
<property name="poolPingEnabled" value="false" />
<!-- 這是用來配置poolPingQuery多次時間被用一次。這可以被設定匹配標準的資料庫連線超時時間,來避免不必要的
偵測 -->
<property name="poolPingConnectionsNotUsedFor" value="0" />
<!-- 預設連線事務隔離級別 <property name="defaultTransactionIsolationLevel" value="" /> -->
</dataSource>
</environment>
</environments>
<!-- 對映檔案,mapper的配置檔案 -->
<mappers>
<!--直接對映到相應的mapper檔案-->
<mapper resource="com/cpit/mapper/UserMapper.xml"/>
<!--掃描包路徑下所有xxMapper.xml檔案-->
<package name="com.cpit.mapper"/>
</mappers>
</configuration>
MyBatis自定義資料對映TypeHandler
1.自定義了一個將Date存為毫秒時間的VARCHAR型別的TypeHandler
public class CustomTimeStampHandler extends BaseTypeHandler<Date> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i,
Date parameter, JdbcType jdbcType) throws SQLException {
ps.setString(i, String.valueOf(parameter.getTime()));
}
@Override
public Date getNullableResult(ResultSet rs, String columnName)
throws SQLException {
String sqlTimestamp = rs.getString(columnName);
if (sqlTimestamp != null) {
return new Date(Long.parseLong(sqlTimestamp));
}
return null;
}
@Override
public Date getNullableResult(ResultSet rs, int columnIndex)
throws SQLException {
String sqlTimestamp = rs.getString(columnIndex);
if (sqlTimestamp != null) {
return new Date(Long.parseLong(sqlTimestamp));
}
return null;
}
@Override
public Date getNullableResult(CallableStatement cs, int columnIndex)
throws SQLException {
String sqlTimestamp = cs.getString(columnIndex);
if (sqlTimestamp != null) {
return new Date(Long.parseLong(sqlTimestamp));
}
return null;
}
}
2.在Mybatis配置中註冊該TypeHandler
<typeHandlers>
<typeHandler handler="com.cpit.CustomTimeStampHandler" javaType="java.util.Date" jdbcType="VARCHAR"/>
</typeHandlers>
3.在resultMap的定義中對對應列定義typeHandler:
<resultMap type="Note" id="note-base">
<result property="id" column="id" />
<result property="updateTime" column="update_time" jdbcType="VARCHAR" javaType="Date"
typeHandler="demo.CustomTimeStampHandler"/>
</resultMap>