Java:mysql-Date字段映射java.sql.Date日期偏差14个小时

本文探讨了Java中mysql-Date字段映射java.sql.Date时出现的13小时偏差问题,分析了时区冲突原因,并提供了两种解决方案:一是配置MySQL使用UTC+08:00时区;二是调整JDBC连接参数,指定serverTimezone为Asia/Shanghai。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java:mysql-Date字段映射java.sql.Date日期偏差13个小时,估计是时区的问题。观察到Java程序日志的时间是正常的,因此怀疑mysql的时区问题。

1)先检查mysql时区

 show variables like "%time_zone%";

返回结果

system_time_zone CST

2)什么是CST

mysql在5.7版本默认的时区为.美国中部时间 Central Standard Time (USA) UTC-06:00,跟中国的UTC+08:00正好相差14个小时。

 

解决方案:

1)配置mysql的时候,使用UTC+08:00时区(推荐)

default-zone-time='+8:00'

PS:注意,在使用其他时区前,必须参考导入其他时区配置(https://dev.mysql.com/doc/refman/5.7/en/time-zone-support.html

2)配置JDBC连接参数,serverTimezone=Asia/Shanghai

<think>好的,我现在需要解决用户在MyBatis中遇到的“Error querying database”错误,具体是“invalid comparison: java.util.Date and java.lang.String”的问题。首先,我得理解这个错误的原因。根据用户提供的引用信息,问题出在MyBatis的XML映射文件中,当日期类型的字段与空字符串进行比较时,触发了这个异常。 用户提到他们引用了多个来源,其中指出在MyBatis 3.3.0版本中存在一个bug,当时间类型的参数与空字符串''进行比较时会导致异常。比如,在SQL条件中如果有类似`<if test="createTime != null and createTime != ''">`这样的判断,就会引发错误,因为Date类型不能和字符串''进行对比。 接下来,我需要确认解决方案。根据引用中的建议,解决办法是去掉对空字符串的判断,只保留非空检查。例如,将条件改为`<if test="createTime != null">`。这样避免将Date类型与空字符串比较,从而避免异常。 另外,用户可能需要注意MyBatis的版本问题。引用3提到原工程使用3.2.8,而测试用了3.3.0,所以可能版本差异导致的问题。如果无法修改代码,可能需要回退到3.2.8版本,或者升级到更高版本,如果该bug已被修复的话。 还需要检查实体类中的日期字段是否正确使用了java.util.Date类型,以及对应的JDBC类型是否正确设置为TIMESTAMP或DATE等。此外,SQL语句中的日期比较可能需要使用数据库函数如date()来处理格式,确保两边类型一致。 总结步骤应该是:首先检查XML中的条件判断,移除与空字符串的比较;然后确认MyBatis版本,考虑是否需要升级或降级;最后检查实体类和SQL中的类型处理是否正确。</think>### MyBatis查询错误原因及解决方法 #### 一、错误原因分析 该错误直接原因是**在MyBatis的XML映射文件中,将`java.util.Date`类型参数与空字符串`''`进行对比**。例如以下代码片段: ```xml <if test="beginTime != null and beginTime != ''"> <!-- 触发异常的判断 --> AND create_time = #{beginTime} </if> ``` MyBatis 3.3.0及以上版本中,时间类型与字符串的对比会触发`IllegalArgumentException`,因为**Date类型无法直接与字符串进行逻辑比较**[^3][^4]。 --- #### 二、解决方案 ##### 步骤1:修改XML条件判断 **移除对空字符串的判断**,仅保留非空检查: ```xml <!-- 修改前(错误写法) --> <if test="beginTime != null and beginTime != ''"> <!-- 修改后(正确写法) --> <if test="beginTime != null"> ``` 此时条件仅检查参数是否为`null`,规避了类型冲突[^2]。 ##### 步骤2:检查MyBatis版本 - 若使用**MyBatis 3.3.0**,建议升级到**3.3.1+**(该问题在后续版本已修复) - 或降级到**3.2.8**(旧版本无此问题) ##### 步骤3:验证实体类字段类型 确保实体类中日期字段类型为`java.util.Date`,且JDBC类型映射正确: ```java public class Entity { private Date createTime; // 必须是Date类型 // 其他字段... } ``` XML参数传递时建议指定`jdbcType`: ```xml #{createTime, jdbcType=TIMESTAMP} ``` ##### 步骤4:避免隐式类型转换 若需格式化日期,使用数据库函数(如MySQL的`DATE()`): ```xml <if test="createTime != null"> DATE(create_time) = DATE(#{createTime,jdbcType=TIMESTAMP}) </if> ``` --- #### 三、关联问题扩展 ##### 1. 为什么空字符串判断会引发类型冲突? MyBatis在解析OGNL表达式时,空字符串`''`的类型是`String`,而参数`beginTime`是`Date`类型。二者逻辑比较会触发类型校验异常。 ##### 2. 如何安全地处理空值? - 仅用`!= null`判断非空 - 若需区分空字符串和null,改用`String`类型参数接收日期 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值