MyBatis數(shù)據(jù)類型映射

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

MySQL數(shù)據(jù)庫(kù)類型設(shè)計(jì):

  1. 整型:integer -> int
  2. 長(zhǎng)整型:bigint -> long
  3. 布爾型:unsigned tinyint -> boolean,阿里巴巴Java開(kāi)發(fā)手冊(cè)建議使用unsigned tinyint表示布爾值结序,1表示是望蜡,0表示否瑟幕。
  4. 單字符:char(1) -> java.lang.String
  5. 字符串:varchar -> java.lang.String糯累,阿里巴巴Java開(kāi)發(fā)手冊(cè)建議不要超過(guò)5000字節(jié)峦树,超長(zhǎng)字段的類型使用text扰她。
  6. 長(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增多麸折,影響性能锡凝。
  7. 時(shí)間:datetime -> java.lang.String / java.util.Date
  8. JSON文本:JSON -> java.lang.String
  9. 二進(jìn)制塊:blob,實(shí)際開(kāi)發(fā)中不建議使用blob垢啼,因其會(huì)導(dǎo)致磁盤(pán)IO增多窜锯,影響性能。
  10. 非精確浮點(diǎn)數(shù)值:double -> double(Java)芭析,注意MySQL的double锚扎、float等只能用于非精確浮點(diǎn)數(shù)值的情景,某些價(jià)值不高的浮點(diǎn)數(shù)據(jù)可以考慮使用該類型存儲(chǔ)放刨。
  11. 精確浮點(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,禁止使用doublefloat等迹栓,這個(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)換。

  1. 兩者的存儲(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ù)字段為datedatetime, 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>
  1. 我的表中的字段應(yīng)該指定為什么類型
  2. 我的Java實(shí)體類中的對(duì)應(yīng)屬性應(yīng)該指定為什么類型
  3. MyBatis Mapper XML中如何指定類型轉(zhuǎn)換
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市挡育,隨后出現(xiàn)的幾起案子巴碗,更是在濱河造成了極大的恐慌,老刑警劉巖即寒,帶你破解...
    沈念sama閱讀 211,348評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件橡淆,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡母赵,警方通過(guò)查閱死者的電腦和手機(jī)逸爵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)市咽,“玉大人痊银,你說(shuō)我怎么就攤上這事抵蚊∈┮铮” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,936評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵贞绳,是天一觀的道長(zhǎng)谷醉。 經(jīng)常有香客問(wèn)我,道長(zhǎng)冈闭,這世上最難降的妖魔是什么俱尼? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,427評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮萎攒,結(jié)果婚禮上遇八,老公的妹妹穿的比我還像新娘矛绘。我一直安慰自己,他們只是感情好刃永,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,467評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布货矮。 她就那樣靜靜地躺著,像睡著了一般斯够。 火紅的嫁衣襯著肌膚如雪囚玫。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,785評(píng)論 1 290
  • 那天读规,我揣著相機(jī)與錄音抓督,去河邊找鬼。 笑死束亏,一個(gè)胖子當(dāng)著我的面吹牛铃在,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播碍遍,決...
    沈念sama閱讀 38,931評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼涌穆,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了雀久?” 一聲冷哼從身側(cè)響起宿稀,我...
    開(kāi)封第一講書(shū)人閱讀 37,696評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎赖捌,沒(méi)想到半個(gè)月后祝沸,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,141評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡越庇,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,483評(píng)論 2 327
  • 正文 我和宋清朗相戀三年罩锐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片卤唉。...
    茶點(diǎn)故事閱讀 38,625評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡涩惑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出桑驱,到底是詐尸還是另有隱情竭恬,我是刑警寧澤,帶...
    沈念sama閱讀 34,291評(píng)論 4 329
  • 正文 年R本政府宣布熬的,位于F島的核電站痊硕,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏押框。R本人自食惡果不足惜岔绸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,892評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧盒揉,春花似錦晋被、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至扁掸,卻和暖如春翘县,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背谴分。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工锈麸, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人牺蹄。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓忘伞,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親沙兰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子氓奈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,492評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容