博友部分優秀代碼(非本人原創)

一、生成唯一訂單號序列
  

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.csdn.net/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.csdn.net/weixin_37615279/article/details/100516311

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章