close
關注我,回復關鍵字「spring」,
免費領取Spring學習資料。

作者:Alchain奇

來源:blog.csdn.net/u011442682/article/details/79078199

為什麼使用枚舉
限定值的取值範圍,比如性別(男,女,未知)等。

枚舉類型使用陷阱

1.超級不推薦在mysql中設置某一字段類型為enum,但是存的值為數字,比如『0』,『1』,『2』;
解釋1:你會混淆,因為enum可以通過角標取值,但它的角標是從1開始,對於不熟悉這個字段的人這裡會出錯
解釋2:enum類型的字段對於0與『0』有非常大的區別,如果你是用0當角標做操作,因它沒有這個角標,所要會報錯;如果你使用『0』這個值去取枚舉值,並做插入操作,你會發現它竟然會成功,但是插入的結果是一個「空」(不是null)
解釋3:enum類型對於php等弱語言類型的支持很差,弱語言類型打引號和不打引號的值可能是同一類型,但是對於mysql中enum類型的字段來說,那就不一定是一回事了

結論:總之,不要拿mysql的enum類型取存一些數字;如果你一定要使用這個字段去存數字,請把這個字段定義為int,然後在java代碼中使用枚舉類做一個對於這個字段值範圍的一個限定!(後面有代碼)

2.你可能會報這個錯——Caused by: java.sql.SQLException: Data truncated for column 'Color' at row 1 ;
原因:

Jpa默認使用整數順序值持久化枚舉類型;

Mysql中枚舉類型Color定義取值的順序是RED、GREEN、BLUE,因此,當這三個取值持久化到數據庫表時,取值分別是0、1、2;

意思就是我們這裡存往數據庫的數據是0、1、2這樣的數字,而不是RED、GREEN、BLUE字符串,但是Mysql數據庫中定義的是RED、GREEN、BLUE,並沒有其它值所以報錯

解決:在entity中使用@Enumerated(EnumType.STRING)標註你的枚舉類型屬性,如果標註,默認是integer

使用例子

建表語句為
CREATETABLEtest4(idBIGINTUNSIGNEDPRIMARYKEYAUTO_INCREMENT,brandVARCHAR(255)NOTNULL,colorENUM('RED','GREEN','BLUE'))ENGINE=InnoDB;
Java代碼中,枚舉類
publicenumColor{RED,GREEN,BLUE}
Java代碼中,Javabean
@Entity@Table(name="test4")publicclassClothesRight{@Id@GeneratedValue(strategy=GenerationType.IDENTITY)privateLongid;@Enumerated(EnumType.STRING)privateColorcolor;privateStringbrand;publicLonggetId(){returnid;}publicvoidsetId(Longid){this.id=id;}publicStringgetBrand(){returnbrand;}publicvoidsetBrand(Stringbrand){this.brand=brand;}publicClothesRight(Longid,Colorcolor,Stringbrand){super();this.id=id;this.color=color;this.brand=brand;}publicColorgetColor(){returncolor;}publicvoidsetColor(Colorcolor){this.color=color;}publicClothesRight(){super();}}
簡單使用:
publicinterfaceTest4RightRepositoryextendsJpaRepository<ClothesRight,Long>{}
@AutowiredprivateTest4RightRepositoryt4R;/***使用@Enumrated()標註字段為枚舉的數據*結果正確插入RED*/@GetMapping(value="/addclothesright")publicvoidGetTest4Right(){List<ClothesRight>entities=newArrayList<>();ClothesRightclothes=newClothesRight();//clothes.setId(1L);clothes.setBrand("佐丹奴");clothes.setColor(Color.RED);entities.add(clothes);t4R.save(entities);}
結果為:
插入數字例子(不推薦)
建表
CREATETABLEtest5num(idBIGINTUNSIGNEDPRIMARYKEYAUTO_INCREMENT,usedint(11)DEFAULTNULLCOMMENT'0:沒用過1:已用過2:不能用')ENGINE=InnoDB;
Java代碼為:
@Entity@Table(name="test5num")publicclassTest5Num{@Id@GeneratedValue(strategy=GenerationType.IDENTITY)privateLongid;privateUsedused;publicLonggetId(){returnid;}publicvoidsetId(Longid){this.id=id;}publicUsedgetUsed(){returnused;}publicvoidsetUsed(Usedused){this.used=used;}publicTest5Num(){super();}publicTest5Num(Longid,Usedused){super();this.id=id;this.used=used;}}
/***枚舉類*/publicenumUsed{UNUSED(0,"沒用過"),USED(1,"已用過"),FORBIDDEN(2,"不能用");privateIntegercode;privateStringdiscribe;publicIntegergetCode(){returncode;}publicStringgetDiscribe(){returndiscribe;}privateUsed(Integercode,Stringdiscribe){this.code=code;this.discribe=discribe;}}
/***dao層*/publicinterfaceTest5NumRepositoryextendsJpaRepository<Test5Num,Long>{}
@AutowiredprivateTest5NumRepositoryt5N;/*** mysql枚舉的字段類型不宜插入數字,但是需求就是要用數字,怎麼辦?*解決:mysql數據類型定義為int,枚舉限定在java代碼中解決**/@GetMapping("/test5insert")publicvoidinsertT5(){Test5Numt5=newTest5Num();t5.setUsed(Used.USED);List<Test5Num>list=newArrayList<Test5Num>();list.add(t5);t5N.save(list);}
結果:


END


玩轉 SpringBoot 監控統計:SQL監控、慢SQL記錄、Spring監控、去廣告
面試:有一種數據類型,Redis 要存兩次,為什麼?
不用 Spring 居然連最基本的接口都不會寫了!
JVM 內存布局詳解,圖文並茂,寫得太好了!
聊一聊數據庫的行存與列存

關注後端面試那些事,回復【2022面經】

獲取最新大廠Java面經


最後重要提示:高質量的技術交流群,限時免費開放,今年抱團最重要。想進群的,關注SpringForAll社區,回復關鍵詞:加群,拉你進群。

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 鑽石舞台 的頭像
    鑽石舞台

    鑽石舞台

    鑽石舞台 發表在 痞客邦 留言(0) 人氣()