MyBatis异常日志如下:
Caused by: java.lang.NumberFormatException: For input string: "S" at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2043) at sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110) at java.lang.Double.parseDouble(Double.java:538) at org.apache.ibatis.ognl.OgnlOps.doubleValue(OgnlOps.java:243) at org.apache.ibatis.ognl.OgnlOps.compareWithConversion(OgnlOps.java:100) at org.apache.ibatis.ognl.OgnlOps.isEqual(OgnlOps.java:143) at org.apache.ibatis.ognl.OgnlOps.equal(OgnlOps.java:802) at org.apache.ibatis.ognl.ASTEq.getValueBody(ASTEq.java:52) at org.apache.ibatis.ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:212) at org.apache.ibatis.ognl.SimpleNode.getValue(SimpleNode.java:258) at org.apache.ibatis.ognl.Ognl.getValue(Ognl.java:470) at org.apache.ibatis.ognl.Ognl.getValue(Ognl.java:434) at org.apache.ibatis.scripting.xmltags.OgnlCache.getValue(OgnlCache.java:44) at org.apache.ibatis.scripting.xmltags.ExpressionEvaluator.evaluateBoolean(ExpressionEvaluator.java:32) at org.apache.ibatis.scripting.xmltags.IfSqlNode.apply(IfSqlNode.java:34) at org.apache.ibatis.scripting.xmltags.MixedSqlNode.apply(MixedSqlNode.java:33) at org.apache.ibatis.scripting.xmltags.IfSqlNode.apply(IfSqlNode.java:35) at org.apache.ibatis.scripting.xmltags.MixedSqlNode.apply(MixedSqlNode.java:33) at org.apache.ibatis.scripting.xmltags.TrimSqlNode.apply(TrimSqlNode.java:55) at org.apache.ibatis.scripting.xmltags.MixedSqlNode.apply(MixedSqlNode.java:33) at org.apache.ibatis.scripting.xmltags.DynamicSqlSource.getBoundSql(DynamicSqlSource.java:41) at org.apache.ibatis.mapping.MappedStatement.getBoundSql(MappedStatement.java:292) at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:81) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at org.apache.ibatis.plugin.Invocation.proceed(Invocation.java:49) at com.shengpay.hpsplus.db.interceptor.SlowSqlInterceptor.intercept(SlowSqlInterceptor.java:47) at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61) at com.sun.proxy.$Proxy185.query(Unknown Source) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:148) ... 45 more
将mybatis的日志级别调整为debug仍然没有看到sql打印,因此排除sql异常,可能是sql预处理报错了。
<logger name="org.apache.ibatis"> <level value="debug" /> </logger>
仔细排查异常,原来是如下地方有问题:
<if test="dataType == 'F'"> and INSERT_TIME > sysdate - 1 </if>
错误分析:
1、test=“datatype == ‘F’ ” 使用的OGNL表达式,而datatype的类型定义如下:
<result column="DATA_TYPE" jdbcType="CHAR" property="dataType" />
该地方想表达的含义是:如果datatype == 字符'F'的条件成立
但是呢,DB中字段的定义是char,可是,在我们使用(test=“datatype == ‘F’ ”)这个ognl表达式做判断的时候,使用的是datatype,而datatype是如何定义的呢?
private String dataType;
问题找到了:
(test=“datatype == ‘F’ ”) 这个表达式,使用了datatype 这个字符串和'F'这个字符做比较,字符和字符串比较,mybatis会做数据类型的统一转换,好了出问题了!!!
解决方案,吧'F'当做字符串对待,用双引号标示:"F"
<if test='dataType == "F"'> and INSERT_TIME > sysdate - 1 </if>
搞定!!!