• Mysql的时间类型问题


    时间类型有time, date, datetime, timestamp
    如Mysql官方文档所述:

    time 没有date,date没有time,datetime是date和time的集合,
    而timestamp也是如此。

    MySQL retrieves and displays DATETIME values in ‘YYYY-MM-DD HH:MM:SS’ format. The supported range is ‘1000-01-01 00:00:00’ to ‘9999-12-31 23:59:59’.
    Datetime范围大一些。

    TIMESTAMP has a range of ‘1970-01-01 00:00:01’ UTC to ‘2038-01-19 03:14:07’ UTC.
    范围小一些,所以不推荐使用TIMESTAMP,如果你确定你的代码不能用到2038年。

    共同点

    A DATETIME or TIMESTAMP value can include a trailing fractional seconds part in up to microseconds (6 digits) precision
    后面支持带微秒。

    the format for these values is ‘YYYY-MM-DD HH:MM:SS[.fraction]’, the range for DATETIME values is ‘1000-01-01 00:00:00.000000’ to ‘9999-12-31 23:59:59.999999’, and the range for TIMESTAMP values is ‘1970-01-01 00:00:01.000000’ to ‘2038-01-19 03:14:07.999999’.
    区别

    MySQL converts TIMESTAMP values from the current time zone to UTC for storage, and back from UTC to the current time zone for retrieval. (This does not occur for other types such as DATETIME.)
    Mysql会自动把当前时区的时间以UTC时间存储,取出又会自动转成当地时区。而Datetime没有经历这些内容。

    mybatis

    好奇Mybatis在查询 ResultType=“HashMap”的时候,如何处理DateTime的类型。。

    问题:Mybatis如何处理Mysql的Datetime类型

    查了一下Mybatis源码:

    TypeHandlerRegistry(){
    ...
    this.register((Class)Date.class, (TypeHandler)(new DateTypeHandler()));
    this.register((Class)Date.class, JdbcType.DATE, (TypeHandler)(new DateOnlyTypeHandler()));
    this.register((Class)Date.class, JdbcType.TIME, (TypeHandler)(new TimeOnlyTypeHandler()));
    this.register((JdbcType)JdbcType.TIMESTAMP, (TypeHandler)(new DateTypeHandler()));
    this.register((JdbcType)JdbcType.DATE, (TypeHandler)(new DateOnlyTypeHandler()));
    this.register((JdbcType)JdbcType.TIME, (TypeHandler)(new TimeOnlyTypeHandler()));
    this.register((Class)java.sql.Date.class, (TypeHandler)(new SqlDateTypeHandler()));
    this.register((Class)Time.class, (TypeHandler)(new SqlTimeTypeHandler()));
    this.register((Class)Timestamp.class, (TypeHandler)(new SqlTimestampTypeHandler()));
    ...
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    所以说,DateTime应被SqlDateTypeHandler转换成java.util.Date才对。
    然而并不是,我的程序返回了HashMap<String,Object>,其中DateTime类型的数据被处理成 java.sql.TimeStamp。

    这不科学

    于是想了想,Mybatis没必要这么处理,Object,他又不知道Object是什么类型,所以应该调用的是 ResultSet的getObject方法才对,因为这样简单粗暴,最终是要用Object存储的,不必转换。

    去查了JDBC官方文档,这是符合事实的。疑惑顿时解开。

    MySQL Type Name Return value of GetColumnClassName Returned as Java Class
    DATETIME DATETIME java.sql.Timestamp
    DATE DATE java.sql.Date
    TIMESTAMP[(M)] TIMESTAMP java.sql.Timestamp
    TIME TIME java.sql.Time
    完。

    三级标题怎么是这样。

    ????
    ---------------------
    作者:SaneFuture
    来源:CSDN
    原文:https://blog.csdn.net/cor_twi/article/details/53411687
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    拓扑排序笔记
    Codeforces Round #683 (Div. 2, by Meet IT)(A->C)(构造,思维,贪心)
    Acwing 846. 树的重心(DFS枚举删除每一个点)
    Acwing 125. 耍杂技的牛(贪心)(从局部到全局)
    Acwing 802. 区间和(下标离散化+vector+二分)
    Acwing 799. 最长连续不重复子序列(双指针)
    Acwing 139. 回文子串的最大长度(前缀+后缀处理+哈希+二分)
    Linux shell 变量$#,$@,$0....的含义
    一双不锈钢筷子 的测试用例?
    OSI模型 TCP/IP模型 再整理
  • 原文地址:https://www.cnblogs.com/lykbk/p/34343434343GHDFGERGRGRG.html
Copyright © 2020-2023  润新知