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

目录
  • 一、枚举
    • 步骤一:编写配置文件
    • 步骤二:编写枚举类
    • 步骤三:更改实体类
  • 二、自定义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内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • mybatis-plus主键生成策略

    MP 支持多种主键策略 默认是推特的"" 雪花算法"" ,也可以设置其他策略下面我演示主键策略使用 MP的主键定义在一个一个枚举类中 源码如下 public enum IdType { AUTO(0),//数据库自增 依赖数据库 NONE(1),// 表示该类型未甚至主键类型 (如果没有主键策略)默认根据雪花算法生成 INPUT(2),//用户输入ID(该类型可以通过自己注册填充插件进行填充) //下面这三种类型,只有当插入对象id为空时 才会自动填充. ID_WO

  • Mybatis-plus实现主键自增和自动注入时间的示例代码

    mybatis-plus依赖导入 <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.3.2</version> </dependency> 建议使用3.3.0后的版本. 导入mybatis-plus就不用导入mybatis了,冲突! 连接数据库 sp

  • mybatis-plus id主键生成的坑

    简要说明 由于mybatis-plus会自动插入一个id到实体对象, 不管你封装与否, 所以有时候导致一些意外的情况发生 默认是生成一个长数字字符串(编码不同可能结尾带有字母) 错误 ested exception is org.apache.ibatis.reflection.ReflectionException: Could not set property 'id' of 'class com.xxx' with value '1110423703487479810' Cause: ja

  • Mybatis-Plus通用枚举的使用详解

    解决了繁琐的配置,让 mybatis 优雅的使用枚举属性! 修改表结构 ALTER TABLE `tb_user` ADD COLUMN `sex` INT ( 1 ) NULL DEFAULT 1 COMMENT '1-男,2-女' AFTER `deleted`; 定义枚举 public enum SexEnum implements IEnum<Integer> { MAN(1, "男"), WOMAN(2, "女"); private int v

  • mybatis-plus主键id生成、字段自动填充的实现代码

    一.主键id的生成 数据库表里通常都会有一个主键id,来作为这条数据的唯一标识. 常见的方式 1.数据库自动增长 这种很常见了,可以做到全库唯一.因为id是天然排序的,对于涉及到排序的操作会很方便. 2.UUID 上面的自动增长,虽然简单,但是对于分表这样的操作来说就比较麻烦.因为你在第二张插入数据的时候,需要拿到上一张表最后一个数据的id. UUID则不同,每次都一个随机唯一的值,不过因为是随机,所以也就没有排序了. 3.redis redis也可以用来生成id,利用redis的原子操作.好处

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

    目录 一.枚举 步骤一:编写配置文件 步骤二:编写枚举类 步骤三:更改实体类 二.自定义ID生成器 步骤一:编写主键策略 步骤二:注册到容器中 步骤三:修改实体类的主键策略 步骤四:测试 小结 一.枚举 当我们在开发时,在往数据库表的某个属性字段插入数据时,希望把这个值限定在一定的范围,例如性别,只有男和女,而年级只有小学,初中,高中.通过这样子的规范可以让我们的代码看起来更加简洁,MyBatis-Plus中也提供了这样的一个功能. 步骤一:编写配置文件 #枚举类所在的包 mybatis-plu

  • Mybatis批量插入并返回主键id的方法

    目录 场景 错误 分析原因 排查问题 场景 在做商城的时候,sku表进行了拆分,sku的基本信息以及sku的库存表.因为库存会经常的变动,会导致行锁. 这里就是新增的时候,因为在新增商品的时候,会有多条sku的数据进行批量的插入,那么有批量插入sku基本信息以及批量插入sku的库存信息. 其中,就需要批量插入sku的基本信息的时候,返回主键id,这就能够在sku批量插入库存信息的时候能够插入skuId: 错误 nested exception is org.apache.ibatis.execu

  • MyBatis+MySQL 返回插入的主键ID的方法

    需求:使用MyBatis往MySQL数据库中插入一条记录后,需要返回该条记录的自增主键值. 方法:在mapper中指定keyProperty属性,示例如下: <insert id="insertAndGetId" useGeneratedKeys="true" keyProperty="userId" parameterType="com.chenzhou.mybatis.User"> insert into us

  • Mybatis批量插入返回插入成功后的主键id操作

    我们都知道Mybatis在插入单条数据的时候有两种方式返回自增主键: 1.对于支持生成自增主键的数据库:增加 useGenerateKeys和keyProperty ,<insert>标签属性. 2.不支持生成自增主键的数据库:使用<selectKey>. 但是怎么对批量插入数据返回自增主键的解决方式网上看到的还是比较少,至少百度的结果比较少. Mybatis官网资料提供如下: First, if your database supports auto-generated key

  • MyBatis insert实体如何返回主键

    目录 insert实体如何返回主键 一.insert 属性详解 二.Mapper接口 三.执行mapper.xml 返回主键 四.测试结果 六.批量插入 七.小结一下 Mybatis添加记录,返回主键id insert实体如何返回主键 一.insert 属性详解 parameterType:入参的全限定类名或类型别名 keyColumn:设置数据表自动生成的主键名.对特定数据库(如PostgreSQL),若自动生成的主键不是第一个字段则必须设置 keyProperty:默认值unset,用于设置

  • 如何用注解的方式实现Mybatis插入数据时返回自增的主键Id

    目录 用注解实现Mybatis插入数据返回自增的主键Id 设计数据库表 设计Java bean对象 添加mapper接口 Mybatis注解增(返回自增id) 删查改以及(一对一,一对多,多对多) 数据库表 目录结构 导入坐标(包) 配置文件 实体类 mapper接口编写 测试 用注解实现Mybatis插入数据返回自增的主键Id 我们在数据库表设计的时候,一般都会在表中设计一个自增的id作为表的主键.这个id也会关联到其它表的外键. 这就要求往表中插入数据时能返回表的自增id,用这个ID去给关联

  • Mybatis执行插入语句后并返回主键ID问题

    目录 1.MySQL数据库设置ID自增情况 2.使用UUID自增主键 3.mybatis-plus在执行插入语句后返回自定义ID 总结 我们知道JDBC可以实现插入语句后返回主键Id,那mybatis可以实现吗? 答案是肯定的. 1.MySQL数据库设置ID自增情况 <insert id="insertUser" parameterType="com.crush.mybatisplus.entity.User"> INSERT INTO tb_user

  • MyBatis获取数据库自生成的主键Id详解及实例代码

    MyBatis获取数据库自生成的主键Id详解及实例代码 在使用MySQL数据库时我们一般使用数据库的自增主键自动产生主键.如果在插入主表时,我们需要同时插入从表的数据,这时我们通常需要知道主表插入时自动产生的主键Id值. 下面介绍使用MyBatis进行插入时,如何同时获取数据库自生成的主键: 1.XML配置文件 <insert id="insert" parameterType="Person" useGeneratedKeys="true"

  • MyBatis在insert插入操作时返回主键ID的配置(推荐)

    很多时候,在向数据库插入数据时,需要保留插入数据的id,以便进行后续的update操作或者将id存入其他表作为外键. 但是,在默认情况下,insert操作返回的是一个int值,并且不是表示主键id,而是表示当前SQL语句影响的行数... 接下来,我们看看MyBatis如何在使用MySQL和Oracle做insert插入操作时将返回的id绑定到对象中. MySQL用法: <insert id="insert" parameterType="com.test.User&qu

  • mybatis中insert主键ID获取和多参数传递的示例代码

    一.插入数据主键ID获取 一般我们在做业务开发时,经常会遇到插入一条数据并使用到插入数据的ID情况.如果先插入在查询的话需要多一次sql查询,未免效率太低.因此mybatis也有提供插入数据并返回主键ID的方式.如下 1.Insert/update 1.1.属性解释 keyProperty selectKey 语句结果应该被设置的目标属性.如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表. resultType 结果的类型.MyBatis 通常可以推算出来,但是为了更加确定写上也不会有什

随机推荐