1. 程式人生 > >MyBatis系列之TypeHandler的使用

MyBatis系列之TypeHandler的使用

MyBatis中TypeHandler的使用

題外話(閱讀原始碼所得):
在使用MyBatis的過程中,如果同時使用xml對映與Annotation,啟動會報錯,報錯原因:

MyBatis首先載入的xml對映檔案,然後解析xml對映檔案,根據方法名稱為keyMappedStatement為值,構建為Map

操作列舉
定義列舉
package com.garlic.enums;

/**
 * 賬戶狀態
 *
 * @author sam.liu
 * @create 2017-11-28 10:59
 * @contact 563750241
 * @email
563750241[email protected] */
public enum Locked { NORMAL("正常", 0), LOCKED("鎖定", 1); private String name; private Integer tag; private Locked(String name, Integer tag) { this.name = name; this.tag = tag; } public String getName() { return name; } public
void setName(String name) { this.name = name; } public Integer getTag() { return tag; } public void setTag(Integer tag) { this.tag = tag; } }
Mapper.xml的使用

ResultMap中的配置

<result column="locked" jdbcType="TINYINT" property="locked"
            typeHandler
="org.apache.ibatis.type.EnumOrdinalTypeHandler" javaType="com.garlic.enums.Locked" />

Spring Boot中,除了以上處理之外,不需要做任何配置,而在普通的Spring工程中,則需要增加以下配置:

<!-- mybatis-config.xml -->
<typeHandlers>
  <typeHandler handler="org.apache.ibatis.type.EnumOrdinalTypeHandler"
    javaType="java.math.RoundingMode"/>
</typeHandlers>
自定義TypeHandler
package com.garlic.handler;

import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.sql.*;

/**
 * 日期格式化Handler
 *
 * @author sam.liu
 * @create 2017-11-28 13:35
 * @contact 563750241
 * @email [email protected]
 */
@MappedJdbcTypes(JdbcType.BIGINT)
public class DateFormatterHandler extends BaseTypeHandler<Long> {

    private static final Logger logger = LoggerFactory.getLogger(DateFormatterHandler.class);

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, Long parameter, JdbcType jdbcType) throws SQLException {
        //TODO: 此處可以將parameter的值進行處理之後再寫入資料庫,比如格式化為日期字串
        logger.info("columnIndex: {} parameter: {}", i, parameter);
        ps.setLong(i, parameter);
    }

    @Override
    public Long getNullableResult(ResultSet rs, String columnName) throws SQLException {
        //TODO: 此次可以將rs.getLong(columnName)值轉換為時間戳再進行輸出
        logger.info("columnName: {}", columnName);
        return rs.getLong(columnName);
    }

    @Override
    public Long getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        //TODO: 此次可以將rs.getLong(columnName)值轉換為時間戳再進行輸出
        logger.info("columnIndex: {}", columnIndex);
        return rs.getLong(columnIndex);
    }

    @Override
    public Long getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        //TODO: 此次可以將rs.getLong(columnName)值轉換為時間戳再進行輸出
        logger.info("columnIndex: {}", columnIndex);
        return cs.getLong(columnIndex);
    }
}

自定義成功TypeHandler之後,只需要按照普通的TypeHandler的使用方式使用即可。