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>中,但这也不起作用. 我究竟做错了什么? 解决方法
经过长时间的挖掘,我终于找到了答案.
这似乎是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" /> (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |