您现在的位置是:首页 >技术交流 >Mybaits Oracle CLob类型处理网站首页技术交流
Mybaits Oracle CLob类型处理
问题描述:
使用的是Oracle 数据库, 表中有一个字段类型为clob类型
问题 : 当使用mybatis查询返回map类型时, 该字段的值为clob对象,而不是数据库里面的字符串

解决方案:
1.手动进行转换,把clob类型转换为字符串(这种比较简单)
if(map.get("MAIN_BIZ") instanceof Clob){
Clob clob = map.get("MAIN_BIZ") //clob.getSubString(1,(int)clob.length);这样才能获取到对应的字符串
try{
String convertStr = clob.getSubString(1,(int)clob.length);
}catch(Exception e){
}
}
2.就是往mybatis的typeHandlerMap中注册clob类型对应的类型处理器
TypeHandler(类型处理器) : MyBatis 在设置预处理语句(PreparedStatement)中的参数或从结果集中取出一个值时, 都会用类型处理器将获取到的值以合适的方式转换成 Java 类型。
2.1创建一个clob处理的TypeHandler

2.2把上面的clobTypeHandler注册到mybatis中
@Bean
ConfigurationCustomizer typeHandlerRegistry() {
return configuration -> configuration.getTypeHandlerRegistry().register(ClobTypeHandler.class);
}
注意:ConfigurationCustomizer 是mybatis-auto configure.jar包的类
TypeHandler(类型处理器) 的补充说明:
- @MappedJdbcTypes(JdbcType.CLOB)
- @MappedTypes(Clob.class)
要注意 MyBatis 不会通过检测数据库元信息来决定使用哪种类型,所以你必须在参数和结果映射中指明字段 类型, 以使其能够绑定到正确的类型处理器上。这是因为 MyBatis 直到语句被执行时才清楚数据类型。
通过类型处理器的泛型,MyBatis 可以得知该类型处理器处理的 Java 类型,不过这种行为可以通过两种方法改变:
- 在类型处理器的配置元素(typeHandler 元素)上增加一个
javaType属性(比如:javaType="String"); - 在类型处理器的类上增加一个
@MappedTypes注解指定与其关联的 Java 类型列表。 如果在javaType属性中也同时指定,则注解上的配置将被忽略。
可以通过两种方式来指定关联的 JDBC 类型:
- 在类型处理器的配置元素上增加一个
jdbcType属性(比如:jdbcType="VARCHAR"); - 在类型处理器的类上增加一个
@MappedJdbcTypes注解指定与其关联的 JDBC 类型列表。 如果在jdbcType属性中也同时指定,则注解上的配置将被忽略。
当在 ResultMap 中决定使用哪种类型处理器时,此时 Java 类型是已知的(从结果类型中获得),但是 JDBC 类型是未知的。 因此 Mybatis 使用 javaType=[Java 类型], jdbcType=null 的组合来选择一个类型处理器。 这意味着使用 @MappedJdbcTypes 注解可以限制类型处理器的作用范围,并且可以确保,除非显式地设置,否则类型处理器在 ResultMap 中将不会生效。 如果希望能在 ResultMap 中隐式地使用类型处理器,那么设置 @MappedJdbcTypes 注解的 includeNullJdbcType=true 即可。 然而从 Mybatis 3.4.0 开始,如果某个 Java 类型只有一个注册的类型处理器,即使没有设置 includeNullJdbcType=true,那么这个类型处理器也会是 ResultMap 使用 Java 类型时的默认处理器。
至于mybatis的TypeHandlerMap后续我会继续讲解源码的





U8W/U8W-Mini使用与常见问题解决
QT多线程的5种用法,通过使用线程解决UI主界面的耗时操作代码,防止界面卡死。...
stm32使用HAL库配置串口中断收发数据(保姆级教程)
分享几个国内免费的ChatGPT镜像网址(亲测有效)
Allegro16.6差分等长设置及走线总结