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

SpringBoot使用Validation實(shí)現(xiàn)接口校驗(yàn)的超全使用指南

 更新時(shí)間:2026年03月01日 09:18:31   作者:程序員越  
這篇文章主要為大家詳細(xì)介紹了SpringBoot使用Validation實(shí)現(xiàn)接口校驗(yàn)的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

一、依賴引入

Spring Boot 提供的 spring-boot-starter-validation 依賴整合了 JSR-380 規(guī)范(Bean Validation 2.0)及 Hibernate Validator 實(shí)現(xiàn),支持便捷的請(qǐng)求參數(shù)校驗(yàn)功能,無需手動(dòng)編寫重復(fù)的校驗(yàn)邏輯。

在項(xiàng)目 pom.xml 中引入依賴(Spring Boot 2.3+ 需顯式引入,2.3 以下版本可通過 spring-boot-starter-web 間接依賴):

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
    <!-- 無需指定版本,Spring Boot 父工程已統(tǒng)一管理 -->
</dependency>

二、核心使用步驟(對(duì)象參數(shù)校驗(yàn))

Spring MVC 中最常用的校驗(yàn)場(chǎng)景是對(duì)象類型的請(qǐng)求參數(shù)校驗(yàn),需遵循「注解標(biāo)記→對(duì)象定義→異常處理」三步法:

步驟 1:Controller 方法標(biāo)記 @Valid

在接收的對(duì)象參數(shù)前添加 @Valid 注解(或 @Validated),告知 Spring MVC 對(duì)該參數(shù)執(zhí)行校驗(yàn):

import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;
import javax.servlet.http.HttpServletRequest;

@RestController
@RequestMapping("/test")
// 類上添加 @Validated 可支持方法參數(shù)(非對(duì)象)的校驗(yàn)
@Validated
public class TestController {

    /**
     * 測(cè)試對(duì)象參數(shù)校驗(yàn)
     * @param req 待校驗(yàn)的請(qǐng)求對(duì)象
     * @param request 請(qǐng)求上下文
     * @return 響應(yīng)結(jié)果
     */
    @RequestMapping(value = "/req.json")
    public Object test(@Valid TestRequest req, HttpServletRequest request) {
        // 校驗(yàn)通過后才會(huì)執(zhí)行此處業(yè)務(wù)邏輯
        return "請(qǐng)求成功,req=" + req.getReq();
    }

    /**
     * 擴(kuò)展:基本類型參數(shù)校驗(yàn)(需類上添加 @Validated)
     * 校驗(yàn)不通過會(huì)拋出 ConstraintViolationException
     */
    @RequestMapping(value = "/base.json")
    public Object testBaseParam(
            @NotBlank(message = "用戶名不能為空") String username,
            @Min(value = 18, message = "年齡不能小于18歲") Integer age) {
        return "用戶名:" + username + ",年齡:" + age;
    }
}

步驟 2:定義請(qǐng)求對(duì)象并添加校驗(yàn)注解

創(chuàng)建請(qǐng)求參數(shù)對(duì)應(yīng)的實(shí)體類,在需要校驗(yàn)的字段上添加「常用校驗(yàn)注解」,并指定錯(cuò)誤提示信息:

import javax.validation.constraints.NotBlank;

public class TestRequest {

    // @NotBlank:字符串不能為 null 且去除首尾空格后長度 > 0
    @NotBlank(message = "req參數(shù)不能為空(不能是空白字符)")
    private String req;

    // 必須提供 getter/setter,否則 Spring MVC 無法注入?yún)?shù)
    public String getReq() {
        return req;
    }

    public void setReq(String req) {
        this.req = req;
    }
}

步驟 3:全局異常處理器統(tǒng)一處理校驗(yàn)異常

校驗(yàn)不通過時(shí),Spring MVC 會(huì)拋出不同類型的異常(對(duì)象參數(shù)拋出 BindException/MethodArgumentNotValidException,基本類型參數(shù)拋出 ConstraintViolationException),需通過「全局異常處理器」捕獲并統(tǒng)一返回格式化響應(yīng):

import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import javax.annotation.Resource;
import javax.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException;
import java.util.Locale;
import java.util.Set;

/**
 * 全局異常處理器:統(tǒng)一處理參數(shù)校驗(yàn)異常
 */
@RestControllerAdvice
public class GlobalValidationExceptionHandler {

    // 用于國際化消息解析(可選)
    @Resource
    private MessageSource messageSource;

    /**
     * 處理對(duì)象參數(shù)校驗(yàn)異常(@Valid 標(biāo)記的對(duì)象)
     * 包括:BindException(表單提交)、MethodArgumentNotValidException(JSON 提交)
     */
    @ExceptionHandler({BindException.class, MethodArgumentNotValidException.class})
    public Result<?> handleObjectValidationException(Exception ex) {
        ObjectError objectError = null;
        // 區(qū)分不同的對(duì)象校驗(yàn)異常類型
        if (ex instanceof BindException) {
            // 表單提交(application/x-www-form-urlencoded)
            objectError = ((BindException) ex).getBindingResult().getAllErrors().get(0);
        } else if (ex instanceof MethodArgumentNotValidException) {
            // JSON 提交(application/json)
            objectError = ((MethodArgumentNotValidException) ex).getBindingResult().getAllErrors().get(0);
        }

        // 解析錯(cuò)誤信息(支持國際化)
        Locale locale = LocaleContextHolder.getLocale();
        String errorMsg = messageSource.getMessage(objectError, locale);
        return Result.error(400, "參數(shù)校驗(yàn)失敗", errorMsg);
    }

    /**
     * 處理基本類型/單個(gè)參數(shù)校驗(yàn)異常(@Validated 標(biāo)記的類)
     */
    @ExceptionHandler(ConstraintViolationException.class)
    public Result<?> handleBaseParamValidationException(ConstraintViolationException ex) {
        Set<ConstraintViolation<?>> violations = ex.getConstraintViolations();
        // 獲取第一個(gè)錯(cuò)誤信息(也可收集所有錯(cuò)誤)
        String errorMsg = violations.iterator().next().getMessage();
        return Result.error(400, "參數(shù)校驗(yàn)失敗", errorMsg);
    }

    // 通用響應(yīng)類(簡化示例)
    static class Result<T> {
        private int code;
        private String msg;
        private T data;

        public static <T> Result<T> error(int code, String msg, T data) {
            Result<T> result = new Result<>();
            result.code = code;
            result.msg = msg;
            result.data = data;
            return result;
        }

        public static <T> Result<T> success(T data) {
            Result<T> result = new Result<>();
            result.code = 200;
            result.msg = "操作成功";
            result.data = data;
            return result;
        }

        // getter/setter 省略
    }
}

三、常用校驗(yàn)注解詳解

JSR-380 規(guī)范定義了一系列標(biāo)準(zhǔn)校驗(yàn)注解,Hibernate Validator 擴(kuò)展了部分注解,以下是開發(fā)中最常用的注解及使用場(chǎng)景:

注解名稱核心作用適用類型關(guān)鍵屬性說明
@NotBlank字符串不能為 null 且去除首尾空格后長度 > 0Stringmessage:錯(cuò)誤提示
@NotNull值不能為 null(不校驗(yàn)空字符串、空集合)所有類型(對(duì)象、基本類型包裝類)-
@NotEmpty集合 / 數(shù)組 / 字符串不能為 null 且長度 > 0(字符串不忽略首尾空格)String、Collection、Map、數(shù)組-
@Min(value)數(shù)字不能小于 value(不支持 float/double,避免精度問題)數(shù)值類型(Integer、Long 等)value:最小值;inclusive:是否包含最小值(默認(rèn) true)
@Max(value)數(shù)字不能大于 value(不支持 float/double)數(shù)值類型同 @Min
@DecimalMin(value)支持小數(shù)的最小值校驗(yàn)(可指定數(shù)值格式)數(shù)值類型、Stringvalue:最小值(支持小數(shù));inclusive:是否包含最小值
@DecimalMax(value)支持小數(shù)的最大值校驗(yàn)數(shù)值類型、String同 @DecimalMin
@Email字符串必須符合郵箱格式(支持自定義正則)Stringregexp:自定義郵箱正則;flags:正則匹配模式
@Pattern(regexp)字符串必須匹配指定正則表達(dá)式Stringregexp:正則表達(dá)式;flags:匹配模式(如 CASE_INSENSITIVE 忽略大小寫)
@Size(min, max)集合 / 數(shù)組 / 字符串的長度在 [min, max] 范圍內(nèi)String、Collection、Map、數(shù)組min:最小長度;max:最大長度(默認(rèn) Integer.MAX_VALUE)
@Future日期必須是當(dāng)前時(shí)間之后的時(shí)間Date、LocalDateTime 等-
@FutureOrPresent日期必須是當(dāng)前時(shí)間或之后的時(shí)間日期類型-
@Past日期必須是當(dāng)前時(shí)間之前的時(shí)間日期類型-
@PastOrPresent日期必須是當(dāng)前時(shí)間或之前的時(shí)間日期類型-
@Positive數(shù)字必須是正數(shù)(> 0)數(shù)值類型-
@PositiveOrZero數(shù)字必須是正數(shù)或 0(≥ 0)數(shù)值類型-
@Negative數(shù)字必須是負(fù)數(shù)(< 0)數(shù)值類型-
@NegativeOrZero數(shù)字必須是負(fù)數(shù)或 0(≤ 0)數(shù)值類型-
@Digits(integer, fraction)數(shù)字的整數(shù)部分位數(shù) ≤ integer,小數(shù)部分位數(shù) ≤ fraction數(shù)值類型、Stringinteger:整數(shù)最大位數(shù);fraction:小數(shù)最大位數(shù)

注解使用示例

import javax.validation.constraints.*;
import java.time.LocalDateTime;

public class UserRequest {
    @NotBlank(message = "用戶名不能為空")
    @Size(min = 2, max = 20, message = "用戶名長度必須在2-20個(gè)字符之間")
    private String username;

    @NotNull(message = "年齡不能為空")
    @Min(value = 18, message = "年齡不能小于18歲")
    @Max(value = 60, message = "年齡不能大于60歲")
    private Integer age;

    @Email(message = "郵箱格式不正確", regexp = "^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$")
    private String email;

    @Past(message = "生日必須是過去的時(shí)間")
    private LocalDateTime birthday;

    @Pattern(regexp = "^1[3-9]\\d{9}$", message = "手機(jī)號(hào)格式不正確")
    private String phone;

    @DecimalMin(value = "0.01", message = "金額不能小于0.01")
    @DecimalMax(value = "10000.00", message = "金額不能大于10000.00")
    private Double amount;

    // getter/setter 省略
}

四、自定義校驗(yàn)注解(擴(kuò)展能力)

當(dāng)默認(rèn)校驗(yàn)注解無法滿足業(yè)務(wù)需求時(shí)(如「手機(jī)號(hào)格式校驗(yàn)」「自定義狀態(tài)值校驗(yàn)」),可通過 JSR-380 規(guī)范提供的擴(kuò)展機(jī)制實(shí)現(xiàn)自定義校驗(yàn)注解。

實(shí)現(xiàn)步驟(以「手機(jī)號(hào)校驗(yàn)」為例)

步驟 1:創(chuàng)建自定義校驗(yàn)注解

注解必須標(biāo)注 @Constraint 并指定對(duì)應(yīng)的驗(yàn)證器,同時(shí)包含 message、groups、payload 三個(gè)必填屬性(JSR-380 規(guī)范要求):

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;

/**
 * 自定義手機(jī)號(hào)校驗(yàn)注解
 */
@Target({ElementType.FIELD, ElementType.PARAMETER}) // 支持字段和方法參數(shù)
@Retention(RetentionPolicy.RUNTIME) // 運(yùn)行時(shí)生效
@Documented
@Constraint(validatedBy = PhoneValidator.class) // 關(guān)聯(lián)自定義驗(yàn)證器
public @interface Phone {

    // 錯(cuò)誤提示信息(支持國際化,默認(rèn)值可引用配置文件)
    String message() default "手機(jī)號(hào)格式不正確(必須是11位有效手機(jī)號(hào))";

    // 校驗(yàn)分組(用于多場(chǎng)景校驗(yàn),如新增/編輯不同規(guī)則)
    Class<?>[] groups() default {};

    // 負(fù)載信息(用于傳遞額外校驗(yàn)元數(shù)據(jù))
    Class<? extends Payload>[] payload() default {};
}

步驟 2:實(shí)現(xiàn) ConstraintValidator 接口

創(chuàng)建驗(yàn)證器類,實(shí)現(xiàn) ConstraintValidator<A, T> 接口(A 為自定義注解,T 為校驗(yàn)?zāi)繕?biāo)類型),核心邏輯在 isValid 方法中:

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.regex.Pattern;

/**
 * 手機(jī)號(hào)校驗(yàn)器:實(shí)現(xiàn) ConstraintValidator 接口
 */
public class PhoneValidator implements ConstraintValidator<Phone, String> {

    // 手機(jī)號(hào)正則表達(dá)式(支持13-9開頭的11位數(shù)字)
    private static final Pattern PHONE_PATTERN = Pattern.compile("^1[3-9]\\d{9}$");

    /**
     * 初始化方法:可獲取注解的屬性值(如自定義正則)
     */
    @Override
    public void initialize(Phone constraintAnnotation) {
        // 若注解有自定義屬性(如 regexp),可在此處獲取并初始化
        ConstraintValidator.super.initialize(constraintAnnotation);
    }

    /**
     * 校驗(yàn)核心方法:返回 true 表示校驗(yàn)通過,false 表示失敗
     * @param value 待校驗(yàn)的值(手機(jī)號(hào)字符串)
     * @param context 校驗(yàn)上下文(可用于自定義錯(cuò)誤信息)
     */
    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        // 1. 允許值為 null(若不允許 null,需配合 @NotNull 注解)
        if (value == null) {
            return true;
        }
        // 2. 正則匹配校驗(yàn)
        return PHONE_PATTERN.matcher(value).matches();
    }
}

步驟 3:使用自定義注解

與默認(rèn)注解用法完全一致,可直接標(biāo)注在字段或參數(shù)上:

public class UserRequest {
    @Phone(message = "手機(jī)號(hào)格式錯(cuò)誤,請(qǐng)輸入11位有效手機(jī)號(hào)")
    private String phone;

    // 配合 @NotNull 注解,禁止手機(jī)號(hào)為 null
    @NotNull(message = "手機(jī)號(hào)不能為空")
    @Phone
    private String requiredPhone;

    // getter/setter 省略
}

五、進(jìn)階使用技巧

1. 分組校驗(yàn)

當(dāng)同一個(gè)對(duì)象在不同場(chǎng)景(如「新增用戶」和「編輯用戶」)有不同校驗(yàn)規(guī)則時(shí),可通過「分組校驗(yàn)」實(shí)現(xiàn):

// 1. 定義分組接口(無需實(shí)現(xiàn))
public interface AddGroup {}
public interface UpdateGroup {}

// 2. 注解指定分組
public class UserRequest {
    @NotNull(groups = AddGroup.class, message = "新增時(shí)ID不能為空")
    @Null(groups = UpdateGroup.class, message = "編輯時(shí)ID必須為空")
    private Long id;

    @NotBlank(groups = {AddGroup.class, UpdateGroup.class}, message = "用戶名不能為空")
    private String username;
}

// 3. Controller 指定分組校驗(yàn)
@RestController
@RequestMapping("/user")
public class UserController {
    // 新增用戶:只校驗(yàn) AddGroup 分組的注解
    @PostMapping("/add")
    public Result<?> add(@Validated(AddGroup.class) UserRequest request) {
        return Result.success("新增成功");
    }

    // 編輯用戶:只校驗(yàn) UpdateGroup 分組的注解
    @PostMapping("/update")
    public Result<?> update(@Validated(UpdateGroup.class) UserRequest request) {
        return Result.success("編輯成功");
    }
}

2. 嵌套校驗(yàn)

當(dāng)對(duì)象中包含另一個(gè)對(duì)象屬性,且需要對(duì)嵌套對(duì)象進(jìn)行校驗(yàn)時(shí),需在嵌套對(duì)象字段上添加 @Valid 注解:

public class UserRequest {
    @NotBlank(message = "用戶名不能為空")
    private String username;

    // 嵌套對(duì)象校驗(yàn):必須添加 @Valid 注解
    @Valid
    @NotNull(message = "地址信息不能為空")
    private AddressRequest address;

    // 嵌套對(duì)象類
    public static class AddressRequest {
        @NotBlank(message = "省份不能為空")
        private String province;

        @NotBlank(message = "城市不能為空")
        private String city;

        // getter/setter 省略
    }

    // getter/setter 省略
}

3. 國際化錯(cuò)誤提示

將錯(cuò)誤提示信息存入國際化配置文件,通過 MessageSource 解析:

# src/main/resources/messages.properties(默認(rèn))
user.username.notBlank=用戶名不能為空
user.phone.invalid=手機(jī)號(hào)格式不正確

# src/main/resources/messages_zh_CN.properties(中文)
user.username.notBlank=用戶名不能為空
user.phone.invalid=手機(jī)號(hào)格式不正確

# src/main/resources/messages_en_US.properties(英文)
user.username.notBlank=Username cannot be blank
user.phone.invalid=Phone number format is invalid

使用時(shí)引用配置文件中的 key:

public class UserRequest {
    @NotBlank(message = "{user.username.notBlank}")
    private String username;

    @Phone(message = "{user.phone.invalid}")
    private String phone;
}

六、常見問題與注意事項(xiàng)

1. @Valid 與 @Validated 的區(qū)別:

  • @Valid:JSR-380 標(biāo)準(zhǔn)注解,支持對(duì)象校驗(yàn)、嵌套校驗(yàn),不支持分組校驗(yàn)和方法參數(shù)(非對(duì)象)校驗(yàn)。
  • @Validated:Spring 擴(kuò)展注解,支持分組校驗(yàn)、方法參數(shù)(非對(duì)象)校驗(yàn),不支持嵌套校驗(yàn)(需配合 @Valid)。

2. 基本類型參數(shù)校驗(yàn)失?。?/strong>

  • 需在 Controller 類上添加 @Validated 注解,否則 MethodValidationPostProcessor 無法攔截方法。
  • 校驗(yàn)失敗會(huì)拋出 ConstraintViolationException,需在全局異常處理器中單獨(dú)處理。

3. JSON 提交與表單提交的異常差異:

  • JSON 提交(Content-Type: application/json):校驗(yàn)失敗拋出 MethodArgumentNotValidException。
  • 表單提交(Content-Type: application/x-www-form-urlencoded):校驗(yàn)失敗拋出 BindException。

4. float/double 類型的數(shù)值校驗(yàn):

  • 避免使用 @Min/@Max,因浮點(diǎn)型精度問題可能導(dǎo)致校驗(yàn)失效,建議使用 @DecimalMin/@DecimalMax 或轉(zhuǎn)換為 String 類型后用 @Pattern 校驗(yàn)。

5. 自定義注解不生效:

  • 確保注解標(biāo)注了 @Constraint 并指定了 validatedBy 屬性。
  • 驗(yàn)證器類必須實(shí)現(xiàn) ConstraintValidator 接口,且泛型與注解、目標(biāo)類型一致。
  • 注解的 Retention 必須為 RUNTIME(運(yùn)行時(shí)才能被反射獲?。?/li>

以上就是SpringBoot使用Validation實(shí)現(xiàn)接口校驗(yàn)的超全使用指南的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot Validation接口校驗(yàn)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • springboot常用注釋的講解

    springboot常用注釋的講解

    今天小編就為大家分享一篇關(guān)于springboot常用注釋的講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • 從面試中的問題分析ThreadLocal

    從面試中的問題分析ThreadLocal

    這篇文章主要介紹了從面試中的問題分析ThreadLocal,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,下面我們來一起學(xué)習(xí)一下吧
    2019-06-06
  • 基于SpringCloudGateway實(shí)現(xiàn)微服務(wù)網(wǎng)關(guān)的方式

    基于SpringCloudGateway實(shí)現(xiàn)微服務(wù)網(wǎng)關(guān)的方式

    Spring?Cloud?Gateway是Spring?官方基于Spring?5.0,Spring?Boot?2.0和Project?Reactor?等技術(shù)開發(fā)的網(wǎng)關(guān),旨在為微服務(wù)架構(gòu)提供一種簡單而有效的統(tǒng)一的API路由管理方式,對(duì)SpringCloudGateway實(shí)現(xiàn)微服務(wù)網(wǎng)關(guān)相關(guān)知識(shí)感興趣的朋友一起看看吧
    2021-12-12
  • Spring Cloud 的 Hystrix.功能及實(shí)踐詳解

    Spring Cloud 的 Hystrix.功能及實(shí)踐詳解

    這篇文章主要介紹了Spring Cloud 的 Hystrix.功能及實(shí)踐詳解,Hystrix 具備服務(wù)降級(jí)、服務(wù)熔斷、線程和信號(hào)隔離、請(qǐng)求緩存、請(qǐng)求合并以及服務(wù)監(jiān)控等強(qiáng)大功能,需要的朋友可以參考下
    2019-07-07
  • Java多線Condition條件變量正確使用方法詳解

    Java多線Condition條件變量正確使用方法詳解

    這篇文章主要為大家,介紹了Java多線Condition條件變量正確使用方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • SpringBoot使用@PostConstruct注解導(dǎo)入配置方式

    SpringBoot使用@PostConstruct注解導(dǎo)入配置方式

    這篇文章主要介紹了SpringBoot使用@PostConstruct注解導(dǎo)入配置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • java實(shí)現(xiàn)可視化日歷

    java實(shí)現(xiàn)可視化日歷

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)可視化日歷,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • Java中SPI機(jī)制的實(shí)現(xiàn)詳解

    Java中SPI機(jī)制的實(shí)現(xiàn)詳解

    SPI(Service?Provider?Interface),是?JDK?內(nèi)置的一種服務(wù)提供發(fā)現(xiàn)機(jī)制,可以用來啟用框架擴(kuò)展和替換組件,下面我們就來看看Java中SPI機(jī)制的具體實(shí)現(xiàn)
    2024-01-01
  • MyBatis-Plus 使用枚舉自動(dòng)關(guān)聯(lián)注入

    MyBatis-Plus 使用枚舉自動(dòng)關(guān)聯(lián)注入

    本文主要介紹了MyBatis-Plus 使用枚舉自動(dòng)關(guān)聯(lián)注入,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-06-06
  • MyBatis-Plus UpdateWrapper 使用常見陷阱和解決方案

    MyBatis-Plus UpdateWrapper 使用常見陷阱和解決方案

    MyBatis-Plus是Mybatis的一個(gè)增強(qiáng),簡化了Mybatis的開發(fā)過程,不僅保持了Mybatis原有的功能,而且在無代碼侵略下增加了許多的增強(qiáng)的功能,提供了豐富的CRUD操作,單表的CRUD操作無需編寫SQL語句,本文介紹的是UpdateWrapper的常見陷阱和對(duì)應(yīng)的解決方案,感興趣的朋友一起看看吧
    2024-08-08

最新評(píng)論

陆河县| 河南省| 芜湖市| 娄烦县| 象州县| 邻水| 安龙县| 和平区| 海阳市| 阿鲁科尔沁旗| 集贤县| 沁阳市| 宾阳县| 会昌县| 都昌县| 连城县| 铜山县| 达州市| 海林市| 巧家县| 洪湖市| 遂溪县| 许昌县| 扬中市| 永川市| 长垣县| 乐亭县| 尼勒克县| 松潘县| 娄底市| 乐清市| 石门县| 建湖县| 临颍县| 屏山县| 榕江县| 玛多县| 淮北市| 林甸县| 兴业县| 临沭县|