SpringBoot+mongoDB实现id自增
这段时间给朋友做了一个微信小程序,顺便练习一下spring boot,虽然项目使用的是JPA+MySQL,但是好奇尝试了一下MongoDB实现自增ID,虽然MongoDB很少有自增ID的需求(在分布式环境中,多个机器同步一个自增ID不但费时且费力,MongoDB从一开始就是设计用来做分布式数据库的,处理多个节点是一个核心要求,而ObjectId在分片环境中要容易生成的多),但是需求是多变的,难免会遇到需要自增的需求。
MongoDB有默认的ObjectId,是一个12字节的 BSON 类型字符串。按照字节顺序,依次次代表:
- 4字节:UNIX时间戳
- 3字节:表示运行MongoDB的机器
- 2字节:表示生成此_id的进程
- 3字节:由一个随机数开始的计数器生成的值
Spring boot中可以使用MongoTemplate操作MongoDB,但是不能自增ID,只能手动实现:
1).自定义注解用于标识需要自增的Field.
package com.example.annotation;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)public @interface AutoIncKey {}
2).创建数据表存储当前的id号
id的自增进度需要一个数据表存储(只是存储当前id号数据,可以不用数据库而用其他形式)
@Document(collection = "inc")
public class IncInfo {@Idprivate String id;// 主键@Fieldprivate String collName;// 需要自增id的集合名称(这里设置为MyDomain)@Fieldprivate Integer incId;// 当前自增id值// 省略getter、setter
3).实现监听类
监听器用于监听Mongo Event,该类继承AbstractMongoEventListener类,因为我们需要在JAVA对象转换成数据库对象的时候操作id字段实现id自增,所以覆盖onBeforeConvert方法(详见spring-data文档,https://docs.spring.io/spring-data/data-document/docs/current/reference/html/,5.11节)
package com.example.listener;import java.lang.reflect.Field;import com.example.annotation.AutoIncKey;import com.example.domain.MyDomain;import com.example.domain.IncInfo;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.mongodb.core.FindAndModifyOptions;import org.springframework.data.mongodb.core.MongoTemplate;import org.springframework.data.mongodb.core.mapping.event.AbstractMongoEventListener;import org.springframework.data.mongodb.core.mapping.event.BeforeConvertEvent;import org.springframework.data.mongodb.core.query.Criteria;import org.springframework.data.mongodb.core.query.Query;import org.springframework.data.mongodb.core.query.Update;import org.springframework.stereotype.Component;import org.springframework.util.ReflectionUtils;@Componentpublic class SaveEventListener extends AbstractMongoEventListener<Object>{private static final Logger logger= LoggerFactory.getLogger(SaveEventListener.class);@Autowiredprivate MongoTemplate mongo;@Overridepublic void onBeforeConvert(BeforeConvertEvent<Object> event) {logger.info(event.getSource().toString());MyDomain source=(MyDomain)event.getSource();if (source != null) {ReflectionUtils.doWithFields(source.getClass(), new ReflectionUtils.FieldCallback() {public void doWith(Field field) throws IllegalArgumentException, IllegalAccessException {ReflectionUtils.makeAccessible(field);// 如果字段添加了我们自定义的AutoIncKey注解if (field.isAnnotationPresent(AutoIncKey.class)) {// 设置自增IDfield.set(source, getNextId(source.getClass().getSimpleName()));}}});}}private Integer getNextId(String collName) {Query query = new Query(Criteria.where("collName").is(collName));Update update = new Update();update.inc("incId", 1);FindAndModifyOptions options = new FindAndModifyOptions();options.upsert(true);options.returnNew(true);IncInfo inc= mongo.findAndModify(query, update, options, IncInfo.class);return inc.getIncId();}}
4).在我们的对象中id字段上添加注解
@Id@AutoIncKeyprivate Integer id=0;
至此就实现了Mongodb的自增id。
转载于:https://www.cnblogs.com/yzykkpl/p/10356258.html
SpringBoot+mongoDB实现id自增相关推荐
- Mongodb 自动增长 自增id 实现
Mongodb 自动增长 自增id 实现 首先创建一个自动增长id集合 ids >db.ids.save({name:"user", id:0}); 可以查看一下是否成功 & ...
- SpringBoot+MongoDB GridFS文件上传、下载、预览实战
SpringBoot + MongoDB GridFS 随着web 3.0的兴起,数据的形式不局限于文字,还有语音.视频.图片等.高效存储与检索二进制数据也成为web 3.0必须要考虑的问题.然而这种 ...
- SpringBoot+MongoDB实现一个物流订单系统
码字不易,点赞收藏,养成习惯!原创作者公众号:bigsai,回复bigsai领取5G的PDF学习资源!共同进步.更多精彩期待与您分享! 项目收录在github的MongoDB案例中,文章收录在回车课堂 ...
- idea+springboot+mongodb的实战使用分享
昨天的时候我们先在网上找了测试类,测试了一下mongdb的简单使用,今天就来实地在项目中用一用 没安装mongodb的参考我上一篇文章:idea+springboot+mongodb的简单测试使用分享 ...
- springBoot使用redis获取自增序号
获取自增序号 springBoot使用redis获取自增序号 pom文件 参考代码 配置 配置类代码 使用代码 lua脚本 测试代码 配置 配置类代码 使用代码 lua脚本 lua脚本2 输出 另一种 ...
- springboot(测试类)整合mybatisplus增删改查
文章目录 下载地址 1.创建springboot项目(Spring Initializer快速创建) 2.配置文件,数据库等 3.配置,策略,实体类 4.增删改查 查询 查询全部 查询-根据id批量查 ...
- SpringBoot整合redisTemplate获取自增主键
SpringBoot整合redisTemplate获取自增主键 在Spring Boot应用程序中,我们可以使用Redis作为缓存或数据存储.当我们使用Redis存储数据时,我们可能需要使用自增主键. ...
- 快速解决mongodb出现id重复问题
近期在使用mongodb的过程中遇到一次表中有_id字段重复的记录(相同_id的有两条),着实吓了一大跳,这篇文章主要给大家介绍了关于mongodb出现id重复问题的简单解决办法,需要的朋友可以参考下 ...
- mysql删除数据后id自增不连续的解决方法
mysql删除数据后id自增不连续的解决方法 参考文章: (1)mysql删除数据后id自增不连续的解决方法 (2)https://www.cnblogs.com/weifeng-888/p/1163 ...
最新文章
- 我的puppet web 管理,彻底告别终端模式
- 【转载】探索式测试基础系列—生活进阶曲
- 用Jmeter进行接口测试及乱码问题
- mc显示服务器生命值,[1.7-1.8]CombatIndicator — 全息显示攻击伤害的数值 让我的世界服务器更有游戏感...
- hdu2115: I Love This Game
- 使用GenerateDriverDiskISO无需软驱安装WINDOWS操作系统
- python批量复制粘贴_用python批量复制特定图片
- 腾讯开源开年红!TencentOS 内核正式开源
- 详解jdbcTemplate和namedParameterJdbcTemplate
- 蓝桥杯2013c++真题:颠倒的价牌
- 纯个人整理!分享珍藏很久的《手把手AI项目》合集手册(附链接)
- MyCat分片规则之固定hash分片
- ngrok下载并运行实现内网穿透
- Solaris 11.3 升级到 11.4注意事项
- 打不开磁盘*或它所依赖的某个快照磁盘
- 如何快速爬取一个网站所有图片链接
- 腾讯云~安装MongoDB
- 在WPF里使用指纹认证(一、安装SDK)
- 转:HDFS研究----.Trash文件
- 新版MDN正式上线,还有收费版的MDN Plus,下个月也即将到来