Java生成唯一订单号的几种方式

 更新时间:2025年03月21日 09:28:40   作者:周董思密达  
这篇文章主要介绍了Java生成唯一订单号的几种方式,订单号具有唯一标识符的作用,下边将演示自增、随机、组合的方式,生成高效、安全、唯一的订单号,以满足业务需求和避免潜在问题,需要的朋友可以参考下

前言

订单号具有唯一标识符的作用,下边将演示自增、随机、组合的方式,生成高效、安全、唯一的订单号,以满足业务需求和避免潜在问题。

自增

自增常见的有:纯数字自增时间+数字自增数据库主键id自增

纯数字自增

需求:生成8位自增数字的订单号,不足8位前缀补0。

实现:使用redis的incr函数完成此需求。

@RestController
@RequestMapping("/testOrderCode")
public class TestOrderCodeController {
    @Resource
    private RedisTemplate<String, Integer> redisTemplate;
    private static final String TEST_ORDER_CODE_KEY = "test_order_code_key";

    @GetMapping("/test")
    public String test() {
        //使用incr获取自增的订单号
        Long increment = redisTemplate.opsForValue().increment(TEST_ORDER_CODE_KEY);
        //将订单号不足8位前缀补0,"%08d",%0表示前缀补0,8表示补充8位,d表示数字类型
        String oderCode = String.format("%08d", increment);
        return oderCode;
    }
}
输出结果:00000001

时间+数字自增

需求:使用年月日(yyMMdd)当订单号前缀,后四位使用当日订单号自增。

实现:获取yyMMdd格式的时间字符串,然后将该字符串作为redis的key使用,并给该key设置一天的过期时间。后四位数字自增使用redis的 incr函数实现。

@RestController
@RequestMapping("/testOrderCode")
public class TestOrderCodeController {
    @Resource
    private RedisTemplate<String, Integer> redisTemplate;
    private static final String TEST_ORDER_CODE_KEY = "test_order_code_key";

    @GetMapping("/test")
    public String test() {
        // 定义日期格式
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyMMdd");
        //根据当前时间获取yyMMdd格式的时间字符串
        String format = LocalDate.now().format(formatter);
        //判断是否存在key,不存在则设置1天的过期时间
        if (Boolean.FALSE.equals(redisTemplate.hasKey(format))) {
            redisTemplate.expire(format, 1, TimeUnit.DAYS);
        }
        //使用incr获取自增的订单号
        Long increment = redisTemplate.opsForValue().increment(format);
        //将订单号不足4位前缀补0,"%04d",%0表示前缀补0,4表示补充4位,d表示数字类型
        String oderCode = String.format("%04d", increment);
        return format + oderCode;
    }
}
输出结果:2412260001

数据库主键id自增

需求:生成8位自增数字的订单号,不足8位前缀补0。

实现:使用数据库自增主键实现该需求。先保存订单到数据库,取订单id,再将id前缀补0操作后更新到数据库中。

@RestController
@RequestMapping("/testOrderCode")
public class TestOrderCodeController {
    @Resource
    private OrdersMapper orderMapper;

    @GetMapping("/test")
    public String test() {
        //保存订单,并获取id
        OrdersDO ordersDO = new OrdersDO();
        orderMapper.insert(ordersDO);
        Long id = ordersDO.getId();
        //将订单号不足8位前缀补0,"%08d",%0表示前缀补0,8表示补充8位,d表示数字类型
        String oderCode = String.format("%08d", id);
        //更新订单号
        orderMapper.updateById(ordersDO.setOrderCode(oderCode));
        return oderCode;
    }
}
输出结果:00000001

随机

随机常见的有:随机数UUID分布式全局唯一id(雪花算法)

随机数

需求:生成随机的订单号。

实现:使用Random生成随机数。

import cn.hutool.core.util.RandomUtil;

@RestController
@RequestMapping("/testOrderCode")
public class TestOrderCodeController {
    @Resource
    private OrdersMapper orderMapper;

    @GetMapping("/test")
    public String test() {
        // 定义日期格式
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyMMdd");
        //根据当前时间获取yyMMdd格式的时间字符串
        String format = LocalDate.now().format(formatter);
        //生成随机8位数字
        String random = RandomUtil.randomNumbers(8);
        //时间+随机数组成订单号
        String oderCode = format + random;
        //判断生成的订单号在数据库中是否存在,如果存在则继续随机生成订单号
        while (orderMapper.selectCount(Wrappers.lambdaQuery(OrdersDO.class).eq(OrdersDO::getOrderCode, oderCode)) > 0){
            oderCode = format + RandomUtil.randomNumbers(8);
        }
        return oderCode;
    }
}
输出结果:24122683230048

UUID

需求:生成随机的订单号。

实现:使用UUID实现该需求。

import java.util.UUID;

@RestController
@RequestMapping("/testOrderCode")
public class TestOrderCodeController {

    @GetMapping("/test")
    public String test() {
        // 生成一个UUID
        UUID uuid = UUID.randomUUID();
        // 将UUID转换为字符串,并移除分隔符
        String oderCode = uuid.toString().replace("-", "");
        return oderCode;
    }
}
输出结果:8a45cd3458b640789ed3c9ef223d090b

分布式全局唯一id(雪花算法)

需求:生成随机的订单号。

实现:使用分布式全局唯一id(雪花算法)实现该需求。

import cn.hutool.core.lang.Snowflake;

@RestController
@RequestMapping("/testOrderCode")
public class TestOrderCodeController {

    @GetMapping("/test")
    public String test() {
        // 创建一个雪花算法ID生成器实例,通常你需要指定终端ID和数据中心ID
        Snowflake snowflake = new Snowflake(1, 1);
        String oderCode = snowflake.nextIdStr();
        return oderCode;
    }
}
输出结果:1872140136729415680

结语

到此这篇关于Java生成唯一订单号的几种方式的文章就介绍到这了,更多相关Java生成唯一订单号内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python爬虫之爬取2020女团选秀数据

    Python爬虫之爬取2020女团选秀数据

    本文将对比《青春有你2》和《创造营2020》全体小姐姐,鉴于两个节目的数据采集和处理过程基本相似,在使用Python做数据爬虫采集的章节中将只以《创造营2020》为例做详细介绍。感兴趣的同学可以照猫画虎去实操一下《青春有你2》的数据爬虫采集,需要的朋友可以参考下
    2021-04-04
  • 如何在Spring WebFlux的任何地方获取Request对象

    如何在Spring WebFlux的任何地方获取Request对象

    这篇文章主要介绍了如何在Spring WebFlux的任何地方获取Request对象,帮助大家更好的理解和使用springboot框架,感兴趣的朋友可以了解下
    2021-01-01
  • 浅谈Spring中@NotEmpty、@NotBlank、@NotNull区别

    浅谈Spring中@NotEmpty、@NotBlank、@NotNull区别

    本文主要介绍了浅谈Spring中@NotEmpty、@NotBlank、@NotNull区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • Java 多线程Synchronized和Lock的区别

    Java 多线程Synchronized和Lock的区别

    这篇文章主要介绍了Java 多线程Synchronized和Lock的区别,帮助大家更好的理解和使用Java,感兴趣的朋友可以了解下
    2021-01-01
  • Spring核心之IOC与bean超详细讲解

    Spring核心之IOC与bean超详细讲解

    IOC-Inversion of Control,即控制反转。它不是什么技术,而是一种设计思想。这篇文章将为大家介绍一下Spring控制反转IOC的原理,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-10-10
  • fastjson对JSONObject中的指定字段重新赋值的实现

    fastjson对JSONObject中的指定字段重新赋值的实现

    这篇文章主要介绍了fastjson对JSONObject中的指定字段重新赋值的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • java中将list用逗号隔开拼成字符串的4种方法例子

    java中将list用逗号隔开拼成字符串的4种方法例子

    我们经常在开发过程之中会遇到需要把返回的Id list转换为一个使用逗号(,)分隔的字符串,下面这篇文章主要给大家介绍了关于java中将list用逗号隔开拼成字符串的4种方法例子,需要的朋友可以参考下
    2024-01-01
  • 通过java.util.TreeMap源码加强红黑树的理解

    通过java.util.TreeMap源码加强红黑树的理解

    通过分析java.util.TreeMap源码来对经典问题红黑树加强理解和理清思路。
    2017-11-11
  • Java微信公众平台之获取地理位置

    Java微信公众平台之获取地理位置

    这篇文章主要为大家详细介绍了Java微信公众平台之获取地理位置的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • 详解SpringBoot时间参数处理完整解决方案

    详解SpringBoot时间参数处理完整解决方案

    这篇文章主要介绍了详解SpringBoot时间参数处理完整解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12

最新评论