欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Springboot JPA 枚舉Enum類(lèi)型存入到數(shù)據(jù)庫(kù)的操作

 更新時(shí)間:2021年01月29日 17:00:15   作者:miskss  
這篇文章主要介紹了Springboot JPA 枚舉Enum類(lèi)型存入到數(shù)據(jù)庫(kù)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

1、使用JPA 的@Enumerated 注解 ,可以直接將Enum映射到數(shù)據(jù)庫(kù)中。

但是value的值只有兩種方式選擇,一種是使用枚舉的序號(hào)映射,一種是枚舉的名稱(chēng)來(lái)映射。

public enum EnumType {
 /** Persist enumerated type property or field as an integer. */
 ORDINAL,
 /** Persist enumerated type property or field as a string. */
 STRING
}

如果想存入枚舉中的自定義的值,則需要實(shí)現(xiàn)AttributeConverter接口

2、實(shí)現(xiàn)AttributeConverter接口方式

/**
 * @param <DB> : 保存到數(shù)據(jù)庫(kù)的數(shù)據(jù)類(lèi)型
 * @author peter
 * date: 2019-05-15 16:57
 **/
public interface PersistEnum2DB<DB> {
 DB getData();
}
import javax.persistence.AttributeConverter;
/**
 * @param <ATTR> 實(shí)體類(lèi)中枚舉的類(lèi)型,需實(shí)現(xiàn){@link PersistEnum2DB} 接口
 * @param <DB> 保存到數(shù)據(jù)庫(kù)的數(shù)據(jù)類(lèi)型
 * @author peter
 * date: 2019-05-15 16:59
 */
public abstract class AbstractEnumConverter<ATTR extends Enum<ATTR> & PersistEnum2DB<DB>, DB> implements AttributeConverter<ATTR, DB> {
 private final Class<ATTR> clazz;
 public AbstractEnumConverter(Class<ATTR> clazz) {
 this.clazz = clazz;
 }
 @Override
 public DB convertToDatabaseColumn(ATTR attribute) {
 return attribute != null ? attribute.getData() : null;
 }
 @Override
 public ATTR convertToEntityAttribute(DB dbData) {
 if (dbData == null) return null;
 ATTR[] enums = clazz.getEnumConstants();
 for (ATTR e : enums) {
  if (e.getData().equals(dbData)) {
  return e;
  }
 }
 throw new UnsupportedOperationException("枚舉轉(zhuǎn)化異常。枚舉【" + clazz.getSimpleName() + "】,數(shù)據(jù)庫(kù)庫(kù)中的值為:【" + dbData + "】");
 }
}

使用方式

import com.tourcoo.parking.enums.convert2db.AbstractEnumConverter;
import com.tourcoo.parking.enums.convert2db.PersistEnum2DB;
/**
 * @author peter
 * create: 2019-05-15 14:33
 **/
public enum PayStatus implements PersistEnum2DB<Integer> {
 NONPAY(0, "未支付"),
 PAID(1, "已支付");
 private int code;
 private String msg;
 PayStatus(int code, String msg) {
 this.code = code;
 this.msg = msg;
 }
 public int getCode() {
 return code;
 }
 public String getMsg() {
 return msg;
 }
 @Override
 public Integer getData() {
 return code;
 }
 public static class Converter extends AbstractEnumConverter<PayStatus, Integer> {
 public Converter() {
  super(PayStatus.class);
 }
 }
}
 //支付狀態(tài)
 @Convert(converter = PayStatus.Converter.class)
 private PayStatus payStatus;

補(bǔ)充: SpringBoot | Jpa 將Java枚舉映射為基本值類(lèi)型

解決方法之一:

使用實(shí)體屬性類(lèi)型轉(zhuǎn)換器AttributeConverter

場(chǎng)景假設(shè):

在代碼中使用枚舉類(lèi)來(lái)映射用戶(hù)性別(如下代碼所示),在數(shù)據(jù)庫(kù)中使用字符映射性別(M ,F(xiàn)),Hibernate提供了AttributeConverter解決上述場(chǎng)景的轉(zhuǎn)換問(wèn)題

public enum Gender {
 
 MALE( 'M' ),
 FEMALE( 'F' );
 
 private final char code; 
 Gender(char code) {
 this.code = code;
 }
 
 public static Gender fromCode(char code) {
 if ( code == 'M' || code == 'm' ) {
  return MALE;
 }
 if ( code == 'F' || code == 'f' ) {
  return FEMALE;
 }
 throw new UnsupportedOperationException(
  "The code " + code + " is not supported!"
 );
 }
 
 public char getCode() {
 return code;
 }
}

User實(shí)體類(lèi)定義如下,重點(diǎn)在 @Convert(converter = GenderConverter.class)注釋

@Entity
@Data
@ToString
@Table(name = "user")
public class User {
 @Id
 @GeneratedValue(strategy = GenerationType.IDENTITY)
 private Integer id;
 private String name;
 @Convert(converter = GenderConverter.class)
 private Gender gender;
}

定義一個(gè)GenderConverter的類(lèi),需要實(shí)現(xiàn)AttributeConverter接口,實(shí)現(xiàn)convertToDatabaseColumn和convertToEntityAttribute,作用是分別封裝從實(shí)體類(lèi)映射至數(shù)據(jù)庫(kù)字段數(shù)值的邏輯和從數(shù)據(jù)庫(kù)字段數(shù)值映射到代碼實(shí)體類(lèi)中的枚舉類(lèi)值。

public class GenderConverter implements AttributeConverter<Gender,Character> {
 
 @Override
 public Character convertToDatabaseColumn(Gender gender) {
 if ( gender == null ) {
  return null;
 } 
 return gender.getCode();
 }
 
 @Override
 public Gender convertToEntityAttribute(Character value) {
 if ( value == null ) {
  return null;
 } 
 return Gender.fromCode( value );
 }
}

測(cè)試

@SpringBootTest
@Slf4j
public class AttributeConverterTest {
 
 @Resource
 private UserRepository userRepository;
 
 @Test
 void should_user__when__give_user() {
 //given
 User user1 = new User(null,"Janny", Gender.FEMALE);
 User user2 = new User(null,"Tom", Gender.MALE);
 //when
 User actUser1 = userRepository.save(user1);
 User actUser2 = userRepository.save(user2);
 //then
 Assertions.assertNotNull(actUser1);
 Assertions.assertNotNull(actUser2);
 }
}

例外Hibernate也提供其他的方法,如使用@Enumerated注解,詳情可閱讀這篇文檔

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

相關(guān)文章

  • Java字符編碼原理(動(dòng)力節(jié)點(diǎn)Java學(xué)院整理)

    Java字符編碼原理(動(dòng)力節(jié)點(diǎn)Java學(xué)院整理)

    Java開(kāi)發(fā)中,常常會(huì)遇到亂碼的問(wèn)題,一旦遇到這種問(wèn)題,常常比較煩惱,大家都不想承認(rèn)是自己的代碼問(wèn)題,其實(shí)搞明白編碼的本質(zhì)過(guò)程就簡(jiǎn)單多了,接下來(lái)小編給大家?guī)?lái)java字符編碼原理,要求看看吧
    2017-04-04
  • 分享40個(gè)Java多線(xiàn)程問(wèn)題小結(jié)

    分享40個(gè)Java多線(xiàn)程問(wèn)題小結(jié)

    多個(gè)線(xiàn)程共存于同一JVM進(jìn)程里面,所以共用相同的內(nèi)存空間,較之多進(jìn)程,多線(xiàn)程之間的通信更輕量級(jí),本文給大家分享40個(gè)Java多線(xiàn)程問(wèn)題小結(jié) 的相關(guān)資料,需要的朋友可以參考下
    2015-12-12
  • Java線(xiàn)程組與未處理異常實(shí)例分析

    Java線(xiàn)程組與未處理異常實(shí)例分析

    這篇文章主要介紹了Java線(xiàn)程組與未處理異常,結(jié)合實(shí)例形式分析了java線(xiàn)程組處理異常的相關(guān)技巧與操作注意事項(xiàng),需要的朋友可以參考下
    2019-09-09
  • j2Cache線(xiàn)上異常排查問(wèn)題解決記錄分析

    j2Cache線(xiàn)上異常排查問(wèn)題解決記錄分析

    這篇文章主要為大家介紹了關(guān)于j2Cache線(xiàn)上異常排查的問(wèn)題解決記錄分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-02-02
  • Effective Java (異常處理)

    Effective Java (異常處理)

    Effective Java (異常處理),需要的朋友可以參考一下
    2013-02-02
  • 基于apache poi根據(jù)模板導(dǎo)出excel的實(shí)現(xiàn)方法

    基于apache poi根據(jù)模板導(dǎo)出excel的實(shí)現(xiàn)方法

    下面小編就為大家?guī)?lái)一篇基于apache poi根據(jù)模板導(dǎo)出excel的實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-06-06
  • Java 實(shí)戰(zhàn)范例之員工管理系統(tǒng)的實(shí)現(xiàn)

    Java 實(shí)戰(zhàn)范例之員工管理系統(tǒng)的實(shí)現(xiàn)

    讀萬(wàn)卷書(shū)不如行萬(wàn)里路,只學(xué)書(shū)上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+vue+Springboot+ssm+mysql+maven+redis實(shí)現(xiàn)一個(gè)前后端分離的員工管理系統(tǒng),大家可以在過(guò)程中查缺補(bǔ)漏,提升水平
    2021-11-11
  • Java連接SQL?Server數(shù)據(jù)庫(kù)的超詳細(xì)教程

    Java連接SQL?Server數(shù)據(jù)庫(kù)的超詳細(xì)教程

    在Java應(yīng)用程序中我們經(jīng)常需要與數(shù)據(jù)庫(kù)進(jìn)行交互,一種常見(jiàn)的數(shù)據(jù)庫(kù)是Microsoft?SQL?Server,下面這篇文章主要給大家介紹了關(guān)于Java連接SQL?Server數(shù)據(jù)庫(kù)的超詳細(xì)教程,需要的朋友可以參考下
    2024-01-01
  • 利用java開(kāi)發(fā)簡(jiǎn)易版掃雷游戲

    利用java開(kāi)發(fā)簡(jiǎn)易版掃雷游戲

    這篇文章主要介紹了利用java開(kāi)發(fā)一個(gè)丐版掃雷游戲,喜歡玩掃雷的小伙伴們一定要試試哦,對(duì)正在學(xué)習(xí)java開(kāi)發(fā)的小伙伴們也有一定幫助,需要的朋友可以參考下
    2021-04-04
  • Java生成訂單號(hào)或唯一id的高并發(fā)方案(4種方法)

    Java生成訂單號(hào)或唯一id的高并發(fā)方案(4種方法)

    本文主要介紹了Java生成訂單號(hào)或唯一id的高并發(fā)方案,包括4種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-01-01

最新評(píng)論