前言
TypeHander 是Mybatis中类型转换的关键,它可以对请求的参数request和返回的参数进行转换 JavaType <====>JdbcType 是处理数据类型映射的灵魂,Mybatis中内置了很多丰富的转换器,但是在平时的工作中,难免有些业务类型例如枚举值等 需要我们手动进行转换的 这个时候需要自定义类型转换器转换器
TypeHander类图关系
BaseHandler继承关系类图
自定义实现一个TypeHander类型转换器
1.继承BaseHandler类 或者实现TypeHandler接口
2.在需要转换的地方进行类型转换编码
3.在需要转换的resultMap中进行定义注册
实例代码如下
第一步:
定义转换器
public class ArticleTypeHandler extends BaseTypeHandler<ArticleEnum> {
//设置参数值
@Override
public void setNonNullParameter(PreparedStatement ps, int i, ArticleEnum parameter, JdbcType jdbcType) throws SQLException {
ps.setInt(i,parameter.getValue());
}
//通过列名获取结果集
@Override
public ArticleEnum getNullableResult(ResultSet rs, String columnName) throws SQLException {
return Convert(rs.getInt(columnName));
}
//通过下标获取结果集
@Override
public ArticleEnum getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
return Convert(rs.getInt(columnIndex));
}
//存储过程获取结果
@Override
public ArticleEnum getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
return Convert(cs.getInt(columnIndex));
}
private ArticleEnum Convert(Integer value){
return ArticleEnum.getValueByDesc(value);
}
}
public enum ArticleEnum {
JAVA(1,"java"),
NET(2,"net"),
PYTHON(3,"python");
private int value;
private String desc;
ArticleEnum(int value,String desc){
this.value=value;
this.desc=desc;
}
public int getValue(){
return value;
}
public String getDesc(){
return desc;
}
public static ArticleEnum getValueByDesc(Integer value){
for (ArticleEnum articleEnum:values()){
if(articleEnum.getValue() == value ){
return articleEnum;
}
}
return null;
}
}
在结果集中进行映射注册
<resultMap id="BaseResultMap" type="xyz.coolblog.chapter1.model.Article">
<!--@mbg.generated-->
<!--@Table article-->
<id column="id" jdbcType="INTEGER" property="id" />
<result column="author_id" jdbcType="INTEGER" property="authorId" />
<result column="title" jdbcType="VARCHAR" property="title" />
<result column="type" jdbcType="TINYINT" property="type" />
<result column="content" jdbcType="LONGVARCHAR" property="content" />
<result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
<result column="articleEnum" jdbcType="TINYINT" property="articleEnum" typeHandler="xyz.coolblog.chapter1.handler.ArticleTypeHandler" />
</resultMap>