一、生成唯一訂單號序列
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