MyBatis 通过 TypeHandlerRegistry 组件来集中 管理和查找 TypeHandler。 TypeHandler 是 MyBatis 中用于 处理 Java 类型和 JDBC 类型之间转换 的重要组件。 MyBatis 需要管理大量的 TypeHandler,并能够根据需要快速找到合适的 TypeHandler 来进行类型转换。
1. TypeHandlerRegistry 的作用:TypeHandler 的注册中心
TypeHandlerRegistry 可以被理解为 MyBatis 中 TypeHandler 的注册中心 或 TypeHandler 的仓库。 它的核心作用是:
- 注册 TypeHandler: 负责注册各种 TypeHandler 到 MyBatis 系统中。 TypeHandler 可以是 MyBatis 内置的,也可以是用户自定义的。
- 存储 TypeHandler: 内部维护一个数据结构 (实际上是多个
Map) 来存储已注册的 TypeHandler,并按照不同的维度进行组织,方便查找。 - 查找 TypeHandler: 提供 API 方法,允许 MyBatis 在运行时根据 Java 类型和/或 JDBC 类型,快速查找并获取合适的 TypeHandler 实例。
2. TypeHandlerRegistry 如何管理 TypeHandler:内部存储结构
TypeHandlerRegistry 内部使用多个 Map 来存储 TypeHandler,以便根据不同的查找条件进行高效检索。 主要的存储结构包括:
-
KNOWN_TYPE_HANDLERS(Map<JdbcType, TypeHandler<?>>):- Key:
JdbcType枚举值,代表 JDBC 类型。 - Value:
TypeHandler<?>实例。 - 作用: 根据 JDBC 类型查找 TypeHandler。 例如,当 MyBatis 需要处理
VARCHAR类型的参数或结果时,会使用KNOWN_TYPE_HANDLERS查找与JdbcType.VARCHAR关联的 TypeHandler。
- Key:
-
TYPE_HANDLER_MAP(Map<Type, Map<JdbcType, TypeHandler<?>>>):- Outer Key:
Type对象,代表 Java 类型。 - Inner Key:
JdbcType枚举值,代表 JDBC 类型 (可以为null,表示不区分 JDBC 类型)。 - Value:
TypeHandler<?>实例。 - 作用: 根据 Java 类型和 JDBC 类型查找 TypeHandler。 这是最主要的 TypeHandler 存储和查找结构。 MyBatis 会优先使用
TYPE_HANDLER_MAP进行查找。 - 层级结构:
TYPE_HANDLER_MAP是一个两层嵌套的Map。 外层Map的 Key 是 Java 类型,内层Map的 Key 是 JDBC 类型。 这种结构允许根据 Java 类型和 JDBC 类型的组合来精确查找 TypeHandler。
- Outer Key:
-
ALL_TYPE_HANDLERS_MAP(Map<Class<?>, TypeHandler<?>>):- Key:
Class<?>对象,代表 TypeHandler 的 Class 类型。 - Value:
TypeHandler<?>实例。 - 作用: 根据 TypeHandler 的 Class 类型查找 TypeHandler 实例。 主要用于通过
TypeHa
- Key:

最低0.47元/天 解锁文章
85万+

被折叠的 条评论
为什么被折叠?



