java – 放入标记时不执行MyBatis自定义TypeHandler
作者:互联网
我有一个< 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" />
标签:java,mybatis,typehandler 来源: https://codeday.me/bug/20190728/1564756.html