MyBatis 中,如何使用 TypeHandler?有哪些场景适合使用 TypeHandler?

文章介绍了MyBatis中TypeHandler的作用,它是用于处理Java类型与JDBC类型转换的接口,常见于数据类型不匹配或格式转换场景。同时,解释了Interceptor的用途,如分页查询、缓存、日志记录等,但使用时需注意性能影响。

MyBatis 中,如何使用 TypeHandler?有哪些场景适合使用 TypeHandler?
在 MyBatis 中,每个 Java 类型和 JDBC 类型之间都需要进行转换。如果需要将 Java 类型转换为 JDBC 类型或反之,则可以使用 MyBatis 提供的 TypeHandler 接口来完成,将 Java 类型和 JDBC 类型之间进行转换。

TypeHandler 接口有如下两个方法需要实现:

  • setParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType): 将 Java 对象设置到 SQL 语句的参数中。
  • getResult(ResultSet rs, String columnName): 从结果集中获取数据。

使用 TypeHandler 时,通常需要实现自己的 TypeHandler 类,然后在 Mapper 的 XML 文件中进行配置,如下所示:

<resultMap id="userResultMap" type="User">
    <id property="id" column="id"/>
    <result property="createTime" column="create_time" typeHandler="com.example.MyTypeHandler"/>
</resultMap>

上面的 XML 中,使用了一个叫做 MyTypeHandler 的自定义 TypeHandler 类,将 createTime 列中的数据转换为 Java 对象。

TypeHandler 主要用于以下场景:

  • 数据类型不匹配:当 Java 类型与数据库字段类型不一致时,可以使用 TypeHandler 实现转换,例如将数据库中的 Long 类
MyBatis 中注册和配置自定义的 `TypeHandler` 是一种常见的需求,特别是在处理复杂数据类型(如 JSON、枚举、自定义对象等)时。MyBatis 提供了多种方式来实现这一目标,包括通过配置文件、注解或编程方式进行注册。 ### 通过配置文件注册 TypeHandler 可以在 `mybatis-config.xml` 文件中使用 `<typeHandlers>` 标签来注册自定义的 `TypeHandler`,并指定其对应的 Java 类型和 JDBC 类型。例如: ```xml <typeHandlers> <typeHandler handler="com.example.typehandler.JsonTypeHandler" javaType="com.example.model.JsonData" jdbcType="VARCHAR"/> <typeHandler handler="com.example.typehandler.DepartmentTypeHandler" javaType="com.example.model.Department" jdbcType="VARCHAR"/> </typeHandlers> ``` 这种方式适用于全局注册,所有映射文件或注解中涉及的对应类型都会自动使用注册的 `TypeHandler` [^2]。 ### 通过注解注册 TypeHandler 对于某些特定的字段映射,可以使用注解方式在 Mapper 接口中直接指定 `TypeHandler`。例如: ```java @Select("SELECT * FROM department WHERE id = #{id}") @TypeHandler(handler = DepartmentTypeHandler.class) Department selectById(Long id); ``` 这种方式适用于局部映射场景,仅对当前字段或方法生效 [^1]。 ### 编程式注册 TypeHandler 如果需要在运行时动态注册 `TypeHandler`,可以通过 `TypeHandlerRegistry` 实现编程式注册。例如: ```java Configuration configuration = sqlSessionFactory.getConfiguration(); configuration.getTypeHandlerRegistry().register(JsonData.class, JdbcType.VARCHAR, new JsonTypeHandler()); ``` 该方式适用于需要根据运行时条件动态决定使用哪个 `TypeHandler` 的场景 。 ### 在 Spring Boot 中注册 TypeHandler 在 Spring Boot 项目中,可以通过配置类来注册 `TypeHandler`。例如: ```java @Configuration public class MyBatisConfig { @Bean public PlatformTransactionManager transactionManager(DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } @Bean public SqlSessionFactory sqlSessionFactory(DataSource dataSource, TypeHandlerRegistry typeHandlerRegistry) throws Exception { SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean(); factoryBean.setDataSource(dataSource); // 注册自定义 TypeHandler typeHandlerRegistry.register(JsonData.class, JdbcType.VARCHAR, new JsonTypeHandler()); typeHandlerRegistry.register(Department.class, JdbcType.VARCHAR, new DepartmentTypeHandler()); return factoryBean.getObject(); } } ``` 通过这种方式,可以在 Spring Boot 启动时自动注册所需的 `TypeHandler` [^2]。 ### 在 Mapper XML 文件中使用 TypeHandler 在 XML 映射文件中,可以通过 `typeHandler` 属性显式指定某个字段使用的 `TypeHandler`。例如: ```xml <resultMap id="departmentResultMap" type="com.example.model.Department"> <result property="name" column="name" typeHandler="com.example.typehandler.DepartmentTypeHandler"/> </resultMap> ``` 这种方式适用于需要对特定字段进行类型转换控制的场景 [^1]。 ### 注意事项 - **类型匹配**:确保 `TypeHandler` 的 `javaType` 和 `jdbcType` 与实际使用的类型一致,否则可能导致转换失败。 - **注册顺序**:在配置文件中注册多个 `TypeHandler` 时,注意其优先级顺序,避免冲突。 - **可扩展性**:继承 `BaseTypeHandler<T>` 可以灵活实现自定义类型转换逻辑,适用于处理枚举、JSON 等复杂类型 [^3]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农落落

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值