Mybatis 自定义类型处理器

前言

在某些情况下我们需要对类型做处理。
例如数据存储的是Long。程序里是BigDecimal,那么我们出库入库都需要做处理。此时就可以使用类型处理器
我们从@TableFiel入手,其中有一个字段typeHandler如下图
image.png

对于注释上的建议事实也确实如此,如果我们在xml中没有定义这个实体的ResultMap那么需要将autoResultMap赋值为ture

要求类型是TypeHandler的实现类即可。
image.png
我们看到实际上已经有很多的类型处理器了
image.png
它们都是一些默认的类型处理器,下面是官网的解释
mybatis – MyBatis 3 | 配置

BaseTypeHandler

我们可以继承BaseTypeHandler,来自定义一个类型处理器。

/**
 * @author YinShangwen
 * @since 2023/10/16 9:36
 */
// 指定 Java 类型
@MappedTypes({String.class})
// 指定 jdbc 类型
@MappedJdbcTypes({JdbcType.VARCHAR})
public class StringTypeHandler extends BaseTypeHandler<String> {
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
        // 设置值
    }

    @Override
    public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
        // 获得值
        return null;
    }

    @Override
    public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        // 获得值
        return null;
    }

    @Override
    public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        // 获得值
        return null;
    }
}

假设我们这里给入库的字符串的末尾加上.ysw的后缀
出库的时候去除添加的后缀,完整代码如下:

/**
 * @author YinShangwen
 * @since 2023/10/16 9:36
 */
@MappedTypes({String.class})
@MappedJdbcTypes({JdbcType.VARCHAR})
public class StringTypeHandler extends BaseTypeHandler<String> {

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {
        if (StringUtils.isNotBlank(parameter)) {
            ps.setString(i, parameter + ".ysw");
        }
    }

    @Override
    public String getNullableResult(ResultSet rs, String columnName) throws SQLException {
        String ret = rs.getString(columnName);
        return ret != null ? ret.substring(0, ret.length() - 4) : null;
    }

    @Override
    public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        String ret = rs.getString(columnIndex);
        return ret != null ? ret.substring(0, ret.length() - 4) : null;
    }

    @Override
    public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        String ret = cs.getString(columnIndex);
        return ret != null ? ret.substring(0, ret.length() - 4) : null;
    }
}

AbstractJsonTypeHandler

AbstractJsonTypeHandler是对于json类型的处理器,继承该类可以很方便的完成
具体代码如下:

/**
 * @author YinShangwen
 * @since 2023/10/16 8:55
 */
@MappedTypes({Map.class})
@MappedJdbcTypes({JdbcType.JAVA_OBJECT})
public class LongMapJsonTypeHandler extends AbstractJsonTypeHandler<Map<Long, List<Demo>>> {

    @Override
    protected Map<Long, List<Demo>> parse(String json) {
        return JSON.parseObject(json, new TypeReference<Map<Long, List<RangeConfigDTO>>>() {
        });
    }

    @Override
    protected String toJson(Map<Long, List<Demo>> obj) {
        return JSON.toJSONString(obj);
    }
}

使用

⚠️注意:必须开启@TableName(autoResultMap = true)

@TableField(typeHandler = StringTypeHandler.class)
<result column="demo_config" property="demoConfig" typeHandler="com.ysw.type_handler.LongMapJsonTypeHandler"/>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值