加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 放入标记时不执行MyBatis自定义TypeHandler

发布时间:2020-12-15 04:15:34 所属栏目:Java 来源:网络整理
导读:我有一个 resultMap使用自定义typeHandler作为结果属性之一: resultMap id="foo" type="hashmap" ... result property="SERVICES_XML" javaType="string" jdbcType="CLOB" typeHandler="com.foo.bar.OracleClobTypeHandler" / .../resultMap 无论我将哪个属
我有一个< resultMap>使用自定义typeHandler作为结果属性之一:

<resultMap id="foo" type="hashmap">
    ... 
    <result property="SERVICES_XML" javaType="string" jdbcType="CLOB" typeHandler="com.foo.bar.OracleClobTypeHandler" />
    ...
</resultMap>

无论我将哪个属性附加到我的处理程序(我的意思是这不是CLOB特定的问题,也尝试使用VARCHAR),当我从数据库中获取结果时,处理程序将不会被调用.

我在自定义处理程序的所有方法中设置了断点:

public class OracleClobTypeHandler implements TypeHandler<String> {

  @Override
  public void setParameter(PreparedStatement ps,int i,String parameter,JdbcType jdbcType) throws SQLException {
    log.debug("setParameter called");   <================ BREAKPOINT HERE
  }

  @Override
  public String getResult(ResultSet rs,String columnName)
        throws SQLException {
    log.debug("getResult 2 called");    <================ BREAKPOINT HERE
    return "";
  }

  @Override
  public String getResult(ResultSet rs,int columnIndex)
        throws SQLException {
    log.debug("getResult 2 called");    <================ BREAKPOINT HERE
    return "";
  }

  @Override
  public String getResult(CallableStatement cs,int columnIndex)
        throws SQLException {
    log.debug("getResult 3 called");    <================ BREAKPOINT HERE
    return "";
  }
}

显然,没有执行上述方法.

我试图把< typeHandler javaType =“java.lang.String”jdbcType =“CLOB”handler =“com.foo.bar.OracleClobTypeHandler”/>在myBatis< configuration>中,但这也不起作用.
也没有做任何其他事情,包括扩展TypeHandler< Object>等等.

我究竟做错了什么?

解决方法

经过长时间的挖掘,我终于找到了答案.

这似乎是myBatis中的一个错误.

为了让您的处理程序适用于< result>元素,即使属性属性已经与bean中的列名和字段名匹配,也必须显式指定列属性.
就我而言,它看起来像这样:

<result property="SERVICES_XML" column="SERVICES_XML" javaType="string" jdbcType="CLOB" typeHandler="com.foo.bar.OracleClobTypeHandler" />

请注意,上述更改还将导致在< configuration>中定义的处理程序.标签工作,所以内联typeHandler可能不再需要 – 这是我的情况.我结束了:

<configuration>
  <typeHandlers>
    <typeHandler javaType="java.lang.String" jdbcType="CLOB" handler="com.foo.bar.OracleClobTypeHandler"/>        
  </typeHandlers>
</configuration>

<result property="SERVICES_XML" column="SERVICES_XML" javaType="string" jdbcType="CLOB" />

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读