浅谈自动产生流水号的几种方式

 

 项目中都会用到编号或者编码。生成编码需要一定格式,但这个不是难点,主要的难点在于如何控制编码不重复。

先贴一段生成流水号的代码

package com.ra.testClass;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

public class Test2 {

private static final String SERIAL_NUMBER = "XXXX"; // 流水号格式
private static Test2 primaryGenerater = null;

private Test2() {
}

/**
* 取得PrimaryGenerater的单例实现
*
* @return
*/
public static Test2 getInstance() {
if (primaryGenerater == null) {
synchronized (Test2.class) {
if (primaryGenerater == null) {
primaryGenerater = new Test2();
}
}
}
return primaryGenerater;
}

public static void main(String[] args){
System.out.println(generaterNextNumber("1"));
}

/**
* 生成下一个编号
*/
public synchronized static String generaterNextNumber(String sno) {
String id = null;
Date date = new Date();
SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd");
if (sno == null) {
id = formatter.format(date) + "0001";
} else {
int count = SERIAL_NUMBER.length();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < count; i++) {
sb.append("0");
}
DecimalFormat df = new DecimalFormat("0000");
id = formatter.format(date)
+ df.format(1 + Integer.parseInt(sno));
}
return id;
}
}

这种方式不能保证编码的唯一性,下面介绍两种能保证编码唯一性的方式

  (1)项目中新建文件CommonSerialNumber.csn ,内容随意给一个值,比如:1001

public String getDangerGoodsCommonBH(String typeCode){
String bh = "";
if(StringUtils.isNotBlank(typeCode)){
String filename = getClass().getClassLoader().getResource("/")
.getPath()+ "CommonSerialNumber.csn";
File file = new File(filename);
if (file.exists() && file.isFile()) {
SimpleDateFormat sdf = new SimpleDateFormat("yyMMdd");
String middleCode = sdf.format(new Date());
List<String> list = FileUtil.readList(file);
String[] data = list.get(0).split(",");
int num = Integer.parseInt(data[0]);
FileUtil.rewrite(file, String.valueOf((num + 1)));
bh = typeCode+middleCode+num;
}
}
return bh;
}

 

(2)参考第一段代码,从数据库取出该表的最大编号值,截取后几位 +1即可

posted @ 2015-05-11 11:44  rookie_d  阅读(788)  评论(0编辑  收藏  举报