java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > MyBatis-Plus枚举和自定义主键ID

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

作者:一心同学

这篇文章主要给大家介绍了关于MyBatis-Plus枚举和自定义主键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);
    }

后台输出:

数据库:

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

小结

到此这篇关于MyBatis-Plus枚举和自定义主键ID的文章就介绍到这了,更多相关MyBatis-Plus枚举和自定义主键ID内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文