Mybaits Oracle CLob类型处理

文章讲述了在使用MyBatis查询Oracle数据库时,遇到Clob类型字段返回对象而非字符串的解决方案。包括手动转换Clob为字符串,以及在MyBatis中注册自定义或内置的ClobTypeHandler。还提到了在MapperXML中针对特定字段指定类型处理器的方法,以避免全局影响。
摘要由CSDN通过智能技术生成

问题描述:

使用的是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包的类

     2.3打断点,就可以看见 typeHandlerMap中有我们注册的ClobTypeHandler了

TypeHandler(类型处理器) 的补充说明:

  1. @MappedJdbcTypes(JdbcType.CLOB)
  2. @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 类型时的默认处理器。

3.也可以直接注册Mybatis提供的ClobTypeHandler

   mybaits提供了ClobTypeHandler,

  所以我们直接注册:

        但是Mybatist提供的ClobTypeHandler上面没有注解@MappedJdbcTypes(JdbcType.CLOB) 和@MappedTypes(Clob.class) 指定Java type + jdbc type 

        所以 注册的时候就要指定 java type + jdbc type

 @Bean
    ConfigurationCustomizer typeHandlerRegistry() {
        return configuration -> configuration.getTypeHandlerRegistry().register(Clob.class, JdbcType.CLOB,ClobTypeHandler.class);
    }

Type Handler Registry源码中提供了 方法,可以直接注册

4.单独指定某个字段进行处理,不会影响全局

 我就遇到一个问题:我注册了clob的处理器,但是之前的代码是别的同事: 取得clob字段之后,进行转换处理,就导致报错 , String 无法转换为 Clob类型,因为注册了clob处理器之后,查询就会返回String,但是之前同事进行转换时就会报错

在mapper.xml文件中,单独指定clob字段的类型处理器,就可以了


<resultMap id="userMap" type="map">
    <result column="description" property="description" typeHandler="org.apache.ibatis.type.ClobTypeHandler"></result>
</resultMap>

<select id="selectUserInfo" resultMap="userMap">
   
    select * from user_info

</select>

至于mybatis的TypeHandlerMap后续我会继续讲解源码的

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值