MyBatis中TypeHandler的使用
题外话(阅读源码所得):
在使用MyBatis的过程中,如果同时使用xml映射与Annotation,启动会报错,报错原因:MyBatis首先加载的xml映射文件,然后解析xml映射文件,根据方法名称为key,MappedStatement为值,构建为Map
操作枚举
定义枚举
package com.garlic.enums;
/**
* 账户状态
*
* @author sam.liu
* @create 2017-11-28 10:59
* @contact 563750241
* @email 563750241@qq.com
*/
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 563750241@qq.com
*/
@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的使用方式使用即可。