Mybatis 源码解析之 TypeHander 类型处理器

本文介绍了如何在Mybatis中自定义TypeHandler,以处理枚举类型的转换,包括继承BaseHandler或实现TypeHandler接口,设置参数和获取结果的方法,以及在resultMap中注册类型转换。实例演示了如何为ArticleEnum枚举创建专用TypeHandler。
摘要由CSDN通过智能技术生成

前言 

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>

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值