【Java开发】 Mybatis-Plus 06:通用枚举功能

news2024/11/27 15:38:33

枚举类是开发时绕不开的话题, Mybatis-Plus 也提供了简便的枚举功能,快学起来吧~

目录

1 版本区别

2 通用枚举功能实现

2.1 创建枚举类

2.2 实体类新增枚举字段

3 枚举字段测试

3.1 新增

① 后台指定枚举

② 前后端交互

3.2 查询

3.3 修改

① 后台指定枚举

② 前后端交互

3.4 删除


源码地址:尹煜 / mybatis_plus_study · GitCode

1 版本区别

其实 Mybatis-Plus 不同的版本,通用枚举配置是不一样的,稍早一些的需要实现 IEnum 接口,并且需要在配置文件中配置 typeEnumsPackage 或者编写配置类,这难免有些复杂(详情见https://baomidou.com/pages/8390a4/)。

而 Mybatis-Plus 3.5.2 版本开始只需使用 @EnumValue 注解枚举属性,简单来说就是一个注解解决了一系列配置,本文也将讲解 @EnumValue 注解枚举属性这种方式!

所用到的依赖 👇,web 依赖会在后边用到。

        <!--mybatis-plus-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.2</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

2 通用枚举功能实现

2.1 创建枚举类

路径:src\main\java\com\yinyu\enums\CheckEnum.java

该枚举类以数字作为媒介,也就是说数据库里存的是数字

package com.yinyu.enums;

import com.baomidou.mybatisplus.annotation.EnumValue;
import com.fasterxml.jackson.annotation.JsonValue;
import lombok.Getter;

@Getter //构建get方法
public enum CheckEnum {

    //未审核
    NULL(0, "未审核"),

    //审核不通过
    FAIL(1, "审核不通过"),

    //审核通过
    SUCCESS(2, "审核通过");

    @EnumValue//标记数据库存的值是code
    private final int code;

    @JsonValue //前端展示
    private final String text;

    CheckEnum(int code, String text) {
        this.code = code;
        this.text = text;
    }
}

2.2 实体类新增枚举字段

首先确保数据表里存在该字段 👇

然后给实体类新增 isCheck 枚举字段

路径:src/main/java/com/yinyu/pojo/User.java

package com.yinyu.pojo;

import com.baomidou.mybatisplus.annotation.*;
import com.yinyu.enums.CheckEnum;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Date;

@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {

    @TableId(type = IdType.AUTO)
    private Long id;

    private String name;
    private  Integer age;
    private  String email;

    //枚举字段
    private CheckEnum isCheck;

    @Version//乐观锁version注解
    private Integer version;

    @TableLogic//逻辑删除注解
    private Integer deleted;

    //字段  字段添加填充内容
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;

    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;

}

若涉及到 xxMapper.xml,也需要添加该字段信息,字段类型依旧是数字,如下:

<result property="isCheck" column="is_check" jdbcType="INTEGER"/>

3 枚举字段测试

路径:src/test/java/com/yinyu/EnumTest.java

3.1 新增

① 后台指定枚举

测试以下三种情况:不指定枚举默认保存、指定枚举默认保存和 userMapper.insert 保存👇

    @Test
    public void testSave1() {
        User user = new User();
        user.setName("testSave1");
        user.setAge(17);
        user.setEmail("yinyu@161.com");
        // 不指定枚举默认保存
        userService.save(user);
    }

    @Test
    public void testSave2() {
        User user = new User();
        user.setName("testSave2");
        user.setAge(18);
        user.setEmail("yinyu@162.com");
        user.setIsCheck(CheckEnum.SUCCESS);
        // 指定枚举默认保存
        userService.save(user);
    }

    @Test
    public void testSave3() {
        User user = new User();
        user.setName("testSave3");
        user.setAge(19);
        user.setEmail("yinyu@163.com");
        user.setIsCheck(CheckEnum.FAIL);

        // userMapper.insert保存
        userMapper.insert(user);
    }

结果如下 👇,新增成功,能够按照枚举类型往数据表里添加信息

② 前后端交互

那么前后端交互时如何使用这个枚举字段呢,请看下文:

📌 首先建一个简单的对外接口 Controller ,然后添加保存接口👇

路径:src/main/java/com/yinyu/controller/UserController.java

package com.yinyu.controller;

import com.yinyu.pojo.User;
import com.yinyu.service.impl.UserServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("api/user")
public class UserController {

    @Autowired
    private UserServiceImpl userService;

    @PostMapping("/save")
    public boolean save(@RequestBody User user) {
        return userService.save(user);
    }
}

📌 请求该接口

此时需要在 application.properties 配置文件中加上项目端口:

server.port=8080
server.error.include-message=always

然后启动项目,使用 API 工具请求该接口 👇,isCheck 字段使用其描述来匹配枚举类型,建议使用该种方式。

除了 "isCheck": "审核不通过""isCheck": 1 也能达到相同的效果,需要注意的是:"isCheck": 1 对枚举类的要求苛刻,需要保证枚举数字从0开始并按顺序排列,因为它是按顺序取枚举的(可忽略该种方式)。

结果 👇,新增成功,虽然请求体中的 isCheck 字段是字符串,但是数据表存储的是数字。

3.2 查询

测试以下三种情况:直接根据 id 查询和使用 wrapper 查询

    @Test
    public void testQuery1() {
        // 根据id请求
        User user = userService.getById(9);
        System.out.println(user);
    }

    @Test
    public void testQuery2() {
        // 根据wrapper请求,指定枚举类型
        LambdaUpdateWrapper<User> wrapper = new LambdaUpdateWrapper<>();
        wrapper.eq(User::getIsCheck, CheckEnum.FAIL);

        List<User> result = userService.list(wrapper);
        System.out.println(result);
    }

testQuery2 的结果如下 👇,查询后会将 isCheck 的结果反显成其描述,这就是 @JsonValue 注解的作用。

3.3 修改

① 后台指定枚举

后台修改的话主要有以下两种方式,我一般都用第二种 👇

    @Test
    public void testUpdate1() {
        // 修改 id=9 记录的 is_ischeck,需要指定id才可以更新
        User user = new User();
        user.setId(9L);
        user.setIsCheck(CheckEnum.SUCCESS);

        boolean result = userService.updateById(user);
        System.out.println(result);
    }

    @Test
    public void testUpdate2() {
        // 修改 name为 save4记录的 is_ischeck,使用 updateWrapper
        LambdaUpdateWrapper<User> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.eq(User::getName, "save4") //匹配记录
                .set(User::getIsCheck, CheckEnum.SUCCESS); //更新字段值

        boolean result = userService.update(updateWrapper);
        System.out.println(result);
    }

② 前后端交互

修改也存在前后端交互的问题:

📌 在 Controller 中添加更新接口

路径:src/main/java/com/yinyu/controller/UserController.java

    @PostMapping("/update")
    public boolean update(@RequestBody User user) {
        return userService.updateById(user);
    }

📌 请求该接口

和新增的交互类似,添加完接口后启动项目便可使用 API 工具请求了

可以看到,修改也可以通过字符串匹配枚举类型,也推荐该种方式~

除了 "isCheck": "审核通过""isCheck": 2 也能达到相同的效果,需要注意的是:"isCheck": 1 对枚举类的要求苛刻,需要保证枚举数字从0开始并按顺序排列,因为它是按顺序取枚举的(可忽略该种方式)。

3.4 删除

一般来说是根据 id 进行删除 👇

    @Test
    public void testRemove1() {
        // 根据id删除
        boolean result = userService.removeById(8);
        System.out.println(result);
    }

    @Test
    public void testRemove2() {
        User user = new User();
        user.setId(8L); //需要指定id

        boolean result = userService.removeById(user);
        System.out.println(result);
    }

wrapper 能够实现根据字段来进行删除对应记录,比如我想把审核通过的记录都删除 👇

    @Test
    public void testRemove3() {
        LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(User::getIsCheck, CheckEnum.SUCCESS);

        boolean result = userService.removeById(wrapper);
        System.out.println(result);
    }

sql 如下,匹配成功 👇

删除成功 👇

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/780189.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

递归排序算法快速排序的实现过程

快速排序(Insertion Sort)也是一种递归排序算法。 快速排序原理&#xff1a;先以列表中的任意一个数为基准(一般选头或尾)&#xff0c;将列表分为左、右两个子列表。 左子列表的数要比基准数小&#xff0c;右子列表的数要比基准数大。然后继续把左子列表和右子列表按同样的方…

蓝桥杯专题-真题版含答案-【九宫幻方】【打鱼还是晒网】【阶乘尾数零的个数】【等差素数列】

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…

【Java】重写compareTo()方法给对象数组排序

我们先给一个数组排序&#xff0c;我们肯定用的是Arrays.sort()方法&#xff1a; public class test2 {public static void main(String[] args) {int[] arr{3,5,4,6,9,8,1};System.out.println(Arrays.toString(arr));System.out.println("---------");Arrays.sort…

【一文详解 requests 库中 json 参数和 data 参数的用法】

在requests库当中&#xff0c;requests请求方法&#xff0c;当发送post/put/delete等带有请求体 的请求时&#xff0c;有json和data2个参数可选。 众所周知&#xff0c;http请求的请求体格式主要有以下4种&#xff1a;application/jsonapplicaiton/x-www-from-urlencoded multi…

音视频开发-ffmpeg介绍-系列二

目录 一、FFmpeg核心结构体 二、解码流程 三、FFmpeg解码实现 四、FFmpeg编码实现 五、FFmpeg转码实现 一、FFmpeg核心结构体 AVFormatContext&#xff1a;解封装功能的结构体&#xff0c;包含文件名、音视频流、时长、比特率等信息&#xff1b; AVCodecContext&#xf…

nginx代理后刷新显示404,这样解决。

项目部署之后&#xff0c;通过首页进入访问页面正常&#xff0c;F5刷新之后出现错误如下图。 怎么解决&#xff1a; 在Nginx配置里面增加 location / {root /www/wwwroot/phm/phmweb;index index.html index.htm;try_files $uri $uri/ /index.html;}

Kotlin基础(七):数据类和封闭类

前言 本文主要讲解kotlin数据类&#xff08;DataClass&#xff09;和封闭类&#xff08;SealedClasses&#xff09;&#xff0c;包括使用数据类&#xff0c;对象复制&#xff0c;数据类成员的解构&#xff0c;使用封闭类&#xff0c;以及数据类和封闭类在Android开发中的应用。…

【数据挖掘】时间序列的傅里叶变换:用numpy解释的快速卷积

一、说明 本篇告诉大家一个高级数学模型&#xff0c;即傅里叶模型的使用&#xff1b; 当今&#xff0c;傅里叶变换及其所有变体构成了我们现代世界的基础&#xff0c;为压缩、通信、图像处理等技术提供了动力。我们从根源上理解&#xff0c;从根本上应用&#xff0c;这是值得付…

微信小程序——页面跳转方法和场景用法总结

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

失物招领小程序连接人与物的奇妙纽带

hello guys!! 随着生活的节奏加快&#xff0c;人们在各个领域都有可能会遇到丢失物品或者拾到物品的情况。不论是学生、员工还是旅游爱好者&#xff0c;我们都有可能在生活的轨迹中遇到这样的情况。为了提供一个便捷的平台&#xff0c;让人们能够分享、发布和寻找丢失物品&…

再添新品|OPT(奥普特)高速高分辨率线阵相机发布!

针对大幅面且高速生产的视觉检测场景&#xff0c;OPT&#xff08;奥普特&#xff09;持续在数据传输接口技术上进行开发创新&#xff0c;推出三大系列线阵相机&#xff0c;产品阵容再升级。 本次发布的新品共12款&#xff0c;分别有万兆网、CXP及CL系列的新品&#xff0c;分辨…

JavaDemo——使用jks的https

java使用https主要就是设置下sslContext&#xff0c;sslContext初始化需要密钥管理器和信任管理器&#xff0c;密钥管理器用于管理本地证书和私钥&#xff0c;信任管理器用于验证远程服务器的证书&#xff0c;这两种管理器都需要KeyStore初始化&#xff0c;两种管理器可以按需只…

OS1_进程与线程的管理

序言 1.OS以进程、线程的方式在CPU中执行静态保存在外存(内存)中的程序&#xff0c;进程的构成与状态转化&#xff0c;特别是进程的切换&#xff1b; 2.当有多个进程处于就绪态&#xff0c;有哪些常见的挑选以执行方式&#xff1b; 3.并发执行(乱序发射)的进程&#xff0c;共享…

商品信息管理-亿发商品进销存管理系统,批发行业零售门店免费试用

众所周知&#xff0c;批发零售行业面临着商品品类繁多、品牌众多、商品信息量庞大等挑战。同时&#xff0c;商品售价波动频繁&#xff0c;还需要管理商品批次&#xff0c;避免积压过期。针对这些传统批发零售行业的管理难题&#xff0c;加快行业数字化转型成为解决之道&#xf…

远程访问不了虚拟机【bug】

远程访问不了虚拟机【bug】 bug 虚拟机访问不了他的默认网关 虚拟机IP&#xff1a;172.25.254.250 虚拟机网关IP&#xff1a;172.25.254.1 远程登录也是超时的 错误产生 我还原了一下虚拟机的网络配置选项 导致 √ 使用本地DHCPT服务将IP地址给虚拟机 相关资源 本机的I…

基于Labelstudio的UIE半监督智能标注方案(本地版)

自然语言处理信息抽取智能标注方案包括以下几种&#xff1a; 基于规则的标注方案&#xff1a;通过编写一系列规则来识别文本中的实体、关系等信息&#xff0c;并将其标注。 基于规则的标注方案是一种传统的方法&#xff0c;它需要人工编写规则来识别文本中的实体、关系等信息&a…

Redis入门(1)——Redis是啥 安装Docker的Redis Redis的基本数据类型+常用命令 SpringBoot整合Redis初步

目录 引出MySQL数据库&#xff1a;慢Redis是啥&#xff1f;问题&#xff1a;redis是单线程的&#xff0c;为什么会非常快&#xff1f; 安装Redis的docker1.搜索docker search redis2.拉取docker pull redis3.运行容器4.进入容器-->进入redis redis的基本数据类型字符串(stri…

在线招投标系统nodejs+vue

本站是一个B/S模式系统&#xff0c;采用vue框架&#xff0c;MYSQL数据库设计开发&#xff0c;充分保证系统的稳定性。系统具有界面清晰、操作简单&#xff0c;功能齐全的特点&#xff0c;使得在线招投标系统管理工作系统化、规范化。本系统的使用使管理人员从繁重的工作中解脱出…

PHP反序列化漏洞之面向对象基础

一、PHP面向对象基础 要谈PHP反序列化&#xff0c;不得不涉及面向对象&#xff0c;因为在反序列化漏洞利用中&#xff0c;大多涉及的都是“对象”的反序列化。所以需要了解面向对象基础。 面向面向对象是一种以“对象”为中心的编程思想&#xff0c;把要解决的问题分解成各个…

WORD模板如何自定义并使用?

文章目录 0.引言1.新建WORD2.WORD另存为模板3.使用模板 0.引言 使用Word模板可以提高文档处理的一致性、效率和专业性&#xff0c;同时也方便了更新和维护。对于需要频繁创建或修改文档的组织或个人来说&#xff0c;使用Word模板是一个非常实用的工具。本文总结Word模板自定义并…