MyBatis JdbcType | MySQL | Oracle | Java類型 |
---|---|---|---|
ARRAY | java.sql.Array | ||
BIGINT | bigint | long / java.lang.Long | |
BINARY | byte[] | ||
BIT | bit | boolean / java.lang.Boolean | |
BLOB | blob | BLOB | byte[] / java.sql.Blob |
BOOLEAN | boolean | ||
CHAR | char | CHAR | java.lang.String |
CLOB | text | CLOB | java.lang.String / java.sql.Clob |
CURSOR | |||
DATALINK | |||
DATE | date | DATE | java.util.Date / java.sql.Date |
DATETIMEOFFSET | |||
DECIMAL | decimal | DECIMAL | java.math.BigDecimal |
DISTINCT | |||
DOUBLE | double | NUMBER | double / java.lang.Double |
FLOAT | float | FLOAT | float / java.lang.Float |
INTEGER | integer(縮寫(xiě)int) | INTEGER | int / java.lang.Integer |
JAVA_OBJECT | |||
LONGNVARCHAR | LONG VARCHAR | java.lang.String | |
LONGVARBINARY | byte[] | ||
LONGVARCHAR | |||
NCHAR | NCHAR | ||
NCLOB | NCLOB | ||
NULL | |||
NUMERIC | numeric | NUMERIC / NUMBER | java.math.BigDecimal |
NVARCHAR | |||
OTHER | |||
REAL | real | REAL | float |
REF | java.sql.Ref | ||
ROWID | |||
SMALLINT | smallint | SMALLINT | short / java.lang.Short |
SQLXML | |||
STRUCT | java.sql.Struct | ||
TIME | time | java.util.Date / java.sql.Time | |
TIME_WITH_TIMEZONE | java.sql.Timestamp | ||
TIMESTAMP | datetime / timestamp | TIMESTAMP | java.util.Date / java.sql.Timestamp |
TIMESTAMP_WITH_TIMEZONE | java.sql.Timestamp | ||
TINYINT | tinyint | byte / java.lang.Byte | |
UNDEFINED | |||
VARBINARY | byte[] | ||
VARCHAR | varchar | VARCHAR2 | java.lang.String |
- MyBatis 版本:3.5.7
- JdbcType枚舉型
org.apache.ibatis.type.JdbcType
- MyBatis API參考:https://mybatis.org/mybatis-3//apidocs/org/apache/ibatis/type/JdbcType.html
MySQL數(shù)據(jù)庫(kù)類型設(shè)計(jì):
- 整型:
integer
->int
- 長(zhǎng)整型:
bigint
->long
- 布爾型:
unsigned tinyint
->boolean
,阿里巴巴Java開(kāi)發(fā)手冊(cè)建議使用unsigned tinyint
表示布爾值结序,1
表示是望蜡,0
表示否瑟幕。 - 單字符:
char(1)
->java.lang.String
- 字符串:
varchar
->java.lang.String
糯累,阿里巴巴Java開(kāi)發(fā)手冊(cè)建議不要超過(guò)5000字節(jié)峦树,超長(zhǎng)字段的類型使用text
扰她。 - 長(zhǎng)文本:
text
芽突,阿里巴巴Java開(kāi)發(fā)手冊(cè)建議text
類型抽取到獨(dú)立的表中,通過(guò)主鍵來(lái)進(jìn)行關(guān)聯(lián)队他,避免影響其他字段索引效率卷仑。實(shí)際開(kāi)發(fā)中不建議使用text
,因其會(huì)導(dǎo)致磁盤(pán)IO增多麸折,影響性能锡凝。 - 時(shí)間:
datetime
->java.lang.String
/java.util.Date
- JSON文本:
JSON
->java.lang.String
- 二進(jìn)制塊:
blob
,實(shí)際開(kāi)發(fā)中不建議使用blob
垢啼,因其會(huì)導(dǎo)致磁盤(pán)IO增多窜锯,影響性能。 - 非精確浮點(diǎn)數(shù)值:
double
->double
(Java)芭析,注意MySQL的double
锚扎、float
等只能用于非精確浮點(diǎn)數(shù)值的情景,某些價(jià)值不高的浮點(diǎn)數(shù)據(jù)可以考慮使用該類型存儲(chǔ)放刨。 - 精確浮點(diǎn)數(shù)值:
decimal
/numeric
->java.math.BigDecimal
工秩,decimal
為定點(diǎn)數(shù)尸饺,存儲(chǔ)的是精確值进统,金融金額相關(guān)的數(shù)值,必須使用java.math.BigDecimal
進(jìn)行計(jì)算浪听,使用decimal
進(jìn)行存儲(chǔ)螟碎。阿里巴巴Java技術(shù)手冊(cè)更是要求MySQL中的浮點(diǎn)類型全部使用decimal
,禁止使用double
和float
等迹栓,這個(gè)還是要酌情考慮掉分,有的浮點(diǎn)數(shù)值實(shí)際應(yīng)用中可能并沒(méi)有那么高的精確度要求。
MySQL timestamp和datetime區(qū)別
實(shí)際開(kāi)發(fā)時(shí)通常推薦使用datetime
而不是timestamp
克伊,因?yàn)楹笳叩姆秶^小酥郭,且存在時(shí)區(qū)轉(zhuǎn)換。
- 兩者的存儲(chǔ)方式不一樣
timestamp
:把客戶端插入的時(shí)間從當(dāng)前時(shí)區(qū)轉(zhuǎn)化為UTC(世界標(biāo)準(zhǔn)時(shí)間)進(jìn)行存儲(chǔ)愿吹。查詢時(shí)不从,將其又轉(zhuǎn)化為客戶端當(dāng)前時(shí)區(qū)進(jìn)行返回。
datetime
:不做任何改變犁跪,基本上是原樣輸入和輸出
2椿息、兩者所能存儲(chǔ)的時(shí)間范圍不一樣
timestamp
存儲(chǔ)的時(shí)間范圍為:'1970-01-01 00:00:01.000000' 到 '2038-01-19 03:14:07.999999'歹袁。
datetime
存儲(chǔ)的時(shí)間范圍為:'1000-01-01 00:00:00.000000' 到 '9999-12-31 23:59:59.999999'。
3寝优、timestamp
支持default current_timestamp
來(lái)設(shè)置默認(rèn)自動(dòng)當(dāng)前時(shí)間
4条舔、timestamp
支持on update current_timestamp
來(lái)設(shè)置更新時(shí)自動(dòng)當(dāng)前時(shí)間
5、timestamp
時(shí)區(qū)相關(guān)乏矾,存儲(chǔ)時(shí)以UTC時(shí)間保持孟抗,查詢時(shí)轉(zhuǎn)換為當(dāng)前時(shí)區(qū),即如果在東8區(qū)的08:00:00分保存的數(shù)據(jù)钻心,在東9區(qū)看到的是09:00:00夸浅,datetime與時(shí)區(qū)無(wú)關(guān)
6、timestamp
4個(gè)字節(jié)存儲(chǔ)(實(shí)際上就是int)扔役,datetime 8個(gè)字節(jié)
7帆喇、如果timestamp
的值超出范圍,MySQL不會(huì)報(bào)錯(cuò)
8亿胸、如果是自動(dòng)更新模式坯钦,手動(dòng)修改數(shù)據(jù)導(dǎo)致timestamp
字段更新
9、同時(shí)有兩個(gè)timestamp
字段默認(rèn)值為current_timestamp
會(huì)報(bào)錯(cuò)
使用MyBatis開(kāi)發(fā)時(shí)間相關(guān)
Java中有兩個(gè)Date類侈玄,一個(gè)是java.util.Date
婉刀,通常情況下用它獲取當(dāng)前時(shí)間,另一個(gè)是java.sql.Date
序仙,是針對(duì)SQL語(yǔ)句使用的突颊,它只包含日期而沒(méi)有時(shí)間部分。
我們平時(shí)用的是java.util.Date
潘悼,一般不使用java.sql.Date
律秃,只要明白它僅僅用于MyBatis框架的jdbcType=DATE
即可。阿里巴巴的Java開(kāi)發(fā)手冊(cè)更是禁止在程序的任何地方使用java.sql.Date
治唤、java.sql.Time
棒动、java.sql.Timestamp
!
使用java.util.Date
作為參數(shù)傳遞給Mapper時(shí)宾添,不管MySQL的日期字段類型是date
船惨、datetime
或者timestamp
中的哪一種,默認(rèn)缺省情況下缕陕,MyBatis都能夠自動(dòng)做出類型轉(zhuǎn)換粱锐,可以直接使用 =、>扛邑、<怜浅、>=、<=符號(hào)來(lái)進(jìn)行篩選鹿榜。
但是海雪,當(dāng)我們手動(dòng)指定jdbcType=DATE
的時(shí)候锦爵,MyBatis會(huì)自動(dòng)截取掉時(shí)間,只保留日期奥裸。如果MySQL的日期字段類型是datetime
或者timestamp
一定不要這么寫(xiě)险掀,否則會(huì)導(dǎo)致時(shí)間信息丟失,只剩余日期信息湾宙。
總之樟氢,在連接MySQL數(shù)據(jù)庫(kù)的時(shí)候,當(dāng)指定jdbcType=DATE
類型時(shí)侠鳄,返回的時(shí)間只有年月日(yyyy-MM-dd)的日期埠啃,當(dāng)jdbcType=TIMESTAMP
的時(shí)候,返回的時(shí)間是年月日和時(shí)分秒(yyyy-MM-dd HH:mm:ss)伟恶。
如果要存儲(chǔ)日期碴开,
只存儲(chǔ)日期:Java實(shí)體屬性
java.util.Date
, MySQL數(shù)據(jù)庫(kù)字段為date
或datetime
, MyBatis的Mapper XML中可以設(shè)置jdbcType=DATE
。存儲(chǔ)日期時(shí)間:Java實(shí)體屬性
java.util.Date
, MySQL數(shù)據(jù)庫(kù)字段為datetime
, MyBatis的Mapper XML中的jdbcType=TIMESTAMP
博秫,一定不要設(shè)置jdbcType=DATE
潦牛。
示例:
<resultMap id="xxx" type="xxx.yyy.zzz.Entity">
<result
property="timeUpate"
column="time_update"
javaType="java.util.Date"
jdbcType="TIMESTAMP" />
</resultMap>
- 我的表中的字段應(yīng)該指定為什么類型
- 我的Java實(shí)體類中的對(duì)應(yīng)屬性應(yīng)該指定為什么類型
- MyBatis Mapper XML中如何指定類型轉(zhuǎn)換