我用druid + slf4j + mybatis 进行sql打印。 因为我用的日期属性是LocalDateTime类型,然后sql打印出来的参数是 null,
我跟踪到PreparedStatementProxyImpl类中的private void setObjectParameter(int parameterIndex, Object x)函数, 才发现这里不支持LocalDateTime类型,这样到最后只能调用 setParameter(parameterIndex, createParameter(Types.OTHER, null))
所以打印出来的参数就变为 null
希望可以改进支持LocalDateTime,或者提供一个配置接口解决。
原提问者GitHub用户lqzxpp
您遇到的问题是由于 Druid 的 PreparedStatementProxyImpl 类不支持 LocalDateTime 类型,在处理参数时会将其转化为 null。为了解决这个问题,您可以考虑使用 mybatis-plus,它对 LocalDateTime 类型的支持更为友好,可以直接将 LocalDateTime 类型的参数转化为对应的 SQL 类型。
如果您已经在使用 MyBatis,也可以通过自定义 TypeHandler 的方式来处理 LocalDateTime 类型。您可以创建一个实现了 org.apache.ibatis.type.TypeHandler 接口的 LocalDateTimeTypeHandler 类,将 LocalDateTime 类型转化为对应的 SQL 类型。然后在 MyBatis 的配置文件中将该 TypeHandler 注册到 LocalDateTime 类型上即可。
自定义类型处理器(Type Handler):你可以编写一个自定义的MyBatis类型处理器,将LocalDateTime类型映射到数据库支持的类型(如TIMESTAMP)。通过自定义类型处理器,你可以在执行SQL语句时正确地将LocalDateTime参数转换为数据库支持的类型,从而避免参数显示为null。你可以参考MyBatis文档中关于类型处理器的说明,了解如何编写和配置自定义类型处理器。
修改Druid源码:你可以尝试修改Druid连接池的源码,以支持LocalDateTime类型的参数设置。在PreparedStatementProxyImpl类中,你可以添加对LocalDateTime类型的处理逻辑,将其转换为合适的数据库类型(如TIMESTAMP)并设置参数。但请注意,修改第三方库的源码可能会导致一些潜在的问题,例如与未来版本的兼容性或其他功能的影响。在修改源码之前,请确保了解相关风险并备份你的代码。
问题已修复,请用新版本
https://github.com/alibaba/druid/releases/tag/1.2.5
原回答者GitHub用户wenshao
我用druid + slf4j + mybatis 进行sql打印。 因为我用的日期属性是LocalDateTime类型,然后sql打印出来的参数是 null,
我跟踪到PreparedStatementProxyImpl类中的private void setObjectParameter(int parameterIndex, Object x)函数, 才发现这里不支持LocalDateTime类型,这样到最后只能调用 setParameter(parameterIndex, createParameter(Types.OTHER, null))
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。