一 通用枚举

解决了繁琐的配置,让 mybatis 优雅的使用枚举属性!

3.1.0开始,可配置默认枚举处理类来省略扫描通用枚举配置 默认枚举配置

  • 升级说明:

    3.1.0 以下版本改变了原生默认行为,升级时请将默认枚举设置为EnumOrdinalTypeHandler

  • 影响用户:

    实体中使用原生枚举

  • 其他说明:

    配置枚举包扫描的时候能提前注册使用注解枚举的缓存

  • 推荐配置:

    • 使用实现

      1. IEnum

      接口

      • 推荐配置defaultEnumTypeHandler

    • 使用注解枚举处理

      • 推荐配置typeEnumsPackage

    • 注解枚举处理与

      1. IEnum

      接口

      • 推荐配置typeEnumsPackage

    • 与原生枚举混用

      • 需配置defaultEnumTypeHandlertypeEnumsPackage

申明通用枚举属性

方式一: 使用 @EnumValue 注解枚举属性 完整示例

  1. public enum GradeEnum {

  2. PRIMARY(1, "小学"), SECONDORY(2, "中学"), HIGH(3, "高中");

  3. GradeEnum(int code, String descp) {
  4. this.code = code;
  5. this.descp = descp;
  6. }

  7. @EnumValue//标记数据库存的值是code
  8. private final int code;
  9. //。。。
  10. }

方式二: 枚举属性,实现 IEnum 接口如下:

  1. public enum AgeEnum implements IEnum<Integer> {
  2. ONE(1, "一岁"),
  3. TWO(2, "二岁"),
  4. THREE(3, "三岁");
  5.  
  6. private int value;
  7. private String desc;
  8.  
  9. @Override
  10. public Integer getValue() {
  11. return this.value;
  12. }
  13. }

实体属性使用枚举类型

  1. public class User{
  2. /**
  3. * 名字
  4. * 数据库字段: name varchar(20)
  5. */
  6. private String name;
  7.  
  8. /**
  9. * 年龄,IEnum接口的枚举处理
  10. * 数据库字段:age INT(3)
  11. */
  12. private AgeEnum age;
  13.  
  14. /**
  15. * 年级,原生枚举(带{@link com.baomidou.mybatisplus.annotation.EnumValue}):
  16. * 数据库字段:grade INT(2)
  17. */
  18. private GradeEnum grade;
  19. }

二 代码

  • pom.xml

    1. <dependencies>
    2. <dependency>
    3. <groupId>org.springframework.boot</groupId>
    4. <artifactId>spring-boot-starter</artifactId>
    5. </dependency>
    6. <dependency>
    7. <groupId>com.baomidou</groupId>
    8. <artifactId>mybatis-plus-boot-starter</artifactId>
    9. <version>3.2.0</version>
    10. </dependency>
    11. <dependency>
    12. <groupId>org.projectlombok</groupId>
    13. <artifactId>lombok</artifactId>
    14. </dependency>
    15. <!-- https://mvnrepository.com/artifact/p6spy/p6spy -->
    16. <dependency>
    17. <groupId>p6spy</groupId>
    18. <artifactId>p6spy</artifactId>
    19. <version>3.8.0</version>
    20. </dependency>
    21. <dependency>
    22. <groupId>com.h2database</groupId>
    23. <artifactId>h2</artifactId>
    24. <scope>runtime</scope>
    25. </dependency>

    26. <dependency>
    27. <groupId>com.alibaba</groupId>
    28. <artifactId>fastjson</artifactId>
    29. <version>1.2.49</version>
    30. <scope>test</scope>
    31. </dependency>
    32. <!-- for testing -->
    33. <dependency>
    34. <groupId>org.springframework.boot</groupId>
    35. <artifactId>spring-boot-starter-test</artifactId>
    36. <scope>test</scope>
    37. </dependency>
    38. <dependency>
    39. <groupId>com.alibaba</groupId>
    40. <artifactId>fastjson</artifactId>
    41. <version>RELEASE</version>
    42. <scope>compile</scope>
    43. </dependency>
    44. </dependencies>
  • application.yml

    1. spring:
    2. datasource:
    3. driver-class-name: com.p6spy.engine.spy.P6SpyDriver
    4. url: jdbc:p6spy:h2:tcp://192.168.180.115:19200/~/mem/test
    5. username: root
    6. password: test

    7. # MP 配置
    8. mybatis-plus:
    9. type-enums-package: com.mp.sampleenum.enums
    10. configuration:
    11. # 3.0.8之前版本问题默认将枚举注册为EnumOrdinalTypeHandler,这是错误的方式,默认是 org.apache.ibatis.type.EnumTypeHandler
    12. # 如果项目之中实体统一使用IEnum或注解的方式,可配置成 com.baomidou.mybatisplus.extension.handlers.EnumTypeHandler,也可省略上面的type-enums-package配置
    13. # 配置type-enums-package只对注解方式的枚举处理能提前加载缓存.
    14. default-enum-type-handler: org.apache.ibatis.type.EnumOrdinalTypeHandler
  • 配置类

    1. @Configuration
    2. @MapperScan("com.mp.sampleenum.mapper")
    3. public class MybatisPlusConfig {

    4. }
  • 实体类

    1. @EqualsAndHashCode(callSuper = true)
    2. @Data
    3. @Accessors(chain = true)
    4. public class User extends BaseEntity {

    5. private String name;

    6. private String email;

    7. /**
    8. * IEnum接口的枚举处理
    9. */
    10. private AgeEnum age;

    11. /**
    12. * 原生枚举: 默认使用枚举值顺序: 0:MALE, 1:FEMALE
    13. */

    14. private GenderEnum gender;

    15. /**
    16. * 原生枚举(带{@link com.baomidou.mybatisplus.annotation.EnumValue}):
    17. * 数据库的值对应该注解对应的属性
    18. */
    19. @JSONField(serialzeFeatures= SerializerFeature.WriteEnumUsingToString)
    20. private GradeEnum grade;


    21. private UserState userState;

    22. }

    23. @Data
    24. @Accessors(chain = true)
    25. public class BaseEntity {
    26. private Long id;

    27. }
  • 枚举

    1. @Getter
    2. public enum AgeEnum implements IEnum<Integer> {
    3. ONE(1, "一岁"),
    4. TWO(2, "二岁"),
    5. THREE(3, "三岁");

    6. private final int value;
    7. private final String desc;

    8. AgeEnum(final int value, final String desc) {
    9. this.value = value;
    10. this.desc = desc;
    11. }

    12. @Override
    13. public Integer getValue() {
    14. return value;
    15. }
    16. }


    17. public enum GenderEnum {
    18. MALE,
    19. FEMALE;
    20. }

    21. @Getter
    22. //@JSONType(serializeEnumAsJavaBean = true)
    23. public enum GradeEnum {

    24. PRIMARY(1, "小学"),
    25. SECONDORY(2, "中学"),
    26. HIGH(3, "高中");

    27. GradeEnum(int code, String descp) {
    28. this.code = code;
    29. this.descp = descp;
    30. }

    31. //@EnumValue
    32. private final int code;
    33. @EnumValue
    34. private final String descp;

    35. }


    36. @Getter
    37. public enum UserState implements IBaseEnum<Integer> {

    38. ACTIVE(1, "A"),
    39. INACTIVE(2, "I");

    40. private final int state;
    41. private final String descp;

    42. UserState(int state, String descp) {
    43. this.state = state;
    44. this.descp = descp;

    45. }

    46. @Override
    47. public Integer getValue() {
    48. return state;
    49. }

    50. @Override
    51. public String getDescription() {
    52. return descp;
    53. }
    54. }

    55. public interface IBaseEnum<T extends Serializable> extends IEnum<T>{

    56. String getDescription();
    57. }

    注:推荐加注解的方式,GradeEnum这个枚举想要插入String类型,用Fastjson进行序列化。

  • 测试类

    1. @SpringBootTest
    2. class SampleEnumApplicationTests {

    3. @Resource
    4. private UserMapper mapper;

    5. @Test
    6. public void insert() {
    7. User user = new User();
    8. user.setName("K神");
    9. user.setAge(AgeEnum.ONE);
    10. user.setGrade(GradeEnum.HIGH);
    11. user.setGender(GenderEnum.MALE);
    12. user.setEmail("abc@mp.com");
    13. user.setUserState(UserState.ACTIVE);
    14. Assert.assertTrue(mapper.insert(user) > 0);
    15. // 成功直接拿会写的 ID
    16. System.err.println("\n插入成功 ID 为:" + user.getId());

    17. List<User> list = mapper.selectList(null);
    18. for (User u : list) {
    19. System.out.println(u);
    20. Assert.assertNotNull("age should not be null", u.getAge());
    21. if (u.getId().equals(user.getId())) {
    22. Assert.assertNotNull("gender should not be null", u.getGender());
    23. Assert.assertNotNull("grade should not be null", u.getGrade());

    24. }
    25. }
    26. }

    27. @Test
    28. public void delete() {
    29. Assert.assertTrue(mapper.delete(new QueryWrapper<User>()
    30. .lambda().eq(User::getAge, AgeEnum.TWO)) > 0);
    31. }

    32. @Test
    33. public void update() {
    34. Assert.assertTrue(mapper.update(new User().setAge(AgeEnum.TWO),
    35. new QueryWrapper<User>().eq("age", AgeEnum.THREE)) > 0);
    36. }

    37. @Test
    38. public void select() {
    39. User user = mapper.selectOne(new QueryWrapper<User>().lambda().eq(User::getId, 2));
    40. Assert.assertEquals("Jack", user.getName());
    41. Assert.assertTrue(AgeEnum.THREE == user.getAge());

    42. //#1500 github: verified ok. Not a bug
    43. List<User> userList = mapper.selectList(new QueryWrapper<User>().lambda().eq(User::getUserState, UserState.ACTIVE));
    44. Assert.assertEquals(3, userList.size());
    45. Optional<User> userOptional = userList.stream()
    46. .filter(x -> x.getId() == 1)
    47. .findFirst();
    48. userOptional.ifPresent(user1 -> Assert.assertTrue(user1.getUserState() == UserState.ACTIVE));
    49. }

    50. }
    1.  
  • 测试结果

    1. Consume Time0 ms 2019-10-31 14:42:38
    2. Execute SQLINSERT INTO user ( id, gender, user_state, grade, name, age, email ) VALUES ( 1189794788921081858, 0, 1, '高中', 'K神', 1, 'abc@mp.com' )


    3. 插入成功 ID 为:1189794788921081858
    4. Consume Time6 ms 2019-10-31 14:42:38
    5. Execute SQLSELECT id,gender,user_state,grade,name,age,email FROM user

SpringBoot与MybatisPlus3.X整合之通用枚举(十二)的更多相关文章

  1. Spring+SpringMVC+MyBatis+easyUI整合基础篇(十二)阶段总结

    不知不觉,已经到了基础篇的收尾阶段了,看着前面的十几篇文章,真的有点不敢相信,自己竟然真的坚持了下来,虽然过程中也有过懒散和焦虑,不过结果还是自己所希望的,克服了很多的问题,将自己的作品展现出来,也发 ...

  2. SpringBoot与MybatisPlus3.X整合示例(十六)

    包含 分页.逻辑删除.自定义全局操作 等绝大部分常用功能的使用示例,相当于大整合的完整示例 pom.xml <dependencies> <dependency> <gr ...

  3. SpringBoot与MybatisPlus3.X整合之字段类型处理器(八)

    pom.xml <dependencies> <dependency> <groupId>org.springframework.boot</groupId& ...

  4. SpringBoot与MybatisPlus3.X整合之动态表名 SQL 解析器(七)

    pom.xml <dependencies> <dependency> <groupId>org.springframework.boot</groupId& ...

  5. Spring+SpringMVC+MyBatis+easyUI整合优化篇(十二)数据层优化-explain关键字及慢sql优化

    本文提要 从编码角度来优化数据层的话,我首先会去查一下项目中运行的sql语句,定位到瓶颈是否出现在这里,首先去优化sql语句,而慢sql就是其中的主要优化对象,对于慢sql,顾名思义就是花费较多执行时 ...

  6. Spring+SpringMVC+MyBatis+easyUI整合进阶篇(十二)Spring集成Redis缓存

    作者:13 GitHub:https://github.com/ZHENFENG13 版权声明:本文为原创文章,未经允许不得转载. 整合Redis 本来以为类似的Redis教程和整合代码应该会很多,因 ...

  7. Spring+SpringMVC+MyBatis+easyUI整合进阶篇(十五)阶段总结

    作者:13 GitHub:https://github.com/ZHENFENG13 版权声明:本文为原创文章,未经允许不得转载. 一 每个阶段在结尾时都会有一个阶段总结,在<SSM整合基础篇& ...

  8. 新手之:SpringBoot ——Reids主从哨兵整合(CentOS7)

    一.Redis主从搭建(一台服务器模拟多个端口) 结构图:) 1.确保安装了Redis,我装在了/opt/redis目录下.可通过"whereis redis-cli"命令查看是否 ...

  9. (七) SpringBoot起飞之路-整合SpringSecurity(Mybatis、JDBC、内存)

    兴趣的朋友可以去了解一下前五篇,你的赞就是对我最大的支持,感谢大家! (一) SpringBoot起飞之路-HelloWorld (二) SpringBoot起飞之路-入门原理分析 (三) Sprin ...

随机推荐

  1. Python采集VIP收费QQ音乐,一起来听周董最新的《说好不哭》,省3块不香吗?

    环境: windows python3.6.5 模块: requests selenium json re urllib 环境与模块介绍完毕后,就可以来实行我们的操作了. 第1步: 通过一个解析网站: ...

  2. CSS3 box-shadow阴影

    box-shadow: color x-offset v-offset blur spred color: 阴影的颜色 x-offset: 阴影水平距离; 0: 左右阴影平分:正值:阴影在对象的右侧: ...

  3. jQuery返回顶部和在线客服网站侧边栏

    效果图: 全部代码: <!DOCTYPE html> <html> <head> <title></title> <style typ ...

  4. wordpress新注册用户或重置密码链接失效

    在网上找了好多个博客,一个比一个不要脸,要更改的是两个文件,最后都抄成一个文件了. 原文链接https://www.cnblogs.com/liudecai/p/6474611.html 我是按照这个 ...

  5. Yii2搭建后台并实现rbac权限控制完整实例教程

    .安装yii2 未安装的请参考yii2史上最简单式安装教程,没有之一 已安装的请继续看下一步操作 2.配置数据库 2.1 配置数据库 修改common/config/main-local.php 实际 ...

  6. LeetCode正则表达式匹配

    题目描述 给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配. '.' 匹配任意单个字符 '*' 匹配零个或多个前面的那一个元素 所谓匹配,是要涵盖 整个 ...

  7. Spring Boot (十一): Spring Boot 定时任务

    在实际的项目开发工作中,我们经常会遇到需要做一些定时任务的工作,那么,在 Spring Boot 中是如何实现的呢? 1. 添加依赖 在 pom.xml 文件中只需引入 spring-boot-sta ...

  8. 软件开发工具(第9章:使用Eclipse进行C/C++开发)

    一.安装MinGW MinGW是指用来生成可执行文件的编译环境,它是开发C/C++项目 的工具集.为了能够使用Eclipse CDT编译且运行C和C++程序,必须 要安装一个C/C++编译器. 下载: ...

  9. Spring Boot2 系列教程(十)Spring Boot 整合 Freemarker

    今天来聊聊 Spring Boot 整合 Freemarker. Freemarker 简介 这是一个相当老牌的开源的免费的模版引擎.通过 Freemarker 模版,我们可以将数据渲染成 HTML ...

  10. .NET进阶篇03-Reflection反射、Attribute特性

    知识需要不断积累.总结和沉淀,思考和写作是成长的催化剂 内容目录 一.概述二.反射1.反射使用2.创建对象3.调用方法4.字段属性三.特性四.总结 一.概述 反射其实无处不在,我们用VS进行调试时候, ...