DruidPooledResultSet这个类的getObject方法 public T getObject(String columnLabel, Class type) throws SQLException { throw new SQLFeatureNotSupportedException(); } mybatis中的LocalDateTimeTypeHandler调用getNullableResult public LocalDateTime getNullableResult(ResultSet rs, int columnIndex) throws SQLException { return (LocalDateTime)rs.getObject(columnIndex, LocalDateTime.class); }
原提问者GitHub用户wangzhedong
MyBatis 3.5.1版本映射LocalDateTime类型会报SQLFeatureNotSupportedException是已知的问题。
具体原因是:
MyBatis 3.5.1支持Java 8的日期时间API,包括LocalDateTime。
但是在生成SQL语句时,只支持java.sql.Date和java.util.Date。
并没有对LocalDateTime进行特殊处理。
因此在使用LocalDateTime映射结果集时,会报不支持的特性异常。
解决这个问题的方式有以下几种:
升级MyBatis到3.5.2或更高版本
从3.5.2版本开始,MyBatis增加了对LocalDateTime的支持,修复了这个bug。
自定义TypeHandler处理LocalDateTime
在3.5.1版本中,可以自定义TypeHandler来处理LocalDateTime。
使用java.sql.Timestamp作为映射类型
将LocalDateTime转换为Timestamp,然后再进行映射。
修改Mybatis源码添加LocalDateTime支持
对3.5.1版本的源码进行修改,增加对LocalDateTime的特殊处理。
根据您提供的代码和描述,看起来问题出在MyBatis 3.51版本的LocalDateTimeTypeHandler
中的getNullableResult
方法上。当调用rs.getObject(columnIndex, LocalDateTime.class)
时,它会调用DruidPooledResultSet
的getObject
方法。然而,在该版本的DruidPooledResultSet
中,getObject
方法抛出了SQLFeatureNotSupportedException
异常。
这个异常表示当前数据库不支持通过getObject
方法获取LocalDateTime
类型的值。这可能是因为数据库驱动程序或数据库本身不支持将LocalDateTime
直接映射到数据库的特定列类型。
要解决这个问题,有几种方法可以尝试:
更新MyBatis版本:尝试升级到更高版本的MyBatis,以查看是否已经修复了此问题。
使用其他类型处理器:尝试使用其他类型处理器来处理LocalDateTime
类型。例如,可以自定义一个类型处理器来将LocalDateTime
转换为数据库支持的类型(如java.sql.Timestamp
)。
修改数据库表结构:如果可能的话,修改数据库表结构以使用与LocalDateTime
兼容的数据类型。
手动处理结果集:在查询结果中获取原始的日期时间值,然后在Java代码中手动转换为LocalDateTime
对象。可以通过使用rs.getTimestamp(columnIndex)
方法获取日期时间值,并使用Timestamp.toLocalDateTime()
方法进行转换。
以上是一些可能的解决方案,具体要根据您的情况和需求来选择适合的方法。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。