请描述 MyBatis 完成数据库字段类型与 Java 属性类型相互映射的底层机制是怎样的?
考察说明
考查对 MyBatis 类型转换机制(TypeHandler)及注册、配置流程的理解。
回答思路
- 【回答框架 1】MyBatis 通过 TypeHandler 接口实现 JDBC 类型与 Java 类型的双向转换。接口定义 setParameter 方法用于写参数时把 Java 类型转为 JDBC 类型,getResult 方法用于读结果时把 JDBC 类型转为 Java 类型。
- 【回答框架 2】框架内置了常用类型的 TypeHandler,例如 StringTypeHandler、IntegerTypeHandler、DateTypeHandler 等。每个 handler 针对特定 Java 类型和 JDBC 类型组合,在 PreparedStatement 上调用相应的 setXxx 方法,在 ResultSet 上调用相应的 getXxx 方法。
- 【回答框架 3】TypeHandler 的注册与解析机制:框架维护一个 TypeHandlerRegistry,按 Java 类型和 JDBC 类型存储 handler。在解析映射文件或注解时,根据属性 Java 类型和数据库列类型查找对应的 handler。若未明确指定 jdbcType,则根据 Java 类型推断。
- 【回答框架 4】MyBatis 支持自定义 TypeHandler。实现 TypeHandler 接口,并在配置中注册(通过 mybatis-config.xml 或 Mapper 文件中指定 typeHandler)。自定义 handler 可用于处理枚举、复杂对象等特殊类型转换。
- 【回答框架 5】在实际执行中,参数处理时根据 ParameterMapping 中的 typeHandler 调用 setParameter;结果映射时根据 ResultMapping 中的 typeHandler 调用 getResult。整体流程贯穿 SQL 解析、参数绑定和结果集映射三个环节。
- 【关键点 1】TypeHandler 是核心接口,负责双向转换。
- 【关键点 2】框架内置常见类型 handler,并通过 TypeHandlerRegistry 注册。
- 【关键点 3】解析映射时,根据 Java 类型和 JDBC 类型查找对应 handler。
- 【关键点 4】自定义 TypeHandler 需实现接口并在配置中注册。
- 【关键点 5】转换发生在参数设置和结果集读取阶段。
- 【易错点 1】容易混淆 TypeHandler 与 TypeAlias:TypeAlias 仅用于别名,不参与类型转换。
- 【易错点 2】自定义 handler 时若未正确注册,将使用默认 handler 导致转换错误。
- 【易错点 3】处理 null 值时需注意 jdbcType 设置,否则可能影响数据库写入。