SpringBoot与MybatisPlus3.X整合之通用枚举(十二)
一 通用枚举
解决了繁琐的配置,让 mybatis 优雅的使用枚举属性!
自
3.1.0开始,可配置默认枚举处理类来省略扫描通用枚举配置 默认枚举配置
升级说明:
3.1.0以下版本改变了原生默认行为,升级时请将默认枚举设置为EnumOrdinalTypeHandler影响用户:
实体中使用原生枚举
其他说明:
配置枚举包扫描的时候能提前注册使用注解枚举的缓存
推荐配置:
使用实现
IEnum接口
推荐配置
defaultEnumTypeHandler使用注解枚举处理
推荐配置
typeEnumsPackage注解枚举处理与
IEnum接口
推荐配置
typeEnumsPackage与原生枚举混用
需配置
defaultEnumTypeHandler与typeEnumsPackage
申明通用枚举属性
方式一: 使用 @EnumValue 注解枚举属性 完整示例
public enum GradeEnum {
PRIMARY(1, "小学"), SECONDORY(2, "中学"), HIGH(3, "高中");
GradeEnum(int code, String descp) {
this.code = code;
this.descp = descp;
}
@EnumValue//标记数据库存的值是code
private final int code;
//。。。
}
方式二: 枚举属性,实现 IEnum 接口如下:
public enum AgeEnum implements IEnum<Integer> {
ONE(1, "一岁"),
TWO(2, "二岁"),
THREE(3, "三岁");
private int value;
private String desc;
@Override
public Integer getValue() {
return this.value;
}
}
实体属性使用枚举类型
public class User{
/**
* 名字
* 数据库字段: name varchar(20)
*/
private String name;
/**
* 年龄,IEnum接口的枚举处理
* 数据库字段:age INT(3)
*/
private AgeEnum age;
/**
* 年级,原生枚举(带{@link com.baomidou.mybatisplus.annotation.EnumValue}):
* 数据库字段:grade INT(2)
*/
private GradeEnum grade;
}
二 代码
pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/p6spy/p6spy -->
<dependency>
<groupId>p6spy</groupId>
<artifactId>p6spy</artifactId>
<version>3.8.0</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.49</version>
<scope>test</scope>
</dependency>
<!-- for testing -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>RELEASE</version>
<scope>compile</scope>
</dependency>
</dependencies>application.yml
spring:
datasource:
driver-class-name: com.p6spy.engine.spy.P6SpyDriver
url: jdbc:p6spy:h2:tcp://192.168.180.115:19200/~/mem/test
username: root
password: test
# MP 配置
mybatis-plus:
type-enums-package: com.mp.sampleenum.enums
configuration:
# 3.0.8之前版本问题默认将枚举注册为EnumOrdinalTypeHandler,这是错误的方式,默认是 org.apache.ibatis.type.EnumTypeHandler
# 如果项目之中实体统一使用IEnum或注解的方式,可配置成 com.baomidou.mybatisplus.extension.handlers.EnumTypeHandler,也可省略上面的type-enums-package配置
# 配置type-enums-package只对注解方式的枚举处理能提前加载缓存.
default-enum-type-handler: org.apache.ibatis.type.EnumOrdinalTypeHandler配置类
@Configuration
@MapperScan("com.mp.sampleenum.mapper")
public class MybatisPlusConfig {
}实体类
@EqualsAndHashCode(callSuper = true)
@Data
@Accessors(chain = true)
public class User extends BaseEntity {
private String name;
private String email;
/**
* IEnum接口的枚举处理
*/
private AgeEnum age;
/**
* 原生枚举: 默认使用枚举值顺序: 0:MALE, 1:FEMALE
*/
private GenderEnum gender;
/**
* 原生枚举(带{@link com.baomidou.mybatisplus.annotation.EnumValue}):
* 数据库的值对应该注解对应的属性
*/
@JSONField(serialzeFeatures= SerializerFeature.WriteEnumUsingToString)
private GradeEnum grade;
private UserState userState;
}
@Data
@Accessors(chain = true)
public class BaseEntity {
private Long id;
}枚举
@Getter
public enum AgeEnum implements IEnum<Integer> {
ONE(1, "一岁"),
TWO(2, "二岁"),
THREE(3, "三岁");
private final int value;
private final String desc;
AgeEnum(final int value, final String desc) {
this.value = value;
this.desc = desc;
}
@Override
public Integer getValue() {
return value;
}
}
public enum GenderEnum {
MALE,
FEMALE;
}
@Getter
//@JSONType(serializeEnumAsJavaBean = true)
public enum GradeEnum {
PRIMARY(1, "小学"),
SECONDORY(2, "中学"),
HIGH(3, "高中");
GradeEnum(int code, String descp) {
this.code = code;
this.descp = descp;
}
//@EnumValue
private final int code;
@EnumValue
private final String descp;
}
@Getter
public enum UserState implements IBaseEnum<Integer> {
ACTIVE(1, "A"),
INACTIVE(2, "I");
private final int state;
private final String descp;
UserState(int state, String descp) {
this.state = state;
this.descp = descp;
}
@Override
public Integer getValue() {
return state;
}
@Override
public String getDescription() {
return descp;
}
}
public interface IBaseEnum<T extends Serializable> extends IEnum<T>{
String getDescription();
}注:推荐加注解的方式,GradeEnum这个枚举想要插入String类型,用Fastjson进行序列化。
测试类
@SpringBootTest
class SampleEnumApplicationTests {
@Resource
private UserMapper mapper;
@Test
public void insert() {
User user = new User();
user.setName("K神");
user.setAge(AgeEnum.ONE);
user.setGrade(GradeEnum.HIGH);
user.setGender(GenderEnum.MALE);
user.setEmail("abc@mp.com");
user.setUserState(UserState.ACTIVE);
Assert.assertTrue(mapper.insert(user) > 0);
// 成功直接拿会写的 ID
System.err.println("\n插入成功 ID 为:" + user.getId());
List<User> list = mapper.selectList(null);
for (User u : list) {
System.out.println(u);
Assert.assertNotNull("age should not be null", u.getAge());
if (u.getId().equals(user.getId())) {
Assert.assertNotNull("gender should not be null", u.getGender());
Assert.assertNotNull("grade should not be null", u.getGrade());
}
}
}
@Test
public void delete() {
Assert.assertTrue(mapper.delete(new QueryWrapper<User>()
.lambda().eq(User::getAge, AgeEnum.TWO)) > 0);
}
@Test
public void update() {
Assert.assertTrue(mapper.update(new User().setAge(AgeEnum.TWO),
new QueryWrapper<User>().eq("age", AgeEnum.THREE)) > 0);
}
@Test
public void select() {
User user = mapper.selectOne(new QueryWrapper<User>().lambda().eq(User::getId, 2));
Assert.assertEquals("Jack", user.getName());
Assert.assertTrue(AgeEnum.THREE == user.getAge());
//#1500 github: verified ok. Not a bug
List<User> userList = mapper.selectList(new QueryWrapper<User>().lambda().eq(User::getUserState, UserState.ACTIVE));
Assert.assertEquals(3, userList.size());
Optional<User> userOptional = userList.stream()
.filter(x -> x.getId() == 1)
.findFirst();
userOptional.ifPresent(user1 -> Assert.assertTrue(user1.getUserState() == UserState.ACTIVE));
}
}测试结果
Consume Time:0 ms 2019-10-31 14:42:38
Execute SQL:INSERT INTO user ( id, gender, user_state, grade, name, age, email ) VALUES ( 1189794788921081858, 0, 1, '高中', 'K神', 1, 'abc@mp.com' )
插入成功 ID 为:1189794788921081858
Consume Time:6 ms 2019-10-31 14:42:38
Execute SQL:SELECT id,gender,user_state,grade,name,age,email FROM user

SpringBoot与MybatisPlus3.X整合之通用枚举(十二)的更多相关文章
- Spring+SpringMVC+MyBatis+easyUI整合基础篇(十二)阶段总结
不知不觉,已经到了基础篇的收尾阶段了,看着前面的十几篇文章,真的有点不敢相信,自己竟然真的坚持了下来,虽然过程中也有过懒散和焦虑,不过结果还是自己所希望的,克服了很多的问题,将自己的作品展现出来,也发 ...
- SpringBoot与MybatisPlus3.X整合示例(十六)
包含 分页.逻辑删除.自定义全局操作 等绝大部分常用功能的使用示例,相当于大整合的完整示例 pom.xml <dependencies> <dependency> <gr ...
- SpringBoot与MybatisPlus3.X整合之字段类型处理器(八)
pom.xml <dependencies> <dependency> <groupId>org.springframework.boot</groupId& ...
- SpringBoot与MybatisPlus3.X整合之动态表名 SQL 解析器(七)
pom.xml <dependencies> <dependency> <groupId>org.springframework.boot</groupId& ...
- Spring+SpringMVC+MyBatis+easyUI整合优化篇(十二)数据层优化-explain关键字及慢sql优化
本文提要 从编码角度来优化数据层的话,我首先会去查一下项目中运行的sql语句,定位到瓶颈是否出现在这里,首先去优化sql语句,而慢sql就是其中的主要优化对象,对于慢sql,顾名思义就是花费较多执行时 ...
- Spring+SpringMVC+MyBatis+easyUI整合进阶篇(十二)Spring集成Redis缓存
作者:13 GitHub:https://github.com/ZHENFENG13 版权声明:本文为原创文章,未经允许不得转载. 整合Redis 本来以为类似的Redis教程和整合代码应该会很多,因 ...
- Spring+SpringMVC+MyBatis+easyUI整合进阶篇(十五)阶段总结
作者:13 GitHub:https://github.com/ZHENFENG13 版权声明:本文为原创文章,未经允许不得转载. 一 每个阶段在结尾时都会有一个阶段总结,在<SSM整合基础篇& ...
- 新手之:SpringBoot ——Reids主从哨兵整合(CentOS7)
一.Redis主从搭建(一台服务器模拟多个端口) 结构图:) 1.确保安装了Redis,我装在了/opt/redis目录下.可通过"whereis redis-cli"命令查看是否 ...
- (七) SpringBoot起飞之路-整合SpringSecurity(Mybatis、JDBC、内存)
兴趣的朋友可以去了解一下前五篇,你的赞就是对我最大的支持,感谢大家! (一) SpringBoot起飞之路-HelloWorld (二) SpringBoot起飞之路-入门原理分析 (三) Sprin ...
随机推荐
- profile文件的错误加载与基本命令间的映射
一.绪论 [因为这篇心得是原创的,所以如果有哪处总结或者意见不足的地方,欢迎各位大神的批评和意见,共同学习,谢谢了!] 早些时候,需要在centos6.4系统中配置单机版和集群版单节点的hadoop ...
- <<Java并发编程的艺术>>-阅读笔记和思维导图
最近在坚持每天阅读<>,不但做好笔记(MarkDown格式),还做好思维导图. 如果大家感兴趣,可以可以到码云上阅读笔记和到ProcessOn上阅读思维导图. 码云:https://git ...
- Eclipse的Debug(一)
本文链接:https://blog.csdn.net/u011781521/article/details/55000066 http://blog.csdn.net/u010075335/ar ...
- 修复IScroll点击无效,增加scrollTo数值容错处理
个人博客: https://chenjiahao.xyz ============== 最近半年都处于一个非常忙碌的状态,直到现在才有功夫腾出时间记录这段时间以来踩过的一个个坑. 今天先记录关于ISc ...
- Python 爬虫(四):Selenium 框架
Selenium 是一个用于测试 Web 应用程序的框架,该框架测试直接在浏览器中运行,就像真实用户操作一样.它支持多种平台:Windows.Linux.Mac,支持多种语言:Python.Perl. ...
- python爬虫之基本类库
简单梳理一下爬虫原理: 1.发送请求 通过HTTP库向目标站点发起请求,即发送一个Request,请求可以包含额外的headers等信息,等待服务器响应. 2.获取响应内容 如果服务器能正常响应(正常 ...
- 选择高性能NoSQL数据库的5个步骤
来源:Redislabs作者:Shabih Syed 翻译:Kevin (公众号:中间件小哥) 构建在线和运营应用程序的开发团队越来越多地选择一类新的数据库来支持它们.它被称为“NoSQL”或“Not ...
- JavaEE——JSP开发模式(model1)
model1开发模式 工作流程: ①浏览器请求,JSP页面接收 ②JSP根据请求和JavaBean进行交互 ③JavaBean进行业务处理,JDBC操纵数据库 ④JSP将请求结果返回浏览器页面 利用m ...
- 我们一起学Python之——认识Python"规则"
前言: 开学后,跟预想的一样,开学第一天我们就开了Python,虽然之前早就预料到了,但对于一直学Java的我来说,内心还是有一些涟漪的.总归还是要接受的,还不如振作起来,认真对待.我决定从最简单并且 ...
- Python3数据分析与挖掘建模实战 ☝☝☝
Python3数据分析与挖掘建模实战 Python数据分析简介 Python入门 运行:cmd下"python hello.py" 基本命令: 第三方库 安装 Windows中 p ...