Java 里面 Date 属性传值到 Mybatis 的格式化问题

2020-06-15 17:10:19 +08:00
 miv

如题,用到是 Oracle 数据库。 更新数据的是或发现 SQL 执行失败了,排查了一下发现问题是出现在 Date 上。


class Dto{
	private Date updated;
}

mybatis 的 xml 是下面这样的,param 是一个 dto 对象

update xx set xx.updated = {#param.updated} where ....

发现真实执行的 SQL 如下

update xx set xx.updated = '2018-08-30 00:00:00.0' where ....

oracle 报错:ORA-01861,文字与格式字符串不匹配。 我打算是想用 to_date 方法,格式化一下,不过为什么{#param.updated}这个解析以后,会多一个毫秒呢? 请问一下在线的老哥,谢谢!!

1690 次点击
所在节点    问与答
10 条回复
w292614191
2020-06-15 17:34:01 +08:00
jdbcType=TIMESTAMP
miv
2020-06-15 17:40:29 +08:00
@w292614191 好的,感谢,我试试。Oracle 里面 xx 的字段 updated 是 Date 类型,不知道是否可以
miv
2020-06-15 17:43:59 +08:00
@w292614191 好像不行,不知道哪里的问题
miv
2020-06-15 17:55:58 +08:00
select cast(to_timestamp('2019-04-03 10:10:10.10', 'syyyy-mm-dd hh24:mi:ss.ff') as date) timestamp_to_date from dual;

找到一个方法,用上面的方法转成 SQL 的 Date,不过改动起来麻烦,求更好、方便的方法。
aragakiyuii
2020-06-15 18:00:55 +08:00
井号放里面是什么意思?
#{param.updated, jdbcType=TIMESTAMP}
w292614191
2020-06-16 08:47:15 +08:00
@miv 如果你用了 MyBatis,框架都会帮你处理好这些类型问题。
我所有项目都是这样用的。
#{param.updated, jdbcType=TIMESTAMP}
w292614191
2020-06-16 08:47:44 +08:00
还有,你是传入的 java.util.date 吧?
miv
2020-06-16 09:04:54 +08:00
@w292614191 那奇怪了,我传入的是 java.util.data,加#{param.updated, jdbcType=TIMESTAMP},后还是会出现有毫秒的情况。
后面我直接修改成 Map 对象,传递格式化好的 date 字符串进去了。
miv
2020-06-16 10:25:43 +08:00
@w292614191 这个问题我也问了下同事,他之前遇到过,用老哥提供的方法解决,不过用 sql 打印插件打出来的 sql 也是带毫秒的,实际执行没有问题。
dtgxx
2020-06-16 13:52:24 +08:00
自定义一个 Config 类 实现 WebMvcConfigurer
然后在里面声明一个 Bean
/**
* 时间格式转换器,将 Date 类型统一转换为 yyyy-MM-dd HH:mm:ss 格式的字符串
*/
@Bean
public MappingJackson2HttpMessageConverter jackson2HttpMessageConverter() {
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
ObjectMapper mapper = new ObjectMapper();

//日期格式转换
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));

converter.setObjectMapper(mapper);
return converter;
}

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/681751

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX