Mybatis 自定义类型处理器示例详解

 更新时间:2023年10月17日 16:48:16   作者:逆水行舟x  
在某些情况下我们需要对类型做处理,例如数据存储的是Long,程序里是BigDecimal,那么我们出库入库都需要做处理,此时就可以使用类型处理器,本文通过示例给大家介绍Mybatis 自定义类型处理器的相关知识,感兴趣的朋友跟随小编一起看看吧

前言

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

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

要求类型是TypeHandler的实现类即可。

我们看到实际上已经有很多的类型处理器了

它们都是一些默认的类型处理器,下面是官网的解释
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"/>

到此这篇关于Mybatis 自定义类型处理器的文章就介绍到这了,更多相关Mybatis 自定义类型处理器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • JavaMail实现带附件的邮件发送

    JavaMail实现带附件的邮件发送

    这篇文章主要为大家详细介绍了JavaMail实现带附件的邮件发送,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • Java经典面试题汇总:Spring MVC

    Java经典面试题汇总:Spring MVC

    本篇总结的是Spring MVC框架相关的面试题,后续会持续更新,希望我的分享可以帮助到正在备战面试的实习生或者已经工作的同行,如果发现错误还望大家多多包涵,不吝赐教,谢谢
    2021-07-07
  • Mybatis-plus获取雪花算法生成的ID并返回生成ID

    Mybatis-plus获取雪花算法生成的ID并返回生成ID

    本文主要介绍了Mybatis-plus获取雪花算法生成的ID并返回生成ID,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-09-09
  • java如何动态的处理接口的返回数据

    java如何动态的处理接口的返回数据

    本文主要介绍了java如何动态的处理接口的返回数据,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-01-01
  • rabbitmq的消息持久化处理开启,再关闭后,消费者启动报错问题

    rabbitmq的消息持久化处理开启,再关闭后,消费者启动报错问题

    这篇文章主要介绍了rabbitmq的消息持久化处理开启,再关闭后,消费者启动报错问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • Java使用Javassist动态生成HelloWorld类

    Java使用Javassist动态生成HelloWorld类

    Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javassist动态生成HelloWorld类,需要的可以了解下
    2025-09-09
  • 基于CyclicBarrier和CountDownLatch的使用区别说明

    基于CyclicBarrier和CountDownLatch的使用区别说明

    这篇文章主要介绍了基于CyclicBarrier和CountDownLatch的使用区别说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • Java Morris遍历算法及其在二叉树中的应用

    Java Morris遍历算法及其在二叉树中的应用

    Morris遍历是一种基于线索二叉树的遍历算法,可以在不使用栈或递归的情况下,实现二叉树的前序、中序和后序遍历。该算法利用二叉树中的空指针或线索指针,将遍历序列嵌入到原二叉树中,实现了常数级别的空间复杂度,适用于对空间要求较高的场景
    2023-04-04
  • 在Spring中自动装配Bean的属性

    在Spring中自动装配Bean的属性

    今天小编就为大家分享一篇关于在Spring中自动装配Bean的属性,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • Java多线程编程:线程的原理和使用安全

    Java多线程编程:线程的原理和使用安全

    文章主要介绍了线程的基本概念、线程和进程的区别、线程的创建方法、线程的常见方法与属性、线程的安全问题等,线程是程序执行流的最小单位,可以并发执行并共享数据,线程的生命周期状态包括新建、就绪、运行、阻塞、死亡等
    2026-05-05

最新评论