V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
miv
V2EX  ›  问与答

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

  •  
  •   miv · 2020-06-15 17:10:19 +08:00 · 1682 次点击
    这是一个创建于 1438 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如题,用到是 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}这个解析以后,会多一个毫秒呢? 请问一下在线的老哥,谢谢!!

    10 条回复    2020-06-16 13:52:24 +08:00
    w292614191
        1
    w292614191  
       2020-06-15 17:34:01 +08:00
    jdbcType=TIMESTAMP
    miv
        2
    miv  
    OP
       2020-06-15 17:40:29 +08:00
    @w292614191 好的,感谢,我试试。Oracle 里面 xx 的字段 updated 是 Date 类型,不知道是否可以
    miv
        3
    miv  
    OP
       2020-06-15 17:43:59 +08:00
    @w292614191 好像不行,不知道哪里的问题
    miv
        4
    miv  
    OP
       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
        5
    aragakiyuii  
       2020-06-15 18:00:55 +08:00 via iPhone
    井号放里面是什么意思?
    #{param.updated, jdbcType=TIMESTAMP}
    w292614191
        6
    w292614191  
       2020-06-16 08:47:15 +08:00
    @miv 如果你用了 MyBatis,框架都会帮你处理好这些类型问题。
    我所有项目都是这样用的。
    #{param.updated, jdbcType=TIMESTAMP}
    w292614191
        7
    w292614191  
       2020-06-16 08:47:44 +08:00
    还有,你是传入的 java.util.date 吧?
    miv
        8
    miv  
    OP
       2020-06-16 09:04:54 +08:00
    @w292614191 那奇怪了,我传入的是 java.util.data,加#{param.updated, jdbcType=TIMESTAMP},后还是会出现有毫秒的情况。
    后面我直接修改成 Map 对象,传递格式化好的 date 字符串进去了。
    miv
        9
    miv  
    OP
       2020-06-16 10:25:43 +08:00
    @w292614191 这个问题我也问了下同事,他之前遇到过,用老哥提供的方法解决,不过用 sql 打印插件打出来的 sql 也是带毫秒的,实际执行没有问题。
    dtgxx
        10
    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;
    }
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2629 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 15:18 · PVG 23:18 · LAX 08:18 · JFK 11:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.