自己写的一个主键生成器

数据库主键的选取一直是一个让人比较头疼的问题. 园里子里面的讨论也已经很多了.包括这篇 小议数据库主键选取策略(原创) 还有这篇 数据库主键设计之思考这两篇都是比较优秀的文章, 基本上对几种选取策取作了一些比较,在此基础之上俺也有了一些粗浅的认识,相较之下,自定义的主键还是一个不错的选择,但是在生成方法上有一些考虑,如并发性问题,所以在”Max+1“和"自制加1"的方案中将相关编号存放于数据库中不是一样太好的方案, 结合这两种方案提供的思路于是乎俺就写了这样一个C#主键发生器:
1. 为了避免线程冲突而采用了单件模式来生成主键,并将上一个主键存放起来,以免生成重复的主键。

2. 字段类型采用定长字符型,如char(20), 生成的字符串前面还可以加上不同的前缀,比如表前缀或者其它一些有意义的标识符.

3. 转化成字母的十六进制类型是为了让最后的长度更小一些.

请大家参考:
 1  using  System;
 2  using  System.Collections.Generic;
 3  using  System.Text;
 4 
 5  namespace  GB.Core
 6  {
 7       ///   <summary>
 8       ///  Powered By 沙加, matin0728@gmail.com, QQ5364241
 9       ///   </summary>
10       public   class  IdentityGenerator
11      {
12           static   long  lastIdentity  =   0 ;
13           static  IdentityGenerator o  =   new  IdentityGenerator();
14           public   static  IdentityGenerator Instance
15          {
16               get
17              {
18                   if  (o  !=   null )
19                       return  o;
20                   else
21                       return   new  IdentityGenerator();
22              }
23          }
24           public   string  NextIdentity()
25          {
26               long  idint  =  DateTime.Now.Ticks  -   new  DateTime( 2000 11 1 ).Ticks;
27 
28               while  (lastIdentity  >=  idint)
29              {
30                  idint ++ ;
31              }
32              lastIdentity  =  idint;
33 
34               return  Convert.ToString(idint,  16 );
35          }
36      }
37  }
38 
如果你自定义了一个主键生成方法类,通常是在MyBatisPlus中创建一个实现了`com.baomidou.mybatisplus.core.increment.IdGenerator`接口的类,这个接口定义了生成唯一ID的逻辑。以下是基本步骤: 1. 创建自定义类:首先创建一个新的Java类,比如`CustomIdGenerator`,并实现`IdGenerator`接口。在这个类中,你需要覆盖必要的方法,如`next()`,该方法用于生成下一个唯一的ID。 ```java public class CustomIdGenerator implements IdGenerator { @Override public Serializable next(String sequenceName) { // 自定义的主键生成逻辑,比如时间戳加随机数等 long timestamp = System.currentTimeMillis(); int randomValue = (int) (Math.random() * 100); return Long.valueOf(timestamp + randomValue); } } ``` 2. 配置应用:然后,在你的项目配置文件(通常是全局的MapperScan扫描器配置)中,注册你的自定义生成器,并指定为某个表的主键生成器。 ```java @MapperScan("com.example.mapper") public class MyConfiguration { @GlobalConfiguration public static GlobalConfig globalConfig() { GlobalConfig gc = new GlobalConfig(); gc.setDbSchema("your_database"); // 注册自定义主键生成器 gc.setIdGenerator(new CustomIdGenerator()); return gc; } } ``` 3. 测试验证:最后,确保在映射器文件(Mapper接口)中使用了正确的字段注解,以便MyBatisPlus能够识别并使用你的自定义生成器。 ```java @Id("custom_id") @GeneratedValue(strategy = GenerationType.IDENTITY) private Long customId; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值