1. 程式人生 > >mybatis-config.xml

mybatis-config.xml

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>