java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > MyBatis 查找TypeHandler

MyBatis 管理和查找TypeHandler的方法

作者:冰糖心书房

MyBatis通过TypeHandlerRegistry组件集中管理和查找TypeHandler,TypeHandler用于处理Java类型和JDBC类型之间的转换,本文介绍MyBatis 管理和查找TypeHandler的方法,感兴趣的朋友一起看看吧

MyBatis 通过 TypeHandlerRegistry 组件来集中 管理和查找 TypeHandlerTypeHandler 是 MyBatis 中用于 处理 Java 类型和 JDBC 类型之间转换 的重要组件。 MyBatis 需要管理大量的 TypeHandler,并能够根据需要快速找到合适的 TypeHandler 来进行类型转换。

1. TypeHandlerRegistry 的作用:TypeHandler 的注册中心

TypeHandlerRegistry 可以被理解为 MyBatis 中 TypeHandler 的注册中心TypeHandler 的仓库。 它的核心作用是:

2. TypeHandlerRegistry 如何管理 TypeHandler:内部存储结构

TypeHandlerRegistry 内部使用多个 Map 来存储 TypeHandler,以便根据不同的查找条件进行高效检索。 主要的存储结构包括:

KNOWN_TYPE_HANDLERS (Map<JdbcType, TypeHandler<?>>):

TYPE_HANDLER_MAP (Map<Type, Map<JdbcType, TypeHandler<?>>>):

ALL_TYPE_HANDLERS_MAP (Map<Class<?>, TypeHandler<?>>):

3. TypeHandler 的注册方式:

TypeHandler 可以通过多种方式注册到 TypeHandlerRegistry 中:

3.1. XML 配置文件 (mybatis-config.xml):

<typeHandlers> 元素和 <typeHandler> 子元素: 在 mybatis-config.xml 文件中使用 <typeHandlers> 元素和 <typeHandler> 子元素来注册 TypeHandler。

<typeHandlers>
    <typeHandler javaType="java.lang.String" jdbcType="VARCHAR" handler="com.example.typehandler.MyStringTypeHandler"/>
    <typeHandler package="com.example.typehandler.package"/> <!-- 扫描包注册 TypeHandler -->
</typeHandlers>

XMLConfigBuilder 解析 <typeHandlers> 元素时,会将配置的 TypeHandler 注册到 Configuration 对象的 typeHandlerRegistry 中。

3.2. Java 代码配置 (Configuration 对象):

Configuration.getTypeHandlerRegistry().register(...) 方法: 可以通过 Configuration 对象的 getTypeHandlerRegistry() 方法获取 TypeHandlerRegistry 实例,然后使用 register() 方法手动注册 TypeHandler。

Configuration configuration = new Configuration();
TypeHandlerRegistry typeHandlerRegistry = configuration.getTypeHandlerRegistry();
typeHandlerRegistry.register(String.class, JdbcType.VARCHAR, new MyStringTypeHandler()); // 注册指定 Java 类型和 JDBC 类型的 TypeHandler
typeHandlerRegistry.register(MyEnumTypeHandler.class); // 注册 TypeHandler,不指定 Java 类型和 JDBC 类型 (MyEnumTypeHandler 需要标注 @MappedTypes 和 @MappedJdbcTypes)
typeHandlerRegistry.register(new MyDefaultTypeHandler()); // 注册 TypeHandler 实例,不指定 Java 类型和 JDBC 类型 (MyDefaultTypeHandler 需要标注 @MappedTypes 和 @MappedJdbcTypes)

3.3. 自动扫描包 (<typeHandlers package="...">):

3.4. MyBatis 内置的 TypeHandler:

4. TypeHandlerRegistry 如何查找 TypeHandler:查找策略

当 MyBatis 需要进行类型转换时 (例如设置 PreparedStatement 参数,获取 ResultSet 结果),会通过 TypeHandlerRegistry 查找合适的 TypeHandler。 TypeHandlerRegistry 的查找策略如下 (优先级从高到低):

4.1. 精确匹配 Java 类型和 JDBC 类型:

MyBatis 会首先尝试 根据 Java 类型和 JDBC 类型的精确组合TYPE_HANDLER_MAP 中查找 TypeHandler。 这是最精确的查找方式,如果找到,则直接使用该 TypeHandler。

4.2. 匹配 Java 类型,忽略 JDBC 类型:

如果精确匹配 Java 类型和 JDBC 类型没有找到 TypeHandler,MyBatis 会尝试 只根据 Java 类型TYPE_HANDLER_MAP 中查找 TypeHandler (JDBC 类型设置为 null)。 这种方式适用于某些 TypeHandler 只需要根据 Java 类型进行处理,而不需要区分 JDBC 类型的情况。

4.3. 根据 JDBC 类型查找:

如果根据 Java 类型和 JDBC 类型都无法找到合适的 TypeHandler,MyBatis 会尝试 根据 JDBC 类型KNOWN_TYPE_HANDLERS 中查找 TypeHandler。 这种方式适用于某些通用的 JDBC 类型处理场景,例如处理所有 VARCHAR 类型的数据,可以使用与 JdbcType.VARCHAR 关联的 TypeHandler。

4.4. 类型继承关系查找 (Type Hierarchy):

如果以上方式都无法找到合适的 TypeHandler,MyBatis 还会 考虑 Java 类型的继承关系。 例如,如果查找 List 类型的 TypeHandler 失败,MyBatis 会尝试查找 Collection, Iterable, Object 等父类型或接口的 TypeHandler。 这种方式可以提高 TypeHandler 的通用性。

4.5. 默认 TypeHandler (Default TypeHandler):

如果经过上述所有查找策略都无法找到合适的 TypeHandler,MyBatis 会 使用默认的 ObjectTypeHandler (或其他默认 TypeHandler) 进行处理。 ObjectTypeHandler 可以处理 Object 类型的数据,但可能会丢失类型信息,性能也可能较低。

5. 关键组件和类:

总结

到此这篇关于MyBatis 管理和查找TypeHandler的方法的文章就介绍到这了,更多相关MyBatis 查找TypeHandler内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文