关于JDBC查询Timestamp值比中国时区慢了11或13小时的问题记录

问题背景

今天在写测试用例的时候发现JdbcTemplate查询出来的时间和预期时间相比相差11小时。于是猜想这肯定是服务器时区问题。然后,我在url上加了serverTimeZone参数,设置为上海时间,问题就好了。但是,这样的问题在于公司项目其他地方的url也要都加上该参数,一个个修改就很麻烦。

解决方案

去设置mysql数据库的时区即可
首先,show global variables like ‘%time_zone%’;查询mysql数据库的时区,我的结果如下:在这里插入图片描述
发现time_zone是SYSTEM。
此时,就应该设置时区:

set global variables time_zone='+8:00';

问题分析-为什么会相差11小时呢?

查看JDBC源码即可。
首先,JDBC是使用resultSet.getTimeStamp方法获取类型为日期时间的字段的值,代码如下:

    @Override
    public Timestamp getTimestamp(int columnIndex) throws SQLException 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是的,LocalDateTime可以用来查询数据库的timestamp。在MySQL中,timestamp类型存储的是标准时间,而LocalDateTime是Java 8引入的类,表示没有时区概念的日期和时间。要将LocalDateTime转换为timestamp,您可以使用JDBC或者ORM框架如MyBatis来执行转换。 在JDBC中,您可以使用PreparedStatement的setTimestamp方法将LocalDateTime对象转换为timestamp类型并将其作为参数传递给SQL查询。例如: ```java LocalDateTime localDateTime = LocalDateTime.now(); Timestamp timestamp = Timestamp.valueOf(localDateTime); PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM your_table WHERE timestamp_column = ?"); preparedStatement.setTimestamp(1, timestamp); ResultSet resultSet = preparedStatement.executeQuery(); ``` 使用ORM框架如MyBatis时,您可以使用TypeHandler来处理LocalDateTime和timestamp之间的转换。在myBatis 3.4.5之前的版本中,您需要添加mybatis-typehandlers-jsr310依赖并配置相应的TypeHandler。从myBatis 3.4.5开始,myBatis已经内置了对LocalDateTime和timestamp的支持,您无需再引入依赖。 ```xml <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.5</version> </dependency> ``` 在myBatis的配置文件中,您可以使用typeHandlers节点配置TypeHandler。例如: ```xml <typeHandlers> <typeHandler handler="org.apache.ibatis.type.LocalDateTimeTypeHandler"/> </typeHandlers> ``` 然后,在您的SQL映射文件中,您可以直接将LocalDateTime对象作为参数传递给查询语句的参数。例如: ```xml <select id="selectByTimestamp" resultType="yourResultType"> SELECT * FROM your_table WHERE timestamp_column = #{timestamp} </select> ``` 这样,您就可以使用LocalDateTime来查询数据库的timestamp类型了。请注意,确保数据库中的timestamp列的数据类型与Java代码中的类型一致。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值