信息发布→ 登录 注册 退出

MyBatis-Plus枚举和自定义主键ID的实现步骤

发布时间:2026-01-11

点击量:
目录
  • 一、枚举
    • 步骤一:编写配置文件
    • 步骤二:编写枚举类
    •  步骤三:更改实体类
  • 二、自定义ID生成器
    • 步骤一:编写主键策略
    • 步骤二:注册到容器中
    • 步骤三:修改实体类的主键策略
    • 步骤四:测试
  • 小结

    一、枚举

    当我们在开发时,在往数据库表的某个属性字段插入数据时,希望把这个值限定在一定的范围,例如性别,只有男和女,而年级只有小学,初中,高中。通过这样子的规范可以让我们的代码看起来更加简洁,MyBatis-Plus中也提供了这样的一个功能。

    步骤一:编写配置文件

    #枚举类所在的包
    mybatis-plus.type-enums-package=com.yixin.myenum
    mybatis-plus.configuration.default-enum-type-handler=org.apache.ibatis.type.EnumOrdinalTypeHandler    

    步骤二:编写枚举类

    Tip:我们将枚举类放在com.yixin.myenum这个包下。

    @EnumValue的作用就是将我们的描述(小学,中心,高中,大学)插入数据库,如果没有这个注解,那么插入的就是枚举前面的编号(1,2,3,4)。 

    package com.yixin.myenum;
     
    import com.baomidou.mybatisplus.annotation.EnumValue;
     
    public enum GradeEnum {
        PRIMARY(1, "小学"),
        SECONDORY(2, "中学"),
        HIGH(3, "高中"),
        UNIVERSITY(4, "大学");
     
        private int code;
     
       @EnumValue//描述作为枚举值保存到数据库
        private String desc;
     
        GradeEnum(int code, String desc) {
            this.code = code;
            this.desc = desc;
        }
     
        public int getCode() {
            return code;
        }
     
        public void setCode(int code) {
            this.code = code;
        }
     
        public String getDesc() {
            return desc;
        }
     
        public void setDesc(String desc) {
            this.desc = desc;
        }
    }

     步骤三:更改实体类

    将我们的实体类的属性类型更替为我们相对应的枚举

    package com.yixin.pojo;
     
    import com.baomidou.mybatisplus.annotation.IdType;
    import com.baomidou.mybatisplus.annotation.TableId;
    import com.baomidou.mybatisplus.annotation.TableLogic;
    import com.baomidou.mybatisplus.annotation.Version;
    import com.yixin.myenum.GradeEnum;
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
     
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class Student {
     
        @TableId(type = IdType.AUTO)
        private Long id;
        private String name;
        private Integer age;
        //枚举类型
        private GradeEnum grade;
     
    }

    这样就可以了!

    我们进行测试:

        @Test
        void test2() {
     
            Student student=new Student();
            student.setAge(18);
            student.setName("一心同学");
            student.setGrade(GradeEnum.UNIVERSITY);
     
            int result=studentMapper.insert(student);
            System.out.println(result);
     
        }

    控制台输出:

    数据库:

    可以发现,已经成功将我们的grade数据插进去了。

    二、自定义ID生成器

    数据库准备

    DROP TABLE IF EXISTS `student`;
     
    CREATE TABLE `student` (
      `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
      `name` varchar(20) DEFAULT NULL COMMENT '名字',
      `age` int DEFAULT NULL COMMENT '年龄',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

    步骤一:编写主键策略

    注意:我这里导入mybatis-plus-boot-starter版本3.4.0,因为如果是低版本的话是没有IdentifierGenerator这个类的。

            <!-- mybatis-plus -->
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-boot-starter</artifactId>
                <version>3.4.0</version>
            </dependency>

    需要重写方法nextId,这个方法返回的值就是我们的主键ID,前面的代码主要是为了后台输出方便查看。

    我们的策略是随机生成100以内的数字充当主键(当然,在开发中不会这样,这里这是为了演示自定义主键的功能)

    package com.yixin.config;
     
    import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator;
    import org.apache.ibatis.reflection.MetaObject;
    import org.apache.ibatis.reflection.SystemMetaObject;
     
    import java.util.Random;
    import java.util.concurrent.atomic.AtomicLong;
     
    public class StudentIdGenerator implements IdentifierGenerator {
     
        Random random=new Random();
     
        @Override
        public Long nextId(Object entity) {
            //可以将当前传入的class全类名来作为bizKey或者提取参数来生成bizKey进行分布式Id调用生成
            String bizKey = entity.getClass().getName();
            System.out.println("bizKey:" + bizKey);
            MetaObject metaObject = SystemMetaObject.forObject(entity);
            String name = (String) metaObject.getValue("name");
     
          final long id=random.nextInt(100);
            System.out.println("为" + name + "生成主键值->:" + id);
            return id;
        }
    }

    步骤二:注册到容器中

    package com.yixin.config;
     
     
    import com.baomidou.mybatisplus.core.incrementer.IdentifierGenerator;
    import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.transaction.annotation.EnableTransactionManagement;
     
    // 扫描我们的 mapper 文件夹
    @MapperScan("com.yixin.mapper")
    @EnableTransactionManagement
    @Configuration // 配置类
    public class MyBatisPlusConfig {
     
        @Bean
        public IdentifierGenerator customIdGenerator(){
            return new StudentIdGenerator();
        }
    }

    步骤三:修改实体类的主键策略

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

    步骤四:测试

        @Test
        void test2() {
            
            Student student=new Student();
            student.setAge(20);
            student.setName("一心同学");
            student.setGrade(GradeEnum.UNIVERSITY);
     
            int result=studentMapper.insert(student);
            System.out.println(result);
        }

    后台输出:

    数据库:

    可以发现,我们自定义的主键策略就生效了!

    小结

    在线客服
    服务热线

    服务热线

    4008888355

    微信咨询
    二维码
    返回顶部
    ×二维码

    截屏,微信识别二维码

    打开微信

    微信号已复制,请打开微信添加咨询详情!