这段时间给朋友做了一个微信小程序,顺便练习一下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自增相关推荐

  1. Mongodb 自动增长 自增id 实现

    Mongodb 自动增长 自增id 实现 首先创建一个自动增长id集合 ids >db.ids.save({name:"user", id:0}); 可以查看一下是否成功 & ...

  2. SpringBoot+MongoDB GridFS文件上传、下载、预览实战

    SpringBoot + MongoDB GridFS 随着web 3.0的兴起,数据的形式不局限于文字,还有语音.视频.图片等.高效存储与检索二进制数据也成为web 3.0必须要考虑的问题.然而这种 ...

  3. SpringBoot+MongoDB实现一个物流订单系统

    码字不易,点赞收藏,养成习惯!原创作者公众号:bigsai,回复bigsai领取5G的PDF学习资源!共同进步.更多精彩期待与您分享! 项目收录在github的MongoDB案例中,文章收录在回车课堂 ...

  4. idea+springboot+mongodb的实战使用分享

    昨天的时候我们先在网上找了测试类,测试了一下mongdb的简单使用,今天就来实地在项目中用一用 没安装mongodb的参考我上一篇文章:idea+springboot+mongodb的简单测试使用分享 ...

  5. springBoot使用redis获取自增序号

    获取自增序号 springBoot使用redis获取自增序号 pom文件 参考代码 配置 配置类代码 使用代码 lua脚本 测试代码 配置 配置类代码 使用代码 lua脚本 lua脚本2 输出 另一种 ...

  6. springboot(测试类)整合mybatisplus增删改查

    文章目录 下载地址 1.创建springboot项目(Spring Initializer快速创建) 2.配置文件,数据库等 3.配置,策略,实体类 4.增删改查 查询 查询全部 查询-根据id批量查 ...

  7. SpringBoot整合redisTemplate获取自增主键

    SpringBoot整合redisTemplate获取自增主键 在Spring Boot应用程序中,我们可以使用Redis作为缓存或数据存储.当我们使用Redis存储数据时,我们可能需要使用自增主键. ...

  8. 快速解决mongodb出现id重复问题

    近期在使用mongodb的过程中遇到一次表中有_id字段重复的记录(相同_id的有两条),着实吓了一大跳,这篇文章主要给大家介绍了关于mongodb出现id重复问题的简单解决办法,需要的朋友可以参考下 ...

  9. mysql删除数据后id自增不连续的解决方法

    mysql删除数据后id自增不连续的解决方法 参考文章: (1)mysql删除数据后id自增不连续的解决方法 (2)https://www.cnblogs.com/weifeng-888/p/1163 ...

最新文章

  1. 我的puppet web 管理,彻底告别终端模式
  2. 【转载】探索式测试基础系列—生活进阶曲
  3. 用Jmeter进行接口测试及乱码问题
  4. mc显示服务器生命值,[1.7-1.8]CombatIndicator — 全息显示攻击伤害的数值 让我的世界服务器更有游戏感...
  5. hdu2115: I Love This Game
  6. 使用GenerateDriverDiskISO无需软驱安装WINDOWS操作系统
  7. python批量复制粘贴_用python批量复制特定图片
  8. 腾讯开源开年红!TencentOS 内核正式开源
  9. 详解jdbcTemplate和namedParameterJdbcTemplate
  10. 蓝桥杯2013c++真题:颠倒的价牌
  11. 纯个人整理!分享珍藏很久的《手把手AI项目》合集手册(附链接)
  12. MyCat分片规则之固定hash分片
  13. ngrok下载并运行实现内网穿透
  14. Solaris 11.3 升级到 11.4注意事项
  15. 打不开磁盘*或它所依赖的某个快照磁盘
  16. 如何快速爬取一个网站所有图片链接
  17. 腾讯云~安装MongoDB
  18. 在WPF里使用指纹认证(一、安装SDK)
  19. 转:HDFS研究----.Trash文件
  20. 新版MDN正式上线,还有收费版的MDN Plus,下个月也即将到来

热门文章

  1. Advanced Auto Layout:Programmatically Creating Constraints
  2. 从底层理解Python的执行
  3. 修改FileZilla生成证书的有效期
  4. postfix邮件系统经典退信
  5. js中判断两个数字的大小
  6. 关于子元素的margin-top对父级容器无效
  7. Maven项目上总有一个小红叉问题
  8. webservice接口与HTTP接口学习笔记
  9. 生活娱乐 达尔优的键盘鼠标如何打开和关闭呼吸灯
  10. MathType支持64位 WIN 7Office 2013(完美解决)(转载)