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()));
...
}
所以說,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 |
完。
三級標題怎么是這樣。
????