草庐IT

第十四章:mybatis-plus 自定义ID生成策略

lin000_0 2023-04-04 原文

在mybatis-plus中ID生成策略主要是注解@TableId(type=IdType,XXXX)来生成,主要有以下类别

public enum IdType {

AUTO(0), //数据库 ID 自增

NONE(1), //无状态,该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT)

INPUT(2), //insert 前自行 set 主键值

ASSIGN_ID(3), //自定义实现可以通过接口IdentifierGenerator的方法nextId来实现,默认是实现类DefaultIdentifierGenerator

ASSIGN_UUID(4); //分配 UUID

}

这里主要介绍一下自定义ID生成

1.生成CustomIdGenerator类

public class CustomIdGenerator implements IdentifierGenerator {

@Override

public Number nextId(Object entity) {

Date date=new Date();

System.out.println( date);

SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");

String id=format.format( date) ;

System.out.println( "generator id:"+id);

return Long.parseLong(id);

}

}

2.在Configuration类生成Bean

@Configuration

public class MybatisPlusConfig {

@Bean

public CustomIdGenerator customIdGenerator(){

return new CustomIdGenerator();

}

3.在实体类别指ID.Type为ASSIGN_ID

@Data

public class User extends Model<User> {

private Long id;

@TableId(type = IdType.ASSIGN_ID)

private String specid;

private String name;

private Integer age;

private String email;

private int deleted;

@TableField(fill = FieldFill.INSERT_UPDATE)

private LocalDateTime createtime;

@Version

private long version;

private String fab;

}

4.准备测试方法

@Test

public void testSave(){

for(long i=25;i<26;i++) {

User user = new User();

user.setId(400+i);

user.setAge((int)i+30);

user.setEmail("zoulinlin"+i+"@163.com");

user.setName("zouli"+i);

int row = userMapper.insert(user);

System.out.println(row);

}

}

运行log:

Wed Oct 12 15:01:36 GMT+08:00 2022

generator id:20221012150136

insertFill

2022-10-12 15:01:39.725 DEBUG 19684 --- [ main] c.m.service.mapper.UserMapper.insert : ==> Preparing: INSERT INTO user (specid, id, name, age, email, deleted, createtime, version, FAB) VALUES (?, ?, ?, ?, ?, ?, ?, ?, 'FAB1')

2022-10-12 15:01:39.772 DEBUG 19684 --- [ main] c.m.service.mapper.UserMapper.insert : ==> Parameters: 20221012150136(String), 425(Long), zouli25(String), 55(Integer), zoulinlin25@163.com(String), 0(Integer), 2022-10-12T15:01:36.866(LocalDateTime), 0(Long)

Consume Time:79 ms 2022-10-12 15:01:39

Execute SQL:INSERT INTO user (specid, id, name, age, email, deleted, createtime, version, FAB) VALUES ('20221012150136', 425, 'zouli25', 55, 'zoulinlin25@163.com', 0, '2022-10-12T15:01:36.866', 0, 'FAB1')

从上面可以看出我们生成的ID只能是数据值,那么如何我们想生成字符串的如何进行?

1.首先我们可以看一下接口IdentifierGenerator代码,里面有一个nextUUID方法,其实是给IdType.ASSIGN_UUID使用

public interface IdentifierGenerator {

default boolean assignId(Object idValue) {

return StringUtils.checkValNull(idValue);

}

Number nextId(Object entity);

default String nextUUID(Object entity) {

return IdWorker.get32UUID();

}

}

2.根据1中的理解在自定义ID生成类把nextUUID方法覆盖

public class CustomIdGenerator implements IdentifierGenerator {

@Override

public Number nextId(Object entity) {

Date date=new Date();

System.out.println( date);

SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");

String id=format.format( date) ;

System.out.println( "generator id:"+id);

return Long.parseLong(id);

}

@Override

public String nextUUID(Object entity) {

Date date=new Date();

System.out.println( date);

SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");

String id=format.format( date) ;

return "lot-"+id;

}

}

3.在实体中把id类型修改为ASSIGN_UUID

@Data

public class User extends Model<User> {

private Long id;

@TableId(type = IdType.ASSIGN_UUID)

private String specid;

private String name;

private Integer age;

private String email;

private int deleted;

@TableField(fill = FieldFill.INSERT_UPDATE)

private LocalDateTime createtime;

@Version

private long version;

private String fab;

}

4.准备测试方法

@Test

public void testSave(){

for(long i=26;i<27;i++) {

User user = new User();

user.setId(400+i);

user.setAge((int)i+30);

user.setEmail("zoulinlin"+i+"@163.com");

user.setName("zouli"+i);

int row = userMapper.insert(user);

System.out.println(row);

}

}

运行log

Wed Oct 12 15:09:44 GMT+08:00 2022

insertFill

2022-10-12 15:09:47.266 DEBUG 14532 --- [ main] c.m.service.mapper.UserMapper.insert : ==> Preparing: INSERT INTO user (specid, id, name, age, email, deleted, createtime, version, FAB) VALUES (?, ?, ?, ?, ?, ?, ?, ?, 'FAB1')

2022-10-12 15:09:47.322 DEBUG 14532 --- [ main] c.m.service.mapper.UserMapper.insert : ==> Parameters: lot-20221012150944(String), 426(Long), zouli26(String), 56(Integer), zoulinlin26@163.com(String), 0(Integer), 2022-10-12T15:09:44.528(LocalDateTime), 0(Long)

Consume Time:138 ms 2022-10-12 15:09:47

Execute SQL:INSERT INTO user (specid, id, name, age, email, deleted, createtime, version, FAB) VALUES ('lot-20221012150944', 426, 'zouli26', 56, 'zoulinlin26@163.com', 0, '2022-10-12T15:09:44.528', 0, 'FAB1')

2022-10-12 15:09:47.462 DEBUG 14532 --- [ main] c.m.service.mapper.UserMapper.insert : <== Updates: 1

1

从以上运行日志中启用新的规则

有关第十四章:mybatis-plus 自定义ID生成策略的更多相关文章

  1. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  2. ruby - Facter::Util::Uptime:Module 的未定义方法 get_uptime (NoMethodError) - 2

    我正在尝试设置一个puppet节点,但ruby​​gems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由ruby​​gems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby

  3. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

    我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

  4. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

    在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

  5. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

  6. ruby - 主要 :Object when running build from sublime 的未定义方法 `require_relative' - 2

    我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby​​1.9+ 关于ruby-主要:Objectwhenrun

  7. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

  8. ruby - 在 Ruby 中有条件地定义函数 - 2

    我有一些代码在几个不同的位置之一运行:作为具有调试输出的命令行工具,作为不接受任何输出的更大程序的一部分,以及在Rails环境中。有时我需要根据代码的位置对代码进行细微的更改,我意识到以下样式似乎可行:print"Testingnestedfunctionsdefined\n"CLI=trueifCLIdeftest_printprint"CommandLineVersion\n"endelsedeftest_printprint"ReleaseVersion\n"endendtest_print()这导致:TestingnestedfunctionsdefinedCommandLin

  9. ruby - 定义方法参数的条件 - 2

    我有一个只接受一个参数的方法:defmy_method(number)end如果使用number调用方法,我该如何引发错误??通常,我如何定义方法参数的条件?比如我想在调用的时候报错:my_method(1) 最佳答案 您可以添加guard在函数的开头,如果参数无效则引发异常。例如:defmy_method(number)failArgumentError,"Inputshouldbegreaterthanorequalto2"ifnumbereputse.messageend#=>Inputshouldbegreaterthano

  10. ruby - 如何在 Grape 中定义哈希数组? - 2

    我使用Ember作为我的前端和GrapeAPI来为我的API提供服务。前端发送类似:{"service"=>{"name"=>"Name","duration"=>"30","user"=>nil,"organization"=>"org","category"=>nil,"description"=>"description","disabled"=>true,"color"=>nil,"availabilities"=>[{"day"=>"Saturday","enabled"=>false,"timeSlots"=>[{"startAt"=>"09:00AM","endAt"=>

随机推荐