我有一个 <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
显式属性即使property
属性已经匹配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" />
关于java - 放入 <result> 标签时不执行 MyBatis 自定义 TypeHandler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20122157/