📢📢📢📣📣📣

哈喽!大家好,我是【一心同学】,一位上进心十足的【Java领域博主】!😜😜😜

✨【一心同学】的写作风格:喜欢用【通俗易懂】的文笔去讲解每一个知识点,而不喜欢用【高大上】的官方陈述。


✨【一心同学】博客的领域是【面向后端技术】的学习,未来会持续更新更多的【后端技术】以及【学习心得】。


✨如果有对【后端技术】感兴趣的【小可爱】,欢迎关注一心同学】💞💞💞


❤️❤️❤️感谢各位大可爱小可爱!❤️❤️❤️ 


目录

一、枚举

🔥步骤一:编写配置文件

🔥步骤二:编写枚举类

 🔥步骤三:更改实体类

二、自定义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);

    }

控制台输出:

Java Mybatis设置主键ID mybatis自定义主键_Java Mybatis设置主键ID

数据库:

Java Mybatis设置主键ID mybatis自定义主键_自定义主键策略_02

可以发现,已经成功将我们的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);
    }

后台输出:

Java Mybatis设置主键ID mybatis自定义主键_mybatis plus_03

数据库:

Java Mybatis设置主键ID mybatis自定义主键_自定义主键策略_04

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


小结

以上就是【一心同学】整理的MyBatis-Plus中的【枚举】和【自定义主键策略】,如果我们没有自定义主键策略,那么MP默认采用的是【雪花算法】进行主键生成。

如果这篇【文章】有帮助到你,希望可以给【一心同学】点个👍,创作不易,相比官方的陈述,我更喜欢用【通俗易懂】的文笔去讲解每一个知识点,如果有对【后端技术】感兴趣的小可爱,也欢迎关注❤️❤️❤️ 【一心同学】❤️❤️❤️,我将会给你带来巨大的【收获与惊喜】💕💕!