MyBatis-Plus枚舉和自定義主鍵ID的實(shí)現(xiàn)步驟
一、枚舉
當(dāng)我們?cè)陂_發(fā)時(shí),在往數(shù)據(jù)庫表的某個(gè)屬性字段插入數(shù)據(jù)時(shí),希望把這個(gè)值限定在一定的范圍,例如性別,只有男和女,而年級(jí)只有小學(xué),初中,高中。通過這樣子的規(guī)范可以讓我們的代碼看起來更加簡(jiǎn)潔,MyBatis-Plus中也提供了這樣的一個(gè)功能。
??步驟一:編寫配置文件
#枚舉類所在的包 mybatis-plus.type-enums-package=com.yixin.myenum mybatis-plus.configuration.default-enum-type-handler=org.apache.ibatis.type.EnumOrdinalTypeHandler
??步驟二:編寫枚舉類
Tip:我們將枚舉類放在com.yixin.myenum這個(gè)包下。
@EnumValue的作用就是將我們的描述(小學(xué),中心,高中,大學(xué))插入數(shù)據(jù)庫,如果沒有這個(gè)注解,那么插入的就是枚舉前面的編號(hào)(1,2,3,4)。
package com.yixin.myenum;
import com.baomidou.mybatisplus.annotation.EnumValue;
public enum GradeEnum {
PRIMARY(1, "小學(xué)"),
SECONDORY(2, "中學(xué)"),
HIGH(3, "高中"),
UNIVERSITY(4, "大學(xué)");
private int code;
@EnumValue//描述作為枚舉值保存到數(shù)據(jù)庫
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;
}
}??步驟三:更改實(shí)體類
將我們的實(shí)體類的屬性類型更替為我們相對(duì)應(yīng)的枚舉
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;
}這樣就可以了!
我們進(jìn)行測(cè)試:
@Test
void test2() {
Student student=new Student();
student.setAge(18);
student.setName("一心同學(xué)");
student.setGrade(GradeEnum.UNIVERSITY);
int result=studentMapper.insert(student);
System.out.println(result);
}控制臺(tái)輸出:

數(shù)據(jù)庫:

可以發(fā)現(xiàn),已經(jīng)成功將我們的grade數(shù)據(jù)插進(jìn)去了。
二、自定義ID生成器
??數(shù)據(jù)庫準(zhǔn)備
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;
??步驟一:編寫主鍵策略
注意:我這里導(dǎo)入mybatis-plus-boot-starter版本3.4.0,因?yàn)槿绻堑桶姹镜脑捠菦]有IdentifierGenerator這個(gè)類的。
<!-- mybatis-plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.0</version>
</dependency>需要重寫方法nextId,這個(gè)方法返回的值就是我們的主鍵ID,前面的代碼主要是為了后臺(tái)輸出方便查看。
我們的策略是隨機(jī)生成100以內(nèi)的數(shù)字充當(dāng)主鍵(當(dāng)然,在開發(fā)中不會(huì)這樣,這里這是為了演示自定義主鍵的功能)
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) {
//可以將當(dāng)前傳入的class全類名來作為bizKey或者提取參數(shù)來生成bizKey進(jìn)行分布式Id調(diào)用生成
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;
}
}??步驟二:注冊(cè)到容器中
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();
}
}??步驟三:修改實(shí)體類的主鍵策略
@TableId(type = IdType.ASSIGN_ID)
private Long id;??步驟四:測(cè)試
@Test
void test2() {
Student student=new Student();
student.setAge(20);
student.setName("一心同學(xué)");
student.setGrade(GradeEnum.UNIVERSITY);
int result=studentMapper.insert(student);
System.out.println(result);
}后臺(tái)輸出:

數(shù)據(jù)庫:

可以發(fā)現(xiàn),我們自定義的主鍵策略就生效了!
小結(jié)
到此這篇關(guān)于MyBatis-Plus枚舉和自定義主鍵ID的文章就介紹到這了,更多相關(guān)MyBatis-Plus枚舉和自定義主鍵ID內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot無法請(qǐng)求html等靜態(tài)資源文件webapp或者resources/static的問題及解決方案
今天遇到一個(gè)問題無法訪問靜態(tài)資源文件,html,本文給大家分享SpringBoot無法請(qǐng)求html等靜態(tài)資源文件webapp或者resources/static的問題及解決方案,感興趣的朋友一起看看吧2024-05-05
Java System類兩個(gè)常用方法代碼實(shí)例
這篇文章主要介紹了Java System類兩個(gè)常用方法代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02
java實(shí)現(xiàn)遠(yuǎn)程桌面的實(shí)例代碼
下面小編就為大家分享一篇java實(shí)現(xiàn)遠(yuǎn)程桌面的實(shí)例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-01-01
Eclipse?IDE中如何設(shè)置JVM啟動(dòng)參數(shù)
這篇文章主要介紹了Eclipse?IDE中如何設(shè)置JVM啟動(dòng)參數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06
Spring Boot如何使用Undertow代替Tomcat
這篇文章主要介紹了Spring Boot如何使用Undertow代替Tomcat,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09
Java設(shè)計(jì)模式之備忘錄模式_動(dòng)力節(jié)點(diǎn)Java學(xué)院
我們?cè)诰幊痰臅r(shí)候,經(jīng)常需要保存對(duì)象的中間狀態(tài),當(dāng)需要的時(shí)候,可以恢復(fù)到這個(gè)狀態(tài)。接下來通過本文給大家分享java設(shè)計(jì)模式之備忘錄模式,感興趣的的朋友一起看看吧2017-08-08
鑒權(quán)認(rèn)證+aop+注解+過濾feign請(qǐng)求的實(shí)例
這篇文章主要介紹了鑒權(quán)認(rèn)證+aop+注解+過濾feign請(qǐng)求的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
RocketMq同組消費(fèi)者如何自動(dòng)設(shè)置InstanceName
這篇文章主要介紹了RocketMq同組消費(fèi)者如何自動(dòng)設(shè)置InstanceName問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06

