对于其中一个结果属性,我有一个带有自定义<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>元素,即使column属性已经与bean 中的列名和字段名匹配,您也必须显式指定property属性
就我而言,它看起来像这样:

 <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" />

10-06 05:40