主键生成策略

mybatis自定义生成代码策略示例 mybatis 自定义生成 entity/dao/mapper.xml 文件 立即下载

介绍一个建的主键生成策略.
大体思路是这样子的:
程序中免不了要对数据进行新增操作, 而新增数据就需要一个id. 当每次插入数据时,使用数据库直接生成效率不高, 一种比较好的方法是 , 先使用数据库的sql语句(比如存储过程,函数)一次性生成1000条数据, 然后将这1000条数据放到系统缓存中. 每一次新增数据时, 从缓存中取出一条id , 这样就不用每次都从数据库直接生成. 当缓存中的数据不够用时, 我们再调用存储过程或函数, 一次性生成1000条放到缓存中.

有了这个思路, 我们就可以开始了.
我们先从数据库端开始, 因为要用数据库批量的生产主键.
先定义一个主键格式 , 格式为: yyyyMMdd + 12位序列号 (序列号递增,首端用0填充)
好了, 我们开始设计一个函数.
定义一个函数 : A( 参数1: 表名称table, 参数2: 主键数 num)
A() {
if(table中没有数据)
获取今天的日期 yyyyMMdd
生成 日期 + 序列号 的主键id
生成num条
if(table中有数据)
获取表中数据总数sum
获取今天的日期 yyyyMMdd
生成 日期 + (sum+1)开始的主键id
生成num条
返回num条主键id
}

定义一个存储过程, 存储过程调用这个函数A();
到这里, 数据库端我们就设计完成了, 每次调用存储过程, 都能拿到num条主键id .我们只需要传入表名和主键数量, 就能获取该表的新生成的主键

现在我们从程序入手, 看看程序上怎么设计
首先需要定义一个主键生成类,
类中有一个属性 Map<String , Vector> keyCatche , 这是个主键id缓存池, 我们从数据库中获取到的主键id都放在这里面, 是一个map结构的数据, 其中key存的是表名, vector存的是对应吧表生成的id.

我们还要定义一个常量, 代表缓存池的大小. 比如1000. 就代表缓存中每个表一次能存1000条主键id

我们定义一个函数来完成从数据库拿到一批主键的功能
函数GenIds( tableName , idNum)
{
创建数据库链接
调用存储过程(传入tableName , idNum)
得到一批主键
关闭数据库链接
}

我们接着来定义一个函数, 用来从缓存中获取主键id
// 参数1 tableName代表要获取那个表的ID, 参数2 idNum代表要获取多少个, 一般一次一个
函数getId(tableName , idNum)
{
if(keyCatche没有 tableName )
在缓存中新增一个tableName , Vector为空
if(keyCatche存在tableName )
Vector v = keyCatche.get(tableName)
if tableName在缓存中的id大于0
获取当前时间, 格式化时间为 yyyyMMdd , 一共8位 ,代表年月日
获取缓存中第一个id , 截取id的前8位, 和当前时间比较, 看看缓存中的id 是不是今天生成的.
如果不是,将缓存中的id清零 , 我们只要当天的id. (今天插入的id 必须要用今天的日期为id开头)
if v.size < idNum
缓存中的id个数 小于我们希望拿到的id个数 , 我们要从数据库重新去拿.
number = idNum + 1000 - v.size
// 调用我们定义的从数据库获取id的函数
list = GenIds( tableName , number )
//把新生成的id放到表对应的id缓存中
v.add(list)
//从当前缓存中顺序获取idNum个id作为函数返回值
v.get(0 , idNum)
然后从当前缓存中移除0~idNum个id , 就是说用N个id , 就要从缓存中删N个id
}

到这里, 整个设计就完成了.

需要注意的是
这样生成的id 只能保证表内唯一. 因为他的生成规则是 日期+ 递增序列号 , 不同表之间id是有可能一样的.
这样的id生成策略不支持服务的集群部署. 因为id是存在系统缓存中的. 集群部署时每个服务都有一个缓存池, 那样id换乱. 要集群部署, 起码的把id缓存池单独放在一个redis中 , 不能放在系统变量中.

芒果YOLOv5改进107:ARConv自适应旋转卷积,全网首发 | 即插即用:以增强其表征能力,从而准确检测方向物体,ICCV顶会论文idea ARConv自适应旋转卷积,全网首发 | 即插即用:以增强其表征能力,从而准确检测方向物体,ICCV顶会论文idea 阅读详情

相关推荐

手把手教你配置C6678的SPI启动:从NorFlash烧写到多核加载的完整流程

本文详细介绍了TMS320C6678多核DSP的SPI启动全流程,包括硬件准备、镜像文件生成与转换、NorFlash烧写与验证、多核启动同步机制以及常见问题排查。通过实战演示,帮助开发者高效配置SPI启动模式,解决启动失败、多核同步异常等问题,提升嵌入式系统开发效率。

weixin_27076351的博客 151

mysql mybatis 主键生成策略_小书MybatisPlus第6篇-主键生成策略精讲

本文为mybatis系列文档的第6篇,前5篇请访问下面的网址。Mybatis Plus 为我们提供了三种设置 主键生成策略的方式。它们的优先级顺序是:局部注解 > 全局 > 默认(雪花算法)。下面我们来一一介绍一、默认主键生成策略:雪花算法Mybatis Plus如果不做任何主键策略配置,默认使用的是雪花算法。该策略会根据雪花算法生成主键ID,主键类型为Long或String(具体到M...

weixin_42701915的博客 937

用Simulink对Carsim车辆进行档位控制

用Simulink对Carsim车辆进行档位控制一、carsim中的档位设置为开环控制二、在Constant目录下面选取一个选项并重新命名为constant :0 Gear三、双击进去设置常量为 0四、输入和输出IO通道五、验证 :输入 为 3 档 ----- 输出 为 3!六、参考 一、carsim中的档位设置为开环控制 二、在Constant目录下面选取一个选项并重新命名为constant :0 Gear 三、双击进去设置常量为 0 四、输入和输出IO通道 五、验证 :输入 为 3 档 -

qq_42027654的博客 2599

Java实现库表的主键生成策略

通过ASCII编码对照关系生成数组和英文主键,起初传入主键字符串,然后转换为byte数组,从末位开始十进制数的自增,获取ASCII编码对应的下一位字符,以及判断是否要进位,进位则循环下一位进行自增,反复循环,若不进位,则直接返回byte数组,最后byte数组转换为字符返回。 package com.nullable.tools.id; /** * 主键生成工具类:包含数字、大写英文,从0-...

null_able的博客 1171

Android 面试题 Handler篇

1.Handler的实现原理。

ViewHandKownHealth的博客 953

098、C3k2_Ghost:用 GhostConv 替代 C3k2 内标准卷积的轻量化改造代码

本文介绍了用GhostConv轻量化改造YOLOv11中C3k2模块的实践。作者通过线上部署案例引出问题,详细解析了GhostConv的核心实现逻辑,指出直接替换标准卷积会导致的两个关键问题:通道数不匹配和kernel_size冲突。文章提供了完整的C3k2_Ghost实现代码,包含注意事项和调试技巧。消融实验显示,该方法在小模型上可减少27%-28%参数量、34%-35%FLOPs,仅损失0.8mAP。作者总结了适用场景:小模型效果显著,大模型需谨慎;检测小目标任务不推荐;训练时需调整学习率。最后强调sh

sundong_81的博客 62

MyBatisPlus

高级代码生成可以 使用Freemarker模板引擎生成。设置好规范自动生成即可。

及时行乐的博客 259

ArcGIS笔记2_如何将经纬度WGS84地理坐标系转换为米单位CGCS2000投影坐标系

本博文则主要讲解,如果我们手里拿到的shp文件是在ArcGIS中,如何将经纬度WGS84地理坐标系转换为米单位CGCS2000投影坐标系。

晏长街的博客 4万+

java生成主键id,java自定义主键生成器

1. 实体类代码@Entity@Data@Table(name = "user")public class User implements Serializable {@Id@GenericGenerator(name = "customerGenerator", strategy = "CustomerGeneratorClass", parameters = {@org.hibernate.a...

weixin_42531163的博客 1594

【RT-DETR多模态融合改进】| 自研 多模态大核选择模块:MM_LSK,适配多模态图像信息融合

本文记录的利用改进的多模态大核选择模块(MM-LSK)优化RT-DETR,构建可见光-红外双模态目标检测网络。在遥感等大尺寸图像的可见光-红外双模态小目标检测任务中,单模态检测易受光照、云雾、背景干扰等因素影响,且小目标外观信息匮乏,无法仅基于单模态外观实现较好的识别,因此需要融合双模态互补特性与广泛的跨模态上下文信息进行辅助。

Limiiiing的博客 381

边缘计算与产业生态系统

目录 文章目录目录边缘计算产业参与者边缘计算产业生态系统 边缘计算产业参与者 边缘计算领域参与者众多,主流公司以打造生态优势为目标,基于自身服务层级向产业链上下两端进行拓展,目前市场主要参与者有: 系统集成商:在产业头部,具有广泛的能力,可以集成不同生态系统公司的产品,具有一定的全球性属性,在边缘计算领域大多由云服务商、电信运营商担任。 云服务商:具有领先的云技术优势与应用生态体系,同时拥有全球性资源布局与市场资源生态,并渴望成为边缘计算主导者。 电信运营商:具有边缘基础设施优势,以及不可替代的

烟云的计算 2098

mysql主键生成策略 uuid_主键生成策略

网上搜集下来的1、assigned主键由外部程序负责生成,在 save() 之前必须指定一个。Hibernate不负责维护主键生成。与Hibernate和底层数据库都无关,可以跨数据库。在存储对象前,必须要使用主键的setter方法给主键赋值,至于这个值怎么生成,完全由自己决定,这种方法应该尽量避免。特点:可以跨数据库,人为控制主键生成,应尽量避免。2、increment由Hibernate从数据...

weixin_32541333的博客 1179

基于 YOLOv26 的陶瓷产品缺陷检测系统:智能视觉质检方案

本文提出了一种基于YOLOv26深度学习模型的陶瓷产品智能缺陷检测系统。该系统针对陶瓷生产中的裂纹、气泡、釉面缺陷等8类常见质量问题,采用YOLOv26目标检测算法实现高精度自动化检测。系统架构包含数据采集、预处理、YOLOv26检测和后处理四个模块,具有多类别分类、实时推理和强鲁棒性等技术优势。文章详细介绍了数据预处理与增强方法,并提供了Python代码实现示例。该方案可显著提升陶瓷产品质量检测效率,替代传统人工检测方式,为陶瓷制造业提供智能化质检解决方案。

一键难忘的博客 786

Mp之主键生成策略

常见的主键生成策略 自动增长 缺陷:分库分表时需要上一张表最后的值加1 UUID 缺陷: 每次生成随机唯一的值 但随机生成值,但排序不方便 Redis生成ID 原子操作实现 mp自带策略 通过snowflake算法实现,每次生成值都不同 配置主键策略 在主键属性上加注解@TableId @Table...

weixin_35969228的博客 1474

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

hibernate主键生成策略

主键生成策略 一、Hibernate标识生成策略 关于映射文件的问题下次再介绍,这次主要总结hibernate常用主键生成策略。 (1)increment 对主键值采取自动顺序增长的方式生成新的主键,值默认从1开始。 原理:在当前应用实例中维持一个变量,以保存当前最大值,之后每次需要生成主键值的时候将此值加1作为主键.不依赖于底层的数据库,因此所有的数据库都可以使用 缺点:通过i...

鄧旧人博客 717

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Hibernate 主键生成策略

Hibernate 主键生成策略主键生成策略若主键是int类型1. assigned2.increment(常用)3.identity(常用)4.native(常用)5.sequence若主键是varchar类型1.uuid2.自定义主键实例 主键生成策略 Hibernate提供相应的API能自动生成数据库表,说到表,一定会设计到的一个概念就是主键,主键是由程序自动生成的,不应该由用户自己输入,那...

what_where的博客 562

ShardingSphere-JDBC的 SPI主键生成策略

ShardingSphere主键生成策略就是使用雪花算法和UUID两种方式。这两种主要就是通过SPI的方式实现,其主要目的也是为了好扩展,也可以自行实现接口,自定义主键生成策略。 插入日志输出:

不管风吹浪打,胜似闲庭信步 3523

Hibernate之主键生成策略

一、主键类型 1.自然主键(主键本身就是表中的一个字段,实体中一个具体的属性) 表中已经具有某字段,并且该字段具有业务含义作为主键,称之为自然主键 2.代理主键(主键不是实体中某个具体的属性,而是一个不相关的字段) 表中不具备业务含义的字段作为主键,称之为代理主键。更合理的方式是使用代理主键。 二、主键生成策略 1.自然主键 assigned(用户手动录入)   由J...

weixin_30256901的博客 218

Hibernate的主键生成策略

文章目录1. 主键的类型2. Hibernate的主键生成策略 1. 主键的类型 我们都知道Hibernate是能自动生成数据库表,说到表,一定会涉及到的一个概念就是主键,主键是由程序自动生成的,不应该由用户自己输入。Hibernat也提供了相应的主键生成策略,下面老王就来聊聊Hibernat的主键生成策略。 在讲解Hibernate的主键生成策略之前,先来了解两个概念,即自然主键和代理主键,具体...

weixin_45990046的博客 145

主键的生成策略

主键的生成策略 的取值可以为: 1、  increment:用于long,short或者int类型生成的唯一标识。只有在没有其他进程往同一张表中插入数据时才能使用,在集群下不要使用 2、  identity:返回的标识符是long,short或者int类型。对DB2,MS SQL Service,Sybase和HypersonicSQL的内置标识符字段提供支持 3、  sequence:在

2803

hibernate之主键生成策略

hibernate之主键生成策略简介分类实例 简介 hibernate的主键生成器: generator元素:表示了一个主键生成器,它用来为持久化类实例生成唯一的标识 分类 程序员自己控制:assigned 主键由外部程序负责生成,无需Hibernate参与。 数据库控制: identity(标识列/自动增长) sequence identity:采用数据库提供的主键生成机制。如DB2、S...

钰团的博客 308

java mysql 主键生成策略_主键生成策略

1.Assigned(常用)Assigned方式由程序生成主键值,并且要在save()之前指定,否则会抛出异常。特点:逐渐的生成值完全由用户决定,于底层数据库无关。用户需要维护主键值,在调用session.save()之前要指定主键值。注意:int auto_increment类型主键除外2.HiloHile使用高低位算法生成主键,高低位算法使用一个高位值和一个低位值,然后把算法得到的俩个值拼接起...

weixin_39891694的博客 535

Hibernate中常见的主键生成策略

主键生成策略 1、主键的分类:见链接:https://blog.youkuaiyun.com/pipizhen_/article/details/107851361 主键应该设置,和业务不相关的自然数,不要拿着人员的身份证做主键,拿着银行卡号做主键,因为业务可能会改动,而主键不能随便改。 在实际开发中一般不允许用户手动设置主键,一般将主键交给数据库,手动编写程序进行设置。在Hibernate中为了减少主键的编写,提供了很多种主键的生成策略。 2、常见的主键生成策略: (1)increment 使用Hibernate中

pipizhen_的博客 1215
上一篇: springboot 操作rabbitmq 的一些心得记录
下一篇: order by使用索引列排序时会失效吗?
libingbojava
博客等级 码龄9年 64粉丝 111原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值