php 建网站,顺德龙江网站建设,做百科需要用什么网站做参考,免费打广告网站历史文章#xff08;文章累计490#xff09;
《国内最全的Spring Boot系列之一》
《国内最全的Spring Boot系列之二》
《国内最全的Spring Boot系列之三》
《国内最全的Spring Boot系列之四》
《国内最全的Spring Boot系列之五》
《国内最全的Spring Boot系列之六》
S… 历史文章文章累计490
《国内最全的Spring Boot系列之一》
《国内最全的Spring Boot系列之二》
《国内最全的Spring Boot系列之三》
《国内最全的Spring Boot系列之四》
《国内最全的Spring Boot系列之五》
《国内最全的Spring Boot系列之六》
SpringBoot集成MyBatis-Plus MyBatis-Plus代码生成器[MP系列] - 第490篇
MyBatis-Plus主键生成策略[MyBatis-Plus系列] - 第491篇
MyBatis-Plus实现逻辑删除[MyBatis-Plus系列] - 492篇 悟纤师傅你觉得生命的本质是什么 师傅生命的本质是能量 师傅喜怒哀乐都是能量 师傅话语是能量的载体
师傅平和的语气合适的词语都会安抚心灵。 师傅如果话语太锋利了就会影响对方的情绪和心情也就是能量紊乱。 悟纤那两个人相处之道不就是需要注意使用平和的语气和用合适的词语来表达了
师傅平和的语气能够让人听着很舒服情绪不容易上头。
师傅不同的词语虽然都能够表达清楚意思但用合适的词语听起来让人觉得舒服的词语进行表达能够让人在心里上更加愿意去接受。
悟纤听师傅一席话胜读十年书。 导读
Hi大家好我是悟纤。过着爱谁谁的生活活出不设限的人生。
通常在开发中有这样的需求枚举类型存入数据库存的是编码code然而返回给前端的时候是名称name我们每次入库的时候都要getCode()以及返回给前端的时候要getName()很繁琐并且字段属于那种枚举类型的可读性也不高
基于以上问题我们会尝试着定制一些逻辑专门去处理一般是自定义枚举转换器实现然而mybatis-plus提供了优雅的实现方式。
一、枚举的使用场景和好处
在实际的使用当中当某个对象或者某个属性需要有多个可供选择的状态或者描述例如人的性别支付的状态错误的类型等等都可以使用枚举。
好处
1可读性高 易理解。
2统一参数类型避免传参错误。
3线程安全全局唯一无法修改。
二、版本区别
Mybatis-Plus 不同的版本通用枚举配置是不一样的稍早一些的需要实现 IEnum 接口并且需要在配置文件中配置 typeEnumsPackage 或者编写配置类这难免有些复杂。
而 Mybatis-Plus 从 3.5.2 版本开始只需使用 EnumValue 注解枚举属性简单来说就是一个注解解决了一系列配置本文也将讲解 EnumValue 注解枚举属性这种方式
三、通用枚举实战
接下来用具体的例子看一下mybatis-plus通用枚举的使用。
3.1定义枚举
3.1.1方式1EnumValue标注入库映射字段
使用注解EnumValue定义存储到数据库的值
package com.kfit.user.enums;import com.baomidou.mybatisplus.annotation.EnumValue;import com.fasterxml.jackson.annotation.JsonValue;/** * author悟纤「公众号SpringBoot」 * date2023/9/15 */public enum GradeEnum { PRIMARY(1, 小学), SECONDORY(2, 中学), HIGH(3, 高中); EnumValue//标记数据库存的值是code private final int code; JsonValue //标注该字段要开启自定义序列化返回值 private final String desc; GradeEnum(int code, String desc) { this.code code; this.desc desc; }} 说明注解JsonValue注解是开启序列化返回的值。
3.1.2方式2枚举属性实现 IEnum 接口
实现接口IEnum定义存储到数据库的值
package com.kfit.user.enums;import com.baomidou.mybatisplus.annotation.IEnum;import com.fasterxml.jackson.annotation.JsonValue;/** * author悟纤「公众号SpringBoot」 * date2023/9/15 */public enum AgeEnum implements IEnumInteger { ONE(1, 一岁), TWO(2, 二岁), THREE(3, 三岁); private int value; JsonValue //标注该字段要开启自定义序列化返回值 private String desc; AgeEnum(int value, String desc) { this.value value; this.desc desc; } Override public Integer getValue() { return this.value; }// Override// public String toString() {// return this.desc;// }} 说明上面两种方式定义的枚举都是可以的使用注解EnumValue在使用起来会更简单一些。
3.2 在实体类中使用枚举
在需要的实体类中使用上面定义的枚举这里重新创建一个实体类
package com.kfit.user.model;import com.kfit.user.enums.AgeEnum;import com.kfit.user.enums.GradeEnum;import lombok.Data;/** * author悟纤「公众号SpringBoot」 * date2023/9/15 */Datapublic class Student { private Long id; private String name; /** * 年龄IEnum接口的枚举处理 * 数据库字段age INT(3) */ private AgeEnum age; /** * 年级原生枚举带{link com.baomidou.mybatisplus.annotation.EnumValue}): * 数据库字段grade INT(2) */ private GradeEnum grade;} 3.3 定义Mapper
由于实体类是新的定义个Mapper进行数据库的操作如果是在原实体添加的忽略这一个步骤
package com.kfit.user.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;import com.kfit.user.model.Student;/** * author悟纤「公众号SpringBoot」 * date2023/9/15 */public interface StudentMapper extends BaseMapperStudent {} 3.4 在表中添加对应的列
在表中添加对应的列这里实体类是新的需要创建一个表
CREATE TABLE student ( id bigint(0) NOT NULL AUTO_INCREMENT, name varchar(255) NULL, age int(3) NULL, grade int(2) NULL, PRIMARY KEY (id)); 3.5 后端测试
接下来进行简单的后端测试。
3.5.1 保存测试
先来看下保存数据的测试
Autowiredprivate StudentMapper studentMapper;Testpublic void testInsert(){ Student student new Student(); student.setName(张三); student.setAge(AgeEnum.ONE); student.setGrade(GradeEnum.HIGH); studentMapper.insert(student);}
执行结果 3.5.2 修改测试
看下修改
Testpublic void testUpdate(){ Student student new Student(); student.setId(1L); student.setName(李四); student.setAge(AgeEnum.TWO); student.setGrade(GradeEnum.SECONDORY); studentMapper.updateById(student);}
运行结果 3.5.3 查询测试
看下返回的数据情况
Testpublic void testSelctById(){ Student student studentMapper.selectById(1); System.out.println(student);}
运行结果 这里显示的希望是中文的描述的话那么需要重写AgeEnum和GradeEnum的toString()方法
Overridepublic String toString() { return this.desc;}
这时候在运行一下 3.6 前端测试
最后在进行一下前端测试就是从前端请求到控制层然后进行操作。
3.6.1 定义一个controller
首先定义controller:
package com.kfit.user.controller;import com.kfit.user.mapper.StudentMapper;import com.kfit.user.model.Student;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;/** * author悟纤「公众号SpringBoot」 * date2023/9/15 */RestControllerRequestMapping(/student)public class StudentController { Autowired private StudentMapper studentMapper;} 3.6.2 查询测试
进行查询测试
RequestMapping(/select)public Student selectStudent(){ return studentMapper.selectById(1);}
请求地址
http://127.0.0.1:8080/student/select
请求结果 结果显示很正常如果显示的不是中文的话那么看看有没有在属性上添加了JsonValue的注解如果使用的是其它的JSON框架的话那么对应的是什么注解。
3.6.3 保存测试
编写保存测试代码
RequestMapping(/save)public int save(RequestBody Student student){ return studentMapper.insert(student);} 请求地址
http://127.0.0.1:8080/student/save
请求体
{ name: wuqian, age: 二岁, grade: 高中}
请求结果 除了 age: 二岁age: 1 也能达到相同的效果需要注意的是age: 1 对枚举类的要求苛刻需要保证枚举数字从0开始并按顺序排列因为它是按顺序取枚举的。
也就是说
设置age0那么对应的是ONE(1, 一岁)
设置age1那么对应的是TWO(2, 二岁)
如果要使用这种方式最好是code从0开始并且是顺序排列的不然可能会出现莫名其妙的错误。
3.6.4 保存测试2
上面保存是使用的JSON的方式如果使用get请求地址这样的请求呢
RequestMapping(/save1)public int save1(Student student){ return studentMapper.insert(student);} 请求地址
http://127.0.0.1:8080/student/save1?namewuqianage二岁
请求报错
Resolved [org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errorsEOLField error in object student on field age: rejected value [二岁]; codes [typeMismatch.student.age,typeMismatch.age,typeMismatch.com.kfit.user.enums.AgeEnum,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [student.age,age]; arguments []; default message [age]]; default message [Failed to convert property value of type java.lang.String to required type com.kfit.user.enums.AgeEnum for property age; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [com.kfit.user.enums.AgeEnum] for value [二岁]; nested exception is java.lang.IllegalArgumentException: No enum constant com.kfit.user.enums.AgeEnum.二岁]]
所以这种方式不能够这样子请求可以这样子请求
http://127.0.0.1:8080/student/save1?namewuqianageONE
请求结果 那能不能传递value值呢 这个就需要重写StringToEnumConverterFactory的可以自行去了解一下。 小结
本节介绍了MP的通用枚举功能对于本文的知识重点总结一下
1通用枚举定义的两种方式其一使用注解EnumValue其二实现接口IEnum。
2后端测试想要返回对应的描述可以重写toString()方法。
3前端测试想要返回对应的描述可以添加注解JsonValue。
4如果请求方式是json的方式那么可以直接进行转换。
5如果请求方式是x-www-form-urlencoded那么要使用name的方式否则要重写类StringToEnumConverterFactory。
「1000道互联网Java工程师面试题」 包括了MyBatis、ZK、Dubbo、EL、Redis、MySQL、并发编程、Java面试、Spring、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题共 485 页32W字
领取方式关注公众号「SpringBoot」回复[面试资料] 点赞、转发、评论伸出你的双手666… i 你就是你不一样的小蚂蚁