MyBatis TypeHandler 深度解析:Java 与 JDBC 类型转换的桥梁(从原理到自定义实践)
在 MyBatis 与数据库交互过程中,Java 类型与 JDBC 类型无法直接兼容(如 Java 的 Date 与 JDBC 的 Timestamp、Java 枚举与 JDBC 的 VARCHAR)。TypeHandler(类型处理器)正是解决这一问题的核心组件,负责参数绑定时的 Java→JDBC 类型转换和结果映射时的 JDBC→Java 类型转换,是 MyBatis 数据交互的 “翻译官”。从 “接口定义→核心实现→注册管理→自定义实践” 四个维度,彻底拆解 TypeHandler 的工作机制。
TypeHandler 核心定位与接口规范
TypeHandler 是 MyBatis 中类型转换的标准接口,定义了 “参数绑定” 和 “结果获取” 两类核心操作,覆盖所有数据交互场景。
TypeHandler 接口定义
public interface TypeHandler<T> {
void setParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException;
T getResult(ResultSet rs, String columnName) throws SQLException;
T getResult(ResultSet rs, int columnIndex) throws SQLException;
T getResult(CallableStatement cs, int columnIndex) throws SQLException;
}
接口设计思路:
- 泛型
<T>:指定该 TypeHandler 处理的 Java 类型(如 DateTypeHandler 的泛型是 Date);
- 两类操作:
setParameter:参数绑定时的 “正向转换”(Java→JDBC),由 ParameterHandler 调用;
getResult:结果映射时的 “反向转换”(JDBC→Java),由 ResultSetHandler 调用。
BaseTypeHandler:简化自定义实现的抽象基类
MyBatis 提供 BaseTypeHandler<T> 抽象类,它实现了 TypeHandler<T> 接口,并抽离了 null 值的统一处理逻辑,让自定义 TypeHandler 只需关注 “非 null 类型转换”,大幅降低开发成本。
核心源码解析