Mybatis使用TypeHandler实现Java类型与数据库类型的自定义转换

TypeHandler

当 SpringBoot 项目中使用到Mybatis时,通常情况下程序中使用的各种基本数据类型在数据库中都有定义,如 String - VARCHAR;
但当使用一些数据库中没有定义的数据类型时,如 Serializable ,此时 Mybatis 无法在数据库的数据类型和程序中的数据类型之间进行转换,就需要使用到自定义 TypeHandler;

通过实现 BaseTypeHandler<需要转换的Java类型> 来自定义类型的转换

举例将 Java 中的 Serializable 转换为 数据库中的 BIGINT

@MappedTypes(Serializable.class)
@MappedJdbcTypes(JdbcType.BIGINT)
public class SerializableTypeHandler extends BaseTypeHandler<Serializable> {

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, Serializable parameter, JdbcType jdbcType) throws SQLException {
        ps.setObject(i, parameter, JdbcType.BIGINT.TYPE_CODE);
    }

    @Override
    public Serializable getNullableResult(ResultSet rs, String columnName) throws SQLException {
        long result = rs.getLong(columnName);
        return result == 0 && rs.wasNull() ? null : result;
    }

    @Override
    public Serializable getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        long result = rs.getLong(columnIndex);
        return result == 0 && rs.wasNull() ? null : result;
    }

    @Override
    public Serializable getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        long result = cs.getLong(columnIndex);
        return result == 0 && cs.wasNull() ? null : result;
    }
}

在程序启动时需要向Mybatis的TypeHandlerRegistry中注册自定义的TypeHandler

SpringBoot注册示例:

public class Test implements ApplicationContextAware {
    public static void main(String[] args) {
        ApplicationContext applicationContext = SpringApplication.run(Test.class, args);
        SpringBeanLoader.setApplicationContext(applicationContext);
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        SqlSessionTemplate bean = applicationContext.getBean(SqlSessionTemplate.class);
        Configuration configuration = bean.getConfiguration();
        TypeHandlerRegistry typeHandlerRegistry = configuration.getTypeHandlerRegistry();
        typeHandlerRegistry.register(SerializableTypeHandler.class);
    }
}

同时,需要定义数据库类型转回Java数据类型

此时需要在使用到该属性的mapper文件中通过resultMap定义:

	    <resultMap id="BASE_RESULTMAP" type="***.entity.Test">
        	<id column="test_id" property="id" typeHandler="***.handler.SerializableTypeHandler"/>
    	    <result column="test_name" jdbcType="VARCHAR" property="name"/>
        </resultMap>
### 回答1: jacksontypehandler是一个Java库,用于将Java对象序列化为JSON格式,并将JSON格式反序列化为Java对象。它使用Jackson库来实现这些功能,并提供了一些自定义类型处理程序,以便更好地控制序列化和反序列化过程。 ### 回答2: jacksontypehandler 是指在使用Jackson 序列化和反序列化 JSON 数据时所使用的一种类型处理器。在 Java 开发中,经常需要将 Java 对象转换为 JSON 字符串,或者将 JSON 字符串转换Java 对象。JacksonTypeHandler 作为一种类型处理器,可以帮助我们实现这一过程。 Jackson 是目前比较流行的 JSON 处理库,它提供了丰富的 API,能够方便地完成 JSON 数据的转换。而 JacksonTypeHandler 则是该库中用来处理类型转换的组件之一。它根据 Java 对象的类型进行序列化和反序列化的操作,在转换过程中能够自动识别数据类型,从而实现正确的转换使用 JacksonTypeHandler,我们可以将一个 Java 对象转换为 JSON 字符串,或者将 JSON 字符串转换为一个 Java 对象。在序列化时,JacksonTypeHandler会将 Java 对象的属性按照一定的规则转换为 JSON 字符串的键值对。而在反序列化时,它会根据 JSON 字符串中的键值对的类型信息,将其转换为对应的 Java 对象。 除了基本的数据类型,JacksonTypeHandler 还可以处理复杂的对象结构,包括嵌套对象、集合类型等。它能够正确地处理对象之间的引用关系,保持数据的完整性。另外,我们也可以通过自定义 JacksonTypeHandler 来处理特定的数据类型,以满足业务需求。 总之,JacksonTypeHandler 是一种方便实用的类型处理器,它能够帮助开发人员轻松地完成 JSON 数据的序列化和反序列化操作,提高开发效率。 ### 回答3: JacksonTypeHandler是一个通过Jackson库实现MyBatis类型处理器。MyBatis是一个流行的Java持久化框架,而Jackson是一个用于处理Java对象JSON格式之间转换的库。 在MyBatis中,类型处理器用于处理数据库中的数据类型,将其转换Java对象或相反。JacksonTypeHandler的作用是在数据库查询时,将查询结果中的JSON格式数据转换Java对象;在数据插入和更新时,将Java对象转换成JSON格式数据存储到数据库中。 JacksonTypeHandler实现依赖于Jackson库提供的JsonNode类。通过JsonNode类,我们可以将JSON字符串转换成JsonNode对象,进而可以获取其中的属性值。在MyBatis类型处理器中,我们可以将JsonNode对象转换成希望的Java对象,以满足业务需求。 使用JacksonTypeHandler时,需要在MyBatis的配置文件中进行相应的配置。首先,需要将JacksonTypeHandler类设置为属性的类型处理器。其次,需要在数据库表的映射文件中将相应的字段类型设置为JSON类型。 总之,JacksonTypeHandler是一个在MyBatis使用Jackson库进行JSONJava对象之间转换类型处理器。它为我们在数据库操作过程中提供了便利,使我们能够更加灵活地处理JSON格式的数据。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值