博友部分优秀代码(非本人原创)

本文介绍三种不同的订单号生成方法:基于UUID的唯一订单号、利用MySQL函数生成唯一订单号及高并发场景下的订单号生成策略。每种方法都有其特点,适用于不同的业务场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、生成唯一订单号序列
  

public static String getOrderIdByUUId() {
        Date date=new Date();
        DateFormat format = new SimpleDateFormat("yyyyMMdd");
        String time = format.format(date);
        int hashCodeV = UUID.randomUUID().toString().hashCode();
        if (hashCodeV < 0) {//有可能是负数
            hashCodeV = -hashCodeV;
        }
        // 0 代表前面补充0
        // 4 代表长度为4
        // d 代表参数为正数型
        return time + String.format("%011d", hashCodeV);
    }

据说支持高并发:
来自:https://blog.youkuaiyun.com/sinat_24527911/article/details/78590320

二、唯一订单号(不确定高并发)

1、创建序列表
CREATE TABLE `order_seq` (
`timestr` int(11) NOT NULL,
`order_sn` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

========================================================================
2、创建函数
create function order_seq() 
returns VARCHAR(50)
begin 
declare v_cnt integer; 
declare v_timestr integer; 
declare v_value VARCHAR(50) ; 
declare rowcount BIGINT;
set v_timestr =DATE_FORMAT(now(),'%Y%m%d');
set v_cnt = 1;
select order_sn + 1 INTO v_cnt from order_seq where timestr = v_timestr;
UPDATE order_seq set order_sn = v_cnt where timestr = v_timestr;
if ROW_COUNT() = 0 THEN
INSERT INTO order_seq values(v_timestr,v_cnt);
end if;
select CONCAT('Pay',v_timestr,LPAD(order_sn,7,0)) INTO v_value from order_seq where timestr = v_timestr;
return v_value; 
end;
========================================================================================
3、查询模式执行存储过程(重复以确保不出错)

DROP TABLE IF EXISTS `order_seq`;
CREATE TABLE `order_seq` (
`timestr` int(11) NOT NULL,
`order_sn` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

drop FUNCTION order_seq;

create function order_seq() 
returns VARCHAR(50)
begin 
declare v_cnt integer; 
declare v_timestr integer; 
declare v_value VARCHAR(50) ; 
declare rowcount BIGINT;
set v_timestr =DATE_FORMAT(now(),'%Y%m%d');
set v_cnt = 1;
select order_sn + 1 INTO v_cnt from order_seq where timestr = v_timestr;
UPDATE order_seq set order_sn = v_cnt where timestr = v_timestr;
if ROW_COUNT() = 0 THEN
INSERT INTO order_seq values(v_timestr,v_cnt);
end if;
select CONCAT('Pay',v_timestr,LPAD(order_sn,7,0)) INTO v_value from order_seq where timestr = v_timestr;
return v_value; 
end;
=====================================================================================
4、执行
-- SELECT order_seq();

三、高并发序列

2、创建序列表

DELIMITER $$
 
USE `roamerbuddy`$$    ---修改为你对应的数据库名字
 
DROP PROCEDURE IF EXISTS `generate_orderNo`$$
 
CREATE DEFINER=`root`@`%` PROCEDURE `generate_orderNo`(
  IN orderNamePre CHAR(4),
  IN num INT,
  OUT newOrderNo VARCHAR (25)
)
BEGIN
  -- 订单变化的值
  DECLARE orderNameValue INT ;
  -- 更新行数
  DECLARE updateRow INT ;
  -- 当前日期,有可能包含时分秒  
  DECLARE currentTime DATETIME ;
  -- 订单号   
  DECLARE orderCode VARCHAR (64) ;
  -- 异常处理
  DECLARE CONTINUE HANDLER FOR 1062
  SET currentTime = NOW() ;
  
  SELECT 
    IFNULL(gs.ordervalue, 0) INTO orderNameValue 
  FROM
    generate_serialno gs 
  WHERE id = 1 ;
  
  SET currentTime = NOW() ;
 
  -- 打开自动提交
  SET autocommit = 1 ;
  IF TRUE 
  THEN 
  INSERT INTO generate_serialno (id, ordervalue, ordertime) 
  VALUES
    (1, 1, currentTime) ;
  END IF ;
  UPDATE 
    generate_serialno obj 
  SET
    obj.ordervalue = 
    CASE
      WHEN TO_DAYS(currentTime) > TO_DAYS(obj.ordertime) 
      THEN 1 
      ELSE orderNameValue + 1 
    END,
    obj.ordertime = currentTime 
  WHERE (
      obj.id = 1 
      AND obj.ordervalue = orderNameValue
    ) ;
  SET updateRow = ROW_COUNT() ;
  WHILE
    ! updateRow = 1 DO -- 获得当前的订单和变化的值   
    SELECT 
      IFNULL(gs.ordervalue, 0) INTO orderNameValue 
    FROM
      generate_serialno gs 
    WHERE id = 1 ;
    UPDATE 
      generate_serialno obj 
    SET
      obj.ordervalue = 
      CASE
        WHEN TO_DAYS(currentTime) > TO_DAYS(obj.ordertime) 
        THEN 1 
        ELSE orderNameValue + 1 
      END,
      obj.ordertime = currentTime 
    WHERE (
        obj.id = 1 
        AND obj.ordervalue = orderNameValue
      ) ;
    SET updateRow = ROW_COUNT() ;
  END WHILE ;
  IF num = 8 
  THEN -- 根据年月日生成订单编号,订单编号形式:前缀+年月日+流水号,如:SH2013011000002     
  SELECT 
    CONCAT(
	  orderNamePre,
      DATE_FORMAT(currentTime, '%Y%m%d'),
      LPAD(orderNameValue, num, '0')
    ) INTO orderCode ;
  ELSEIF num = 14 
  THEN -- 根据年月日时分秒生成订单编号,订单编号形式:前缀+年月日时分秒+流水号,如:SH2013011010050700001,个人不推荐使用这种方法生成流水号     
  SELECT 
    CONCAT(
	  orderNamePre,
      DATE_FORMAT(currentTime, '%Y%m%d%H%i%s'),
      LPAD(orderNameValue, num, '0')
    ) INTO orderCode ;
  ELSE -- 根据年月日时分生成订单编号,订单形式:前缀+年月日时分+流水号,如:SH20130110100900005
  SELECT 
    CONCAT(
	  orderNamePre,
      DATE_FORMAT(currentTime, '%Y%m%d%H%i'),
      LPAD(orderNameValue, num, '0')
    ) INTO orderCode ;
  END IF ;
  SELECT 
    orderCode ;
END$$
 
DELIMITER ;

=========================================================================================
2、创建序列表

DROP TABLE IF EXISTS `generate_serialno`;
 
CREATE TABLE `generate_serialno` (
  `id` int(20) DEFAULT NULL,
  `orderno` varchar(50) DEFAULT NULL,
  `orderpre` varchar(30) DEFAULT NULL,
  `ordervalue` int(20) DEFAULT NULL,
  `ordertime` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
=========================================================================================
3、维护ID
insert into `generate_serialno` (`id`, `ordervalue`) values('1','1');

 三、花里胡哨之输入框(前端,感谢博友)

https://blog.youkuaiyun.com/weixin_37615279/article/details/100516311

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值