java怎么生成一个一天内不会重复的20位流水号
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java怎么生成一个一天内不会重复的20位流水号相关的知识,希望对你有一定的参考价值。
我为您写了 一遍,望采纳。
package Zxing;import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
/**
*
* 开发公司:SOJSON在线工具 <p>
* 版权所有:© www.sojson.com
* 博客地址:http://www.sojson.com/blog/
* <p>
*
* Demo
*
* <p>
*
* 区分 责任人 日期 说明<br/>
* 创建 周柏成 2017年4月11日 09:43 <br/>
*
* @author zhou-baicheng
* @email so@sojson.com
* @version 1.0,2017年4月11日 09:43 <br/>
*
*/
public class Demo
public static void main(String[] args)
//格式化当前时间
SimpleDateFormat sfDate = new SimpleDateFormat("yyyyMMddHHmmssSSS");
String strDate = sfDate.format(new Date());
//得到17位时间如:20170411094039080
System.out.println("时间17位:" + strDate);
//为了防止高并发重复,再获取3个随机数
String random = getRandom620(3);
//最后得到20位订单编号。
System.out.println("订单号20位:" + strDate + random);
/**
* 获取6-10 的随机位数数字
* @param length 想要生成的长度
* @return result
*/
public static String getRandom620(Integer length)
String result = "";
Random rand = new Random();
int n = 20;
if (null != length && length > 0)
n = length;
int randInt = 0;
for (int i = 0; i < n; i++)
randInt = rand.nextInt(10);
result += randInt;
return result;
参考技术A public class Task2
static double te=10000000;//一天是24*60*60最多5位数,这里定8位
static String s="ABCDEFGHIJKL";//12位
public static void main(String[] args)
TimerTask task = new TimerTask()
@Override
public void run()
// task to run goes here
te++;
System.out.println(s+te);
;
Timer timer = new Timer();
long delay = 0;
long intevalPeriod = 1 * 1000; //一秒触发一次
// schedules the task to be run in an interval
timer.scheduleAtFixedRate(task, delay, intevalPeriod);
// end of main
多个想法。随便看看本回答被提问者采纳 参考技术B 希望对你有帮助!获取当前时间毫秒数,如果是单线程的话,一定无重复 一般这样在多线程并发中取到相同毫秒的概率都几乎为0,基本可以保证无重复 参考技术C Random random = new Random();
String name = System.currentTimeMillis() + String.valueOf( (Math.abs(random.nextLong())) );
mysql 生成流水号 存储过程 订单编号
用存储过程生成流水号是很常用的,这里以生成订单编号的流水号作为示例。(新的一天的流水号从1开始,如:今天的订单编号是CD2013010900014,下一个订单编号将是CD2013010900015;明天的订单编号将从CD2013011000001开始)
生成规则:
2位前缀+年月日+5位流水号
或者 2位前缀+年月日时分+5位流水号
或者 2位前缀+年月日时分秒+5位流水号。
测试订单表(test_orders):
1 CREATE TABLE `test_orders` ( 2 `id` int(11) NOT NULL AUTO_INCREMENT, 3 `orderNo` varchar(25) NOT NULL DEFAULT ‘‘, 4 `orderName` char(10) NOT NULL DEFAULT ‘‘, 5 PRIMARY KEY (`id`) 6 ) ENGINE=InnoDB AUTO_INCREMENT=76 DEFAULT CHARSET=utf8
生成订单编号的存储过程(generate_orderNo):
1 CREATE DEFINER=PROCEDURE `generate_orderNo`(in orderNamePre char(2), in num int, out newOrderNo varchar(25)) 2 BEGIN 3 DECLARE currentDate varCHAR (15) ;-- 当前日期,有可能包含时分秒 4 DECLARE maxNo INT DEFAULT 0 ; -- 离现在最近的满足条件的订单编号的流水号最后5位,如:SH2013011000002的maxNo=2 5 -- DECLARE l_orderNo varCHAR (25) ;-- 新生成的订单编号 6 -- DECLARE oldDate DATE ;-- 离现在最近的满足条件的订单编号的日期 7 DECLARE oldOrderNo VARCHAR (25) DEFAULT ‘‘ ;-- 离现在最近的满足条件的订单编号 8 9 if num = 8 then -- 根据年月日生成订单编号 10 SELECT DATE_FORMAT(NOW(), ‘%Y%m%d‘) INTO currentDate ;-- 订单编号形式:前缀+年月日+流水号,如:SH2013011000002 11 elseif num = 14 then -- 根据年月日时分秒生成订单编号 12 SELECT DATE_FORMAT(NOW(), ‘%Y%m%d%H%i%s‘) INTO currentDate ; -- 订单编号形式:前缀+年月日时分秒+流水号,如:SH2013011010050700001,个人不推荐使用这种方法生成流水号 13 else -- 根据年月日时分生成订单编号 14 SELECT DATE_FORMAT(NOW(), ‘%Y%m%d%H%i‘) INTO currentDate ;-- 订单形式:前缀+年月日时分+流水号,如:SH20130110100900005 15 end if ; 16 17 SELECT IFNULL(orderNo, ‘‘) INTO oldOrderNo 18 FROM test_orders 19 WHERE SUBSTRING(orderNo, 3, num) = currentDate 20 AND SUBSTRING(orderNo, 1, 2) = orderNamePre 21 and length(orderNo) = 7 + num 22 ORDER BY id DESC LIMIT 1 ; -- 有多条时只显示离现在最近的一条 23 24 IF oldOrderNo != ‘‘ THEN 25 SET maxNo = CONVERT(SUBSTRING(oldOrderNo, -5), DECIMAL) ;-- SUBSTRING(oldOrderNo, -5):订单编号如果不为‘‘截取订单的最后5位 26 END IF ; 27 SELECT 28 CONCAT(orderNamePre, currentDate, LPAD((maxNo + 1), 5, ‘0‘)) INTO newOrderNo ; -- LPAD((maxNo + 1), 5, ‘0‘):如果不足5位,将用0填充左边 29 30 INSERT INTO test_orders (orderNo, orderName) VALUES (newOrderNo, ‘testNo‘) ; -- 向订单表中插入数据 31 -- set newOrderNo = l_orderNo; 32 SELECT 33 newOrderNo ; 34 END
参数说明:
orderNamePre:(输入)订单编号的前缀,这里设定为两个字符
num:(输入)将按什么规则生成流水号(生成规则有:年月日、年月日时分秒、年月日时分三种),可选的num有:8、12、14
newOrderNo:(输出)新生成的订单编号
调用存储过程向表中插入数据:
SET @orderNo = ‘‘;
CALL `generate_orderNo`(‘SH‘, 12, @orderNo);
SELECT @orderNo;
查看生成的数据:
在实际项目中只需要修改其中的一些生成规则即可,到此为止,流水号的生成就搞定了
有关mysql存储过程的知识可以参考:MySQL存储过程详解
以上是关于java怎么生成一个一天内不会重复的20位流水号的主要内容,如果未能解决你的问题,请参考以下文章