mybatis DateTypeHandler 无法将 java Date 转换为 sql TIMESTAMP
mybatis DateTypeHandler cannot convert java Date to sql TIMESTAMP
我想在 MySQL 中将日期存储为 TIMESTAMP。我发现 DateTypeHandler
似乎可以做这个转换。我把它放在我的项目中,但是失败了。
我在 "mapper.xml" 中尝试了以下两种方法,但都失败了。
<insert id="insertUser">
insert into user (user_id, password, token,
register_time, user_type, account_type) values (
#{userId},
#{password}, #{token}, #{registerTime, jdbcType=TIMESTAMP,
javaType=java.util.Date, typeHandler=org.apache.ibatis.type.DateTypeHandler},
#{userType},
#{accountType}
)
</insert>
<insert id="insertUser">
insert into user (user_id, password, token,
register_time, user_type, account_type) values (
#{userId},
#{password}, #{token}, #{registerTime, typeHandler=org.apache.ibatis.type.DateTypeHandler},
#{userType},
#{accountType}
)
</insert>
错误日志如下:
org.springframework.dao.DataIntegrityViolationException:
### Error updating database. Cause: com.mysql.jdbc.MysqlDataTruncation:
Data truncation: Incorrect datetime value: '3892-04-19 00:00:00' for column
'register_time' at row 1
### The error may involve defaultParameterMap
### The error occurred while setting parameters
### SQL: insert into user (user_id, password, token, register_time, user_type, account_type) values ( ?, ?, ?, ?, ?, ? )
### Cause: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect
datetime value: '3892-04-19 00:00:00' for column 'register_time' at row 1
; SQL []; Data truncation: Incorrect datetime value: '3892-04-19 00:00:00'
for column 'register_time' at row 1; nested exception is com.mysql.jdbc.MysqlDataTruncation: Data truncation: org.springframework.dao.DataIntegrityViolationException:
MySql TIMESTAMP 类型只能存储 '1970-01-01 00:00:01' UTC 到 '2038-01-19 03:14:07' UTC 范围内的数据值,并且您尝试在属于这种类型的 register_time 列中插入值“3892-04-19 00:00:00”。这会引发错误:
Data truncation: Incorrect datetime value: '3892-04-19 00:00:00' for column register_time' at row 1
检查这个未来日期是否正确,如果正确,将 jdbcType=TIMESTAMP,
更改为 jdbcType=DATETIME
在您的 mapper.xml 中可以解决问题。 (MySql DATETIME 类型支持的范围是 '1000-01-01 00:00:00' 到 '9999-12-31 23:59:59'。
参考文献:MySql doc
我想在 MySQL 中将日期存储为 TIMESTAMP。我发现 DateTypeHandler
似乎可以做这个转换。我把它放在我的项目中,但是失败了。
我在 "mapper.xml" 中尝试了以下两种方法,但都失败了。
<insert id="insertUser">
insert into user (user_id, password, token,
register_time, user_type, account_type) values (
#{userId},
#{password}, #{token}, #{registerTime, jdbcType=TIMESTAMP,
javaType=java.util.Date, typeHandler=org.apache.ibatis.type.DateTypeHandler},
#{userType},
#{accountType}
)
</insert>
<insert id="insertUser">
insert into user (user_id, password, token,
register_time, user_type, account_type) values (
#{userId},
#{password}, #{token}, #{registerTime, typeHandler=org.apache.ibatis.type.DateTypeHandler},
#{userType},
#{accountType}
)
</insert>
错误日志如下:
org.springframework.dao.DataIntegrityViolationException:
### Error updating database. Cause: com.mysql.jdbc.MysqlDataTruncation:
Data truncation: Incorrect datetime value: '3892-04-19 00:00:00' for column
'register_time' at row 1
### The error may involve defaultParameterMap
### The error occurred while setting parameters
### SQL: insert into user (user_id, password, token, register_time, user_type, account_type) values ( ?, ?, ?, ?, ?, ? )
### Cause: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect
datetime value: '3892-04-19 00:00:00' for column 'register_time' at row 1
; SQL []; Data truncation: Incorrect datetime value: '3892-04-19 00:00:00'
for column 'register_time' at row 1; nested exception is com.mysql.jdbc.MysqlDataTruncation: Data truncation: org.springframework.dao.DataIntegrityViolationException:
MySql TIMESTAMP 类型只能存储 '1970-01-01 00:00:01' UTC 到 '2038-01-19 03:14:07' UTC 范围内的数据值,并且您尝试在属于这种类型的 register_time 列中插入值“3892-04-19 00:00:00”。这会引发错误:
Data truncation: Incorrect datetime value: '3892-04-19 00:00:00' for column register_time' at row 1
检查这个未来日期是否正确,如果正确,将 jdbcType=TIMESTAMP,
更改为 jdbcType=DATETIME
在您的 mapper.xml 中可以解决问题。 (MySql DATETIME 类型支持的范围是 '1000-01-01 00:00:00' 到 '9999-12-31 23:59:59'。
参考文献:MySql doc