MyBatis和Druid查询属性LocalDateTime报错

时光毁灭记忆、已成空白 提交于 2020-03-02 01:24:13

问题

技术栈版本号:

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()。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!