问题
技术栈版本号:
mybatis:3.5.1
druid:1.1.12
JDK:1.8
产生原因
对象的属性使用新的日期函数定义。JDK8之前的Date似乎被隔离了,JDK8新的时间日期API,开始一个新的纪元,谁用谁知道。
class AccountTbl {
var id: Int? = null
var userId: String? = null
var money: Int? = null
var tranDate: LocalDateTime? = null
}
问题解决
程序跑出的异常为SQLFeatureNotSupportedException,异常是druid,90%应该是druid的问题。分析项目涉及ORM框架的版本号druid1.1.12,mybatis3.5.1。
渐入渐出了下代码的执行流程。
ResultSetHandler是Mybatis的核心组件,主要负责将结果集resultSets转化成结果列表(或cursor)和处理储存过程的输出。
DefaultResultSetHandler是Myabtis为ResultSetHandler提供的唯一一个实现类,最终的流程都会走到getPropertyMappingValue,进行实体属性和JavaBean属性的映射。
TypeHandler是MyBatis中的类型转换器,用于Java对象和JDBC的相互转换。MyBatis使用PrepareStatement来进行参数设置的时候,需要通过TypeHandler将传入的java参数设置成合适的jdbc类型参数,这个过程实际上是通过调用PrepareStatement不同的setParameter方法实现的;在获取结果返回之后,也需要将返回的结果转换成我们需要的java类型,这时候是通过调用ResultSet对象不同类型的getResult方法;所以不同类型的typeHandler其实就是调用PrepareStatement和ResultSet的不同方法来进行类型的转换,有些时候会在调用PrepareStatement和ResultSet的相关方法之前,可以对传入的参数进行一定的处理。当我们没有指定typeHandler的时候mybatis会根据传入参数的类型和返回值的类型调用默认的typeHandler进行处理。对于一个typeHandler需要配置java类型(javaType)和JDBC类型(jdbcType),typeHandler的作用就是实现这两种类型的转换,在传入的参数为指定的Java类型时,将其转换为指定的JDBC类型,当返回值为指定JDBC类型时将其转换为配置的Java类型。
mybatis默认定义的TypeHandler:
LocalDateTimeTypeHandler是mybatis实现的LocalDateTime与mysql日期类型的交互。
导致的罪魁祸首是低版本的druid的DruidPooledResultSet居然没有具体实现,而仅仅只是throw new SQLFeatureNotSupportedException()。
来源:oschina
链接:https://my.oschina.net/29232258/blog/3183068