最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot Entity中枚舉類型詳細(xì)使用介紹

 更新時(shí)間:2022年10月20日 15:13:13   作者:IT利刃出鞘  
本文介紹SpringBoot如何在Entity(DAO)中使用枚舉類型。(本文使用MyBatis-Plus)。在實(shí)際開發(fā)中,經(jīng)常會(huì)遇到表示類型或者狀態(tài)的情況,比如:有三種支付方式:微信、支付寶、銀聯(lián)。本文介紹如何這種場景的方案對(duì)比,并用實(shí)例來介紹如何用枚舉這種最優(yōu)雅的來表示

簡介方案對(duì)比

本處列舉表示類型或狀態(tài)的常用方法的對(duì)比。

法1:使用數(shù)字表示(不推薦)

//1:支付寶支付;2:微信支付;3:銀行卡支付
private Integer payType;

這種方法的缺點(diǎn):可讀性極差,排查問題也麻煩。比如:前端頁面上看到了2這個(gè)類型,還要看接口文檔或者問后端這是什么意思,浪費(fèi)時(shí)間!

法2:使用字符串表示(不推薦)

//ALIPAY:支付寶;WECHAT_PAY:微信;BANK_CARD_PAY:銀行卡支付
private String payType;

這種方式比法1好一些了,提高了數(shù)據(jù)庫的可讀性和排查問題速度。

缺點(diǎn):難以控制不允許數(shù)據(jù)庫的pay_type為空字符串這種情況;支持的類型沒有限制死,前端傳個(gè)其他的字符串也能存入數(shù)據(jù)庫。

法3:使用枚舉表示(推薦)

枚舉是這種場景最好的方案(枚舉本身就是為了表示可窮舉類型而發(fā)明出來的!)。

定義一個(gè)枚舉類

package com.example.demo.order.enums;
import lombok.Getter;
@Getter
public enum PayTypeEnum {
    ALIPAY("支付寶"),
    WECHAT_PAY("微信支付"),
    BANK_CARD_PAY("銀行卡支付"),
    ;
    private final String description;
    PayTypeEnum(String description) {
        this.description = description;
    }
}

Entity中定義枚舉類型字段

private PayTypeEnum payType;

優(yōu)點(diǎn)

  • 可讀性極高,排查問題很快(比如:前端頁面上看到ALIPAY這個(gè)類型,一眼就能知道是支付寶)
  • 可以控制不允許數(shù)據(jù)庫的pay_type為空字符串這種情況(因?yàn)槊杜e字段不可能有空字符串)
  • 支持的類型限制死,前端傳個(gè)其他的字符串無法存入數(shù)據(jù)庫。

枚舉用法示例

建表

CREATE TABLE `t_order` (
  `id` bigint NOT NULL COMMENT 'ID',
  `order_no` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '訂單號(hào)',
  `pay_type` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '支付類型。ALIPAY:支付寶;WECHAT_PAY:微信;BANK_CARD_PAY:銀行卡支付。',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='訂單';

pay_type字段加了NOT NULL限制。

Entity

package com.example.demo.order.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.example.demo.order.enums.PayTypeEnum;
import lombok.Data;
@Data
@TableName("t_order")
public class Order {
    private Long id;
    private String orderNo;
    private PayTypeEnum payType;
}

Enum

package com.example.demo.order.enums;
import lombok.Getter;
@Getter
public enum PayTypeEnum {
    ALIPAY("支付寶"),
    WECHAT_PAY("微信支付"),
    BANK_CARD_PAY("銀行卡支付"),
    ;
    private final String description;
    PayTypeEnum(String description) {
        this.description = description;
    }
}

Controller

package com.example.demo.order.controller;
import com.example.demo.order.entity.Order;
import com.example.demo.order.service.OrderService;
import com.example.demo.user.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/order")
public class OrderController {
    @Autowired
    private OrderService orderService;
    @PostMapping("pay")
    public void pay(@RequestBody Order order) {
        orderService.save(order);
    }
}

Service

接口

package com.example.demo.order.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.example.demo.order.entity.Order;
public interface OrderService extends IService<Order> {
}

實(shí)現(xiàn)

package com.example.demo.order.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.order.entity.Order;
import com.example.demo.order.mapper.OrderMapper;
import com.example.demo.order.service.OrderService;
import org.springframework.stereotype.Service;
@Service
public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements OrderService {
}

Mapper

package com.example.demo.order.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.order.entity.Order;
import org.springframework.stereotype.Repository;
@Repository
public interface OrderMapper extends BaseMapper<Order> {
}

測試

1.正常操作

寫入成功,枚舉的name()方法的值會(huì)寫到數(shù)據(jù)庫。

后端結(jié)果

數(shù)據(jù)庫結(jié)果

2.前端傳空字符串

此時(shí)會(huì)報(bào)錯(cuò),因?yàn)槊杜e中沒有對(duì)應(yīng)空字符串的。

后端結(jié)果(無法將空字符串反序列化為枚舉對(duì)象)

2022-09-10 10:14:30.406  WARN 128760 --- [nio-8080-exec-8] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type `com.example.demo.order.enums.PayTypeEnum` from String "": not one of the values accepted for Enum class: [ALIPAY, BANK_CARD_PAY, WECHAT_PAY]; nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `com.example.demo.order.enums.PayTypeEnum` from String "": not one of the values accepted for Enum class: [ALIPAY, BANK_CARD_PAY, WECHAT_PAY]
 at [Source: (PushbackInputStream); line: 4, column: 16] (through reference chain: com.example.demo.order.entity.Order["payType"])]

數(shù)據(jù)庫結(jié)果(沒寫入數(shù)據(jù))

3.前端傳null

后端結(jié)果(pay_type為null,寫入數(shù)據(jù)庫時(shí)報(bào)錯(cuò))

2022-09-10 10:24:20.514 ERROR 128760 --- [io-8080-exec-10] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.DataIntegrityViolationException: 
### Error updating database.  Cause: java.sql.SQLException: Field 'pay_type' doesn't have a default value
### The error may exist in com/example/demo/order/mapper/OrderMapper.java (best guess)
### The error may involve com.example.demo.order.mapper.OrderMapper.insert-Inline
### The error occurred while setting parameters
### SQL: INSERT INTO t_order  ( id, order_no )  VALUES  ( ?, ? )
### Cause: java.sql.SQLException: Field 'pay_type' doesn't have a default value
; Field 'pay_type' doesn't have a default value; nested exception is java.sql.SQLException: Field 'pay_type' doesn't have a default value] with root cause
 
java.sql.SQLException: Field 'pay_type' doesn't have a default value
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129) ~[mysql-connector-java-8.0.25.jar:8.0.25]
    at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) ~[mysql-connector-java-8.0.25.jar:8.0.25]
    at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953) ~[mysql-connector-java-8.0.25.jar:8.0.25]
    at com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:370) ~[mysql-connector-java-8.0.25.jar:8.0.25]
    at com.zaxxer.hikari.pool.ProxyPreparedStatement.execute(ProxyPreparedStatement.java:44) ~[HikariCP-3.4.5.jar:na]
    ......

數(shù)據(jù)庫結(jié)果(沒寫入數(shù)據(jù))

到此這篇關(guān)于SpringBoot Entity中枚舉類型詳細(xì)使用介紹的文章就介紹到這了,更多相關(guān)SpringBoot Entity內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Idea2023創(chuàng)建springboot不能選擇java8的解決方法(最新推薦)

    Idea2023創(chuàng)建springboot不能選擇java8的解決方法(最新推薦)

    在idea2023版本創(chuàng)建springboot的過程中,選擇java版本時(shí)發(fā)現(xiàn)沒有java8版本,只有java17和java20,遇到這樣的問題如何解決呢,下面小編給大家分享Idea2023創(chuàng)建springboot不能選擇java8的解決方法,感興趣的朋友一起看看吧
    2024-01-01
  • idea 創(chuàng)建properties配置文件的步驟

    idea 創(chuàng)建properties配置文件的步驟

    這篇文章主要介紹了idea 創(chuàng)建properties配置文件的步驟,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • spring-boot集成spring-security的oauth2實(shí)現(xiàn)github登錄網(wǎng)站的示例

    spring-boot集成spring-security的oauth2實(shí)現(xiàn)github登錄網(wǎng)站的示例

    本篇文章主要介紹了spring-boot集成spring-security的oauth2實(shí)現(xiàn)github登錄網(wǎng)站的示例,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2017-10-10
  • Java線程狀態(tài)及jstack命令詳解

    Java線程狀態(tài)及jstack命令詳解

    jstack是Java虛擬機(jī)(JVM)提供的一個(gè)非常有用的命令行工具,它允許開發(fā)人員和系統(tǒng)管理員在運(yùn)行時(shí)獲取Java應(yīng)用程序的線程堆棧跟蹤,在某些情況下,可能需要以管理員或root用戶的身份運(yùn)行jstack命令,這篇文章主要介紹了Java線程狀態(tài)及jstack命令詳解,需要的朋友可以參考下
    2024-03-03
  • mysql高版本(8.0+)group_by報(bào)錯(cuò)的處理方法

    mysql高版本(8.0+)group_by報(bào)錯(cuò)的處理方法

    本文主要介紹了mysql高版本(8.0+)group_by報(bào)錯(cuò)的處理方法,這個(gè)錯(cuò)誤一般發(fā)生在mysql 5.7以及 5.7以上的版本中,本文就來介紹一下兩種解決方法,感興趣的可以了解一下
    2023-09-09
  • SpringBoot整合Shiro實(shí)現(xiàn)權(quán)限控制的代碼實(shí)現(xiàn)

    SpringBoot整合Shiro實(shí)現(xiàn)權(quán)限控制的代碼實(shí)現(xiàn)

    Apache Shiro是一個(gè)強(qiáng)大且易用的Java安全框架,執(zhí)行身份驗(yàn)證、授權(quán)、密碼和會(huì)話管理,今天通過本文給大家介紹SpringBoot整合Shiro實(shí)現(xiàn)權(quán)限控制的方法,感興趣的朋友一起看看吧
    2021-07-07
  • SpringBoot超詳細(xì)講解@Enable*注解和@Import

    SpringBoot超詳細(xì)講解@Enable*注解和@Import

    這篇文章主要介紹了SpringBoot?@Enable*注解和@Import,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • Java的常用包

    Java的常用包

    本文主要對(duì)Java的常用包進(jìn)行一一介紹。具有一定的參考價(jià)值,下面跟著小編一起來看下吧
    2017-01-01
  • Java設(shè)計(jì)模式之備忘錄模式(Memento模式)介紹

    Java設(shè)計(jì)模式之備忘錄模式(Memento模式)介紹

    這篇文章主要介紹了Java設(shè)計(jì)模式之備忘錄模式(Memento模式)介紹,memento是一個(gè)保存另外一個(gè)對(duì)象內(nèi)部狀態(tài)拷貝的對(duì)象,這樣以后就可以將該對(duì)象恢復(fù)到原先保存的狀態(tài),需要的朋友可以參考下
    2015-03-03
  • springboot全局字符編碼設(shè)置方式(解決亂碼問題)

    springboot全局字符編碼設(shè)置方式(解決亂碼問題)

    這篇文章主要介紹了springboot全局字符編碼設(shè)置方式(解決亂碼問題),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12

最新評(píng)論

德兴市| 彭水| 利津县| 文水县| 盐山县| 高雄县| 土默特右旗| 格尔木市| 霍林郭勒市| 舟山市| 思茅市| 兰溪市| 浏阳市| 易门县| 历史| 公安县| 宜州市| 乌拉特后旗| 科尔| 来安县| 龙海市| 忻州市| 丰宁| 柞水县| 星座| 嵊州市| 金昌市| 海晏县| 巴里| 武平县| 古蔺县| 莆田市| 廉江市| 潍坊市| 宜良县| 紫金县| 丹寨县| 绥芬河市| 保康县| 南部县| 沁源县|