方法一:
不用数据库的话弄个 static个变量,自己设置个synchronized
示例:
import java.text.DecimalFormatimport java.text.SimpleDateFormat
import java.util.Date
public class PrimaryGenerater {
private static final String SERIAL_NUMBER = "XXXX" // 流水号格式
private static PrimaryGenerater primaryGenerater = null
private PrimaryGenerater() {
}
/**
* 取得PrimaryGenerater的单例实现
*
* @return
*/
public static PrimaryGenerater getInstance() {
if (primaryGenerater == null) {
synchronized (PrimaryGenerater.class) {
if (primaryGenerater == null) {
primaryGenerater = new PrimaryGenerater()
}
}
}
return primaryGenerater
}
/**
* 生成下一个编号
*/
public synchronized 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.substring(8, 12)))
}
return id
}
}
方法二:
可以在数据库新建序列,再新建一个存储过程控制序列,返回序列值,比如sqlserver用identity,oracle用序列,存储过程可以加锁,当达到999999的时候重置序列,通过代码调用存储过程获得返回值。
2、全局变量。通过方法获取下一个值,方法同步。
public static String getOrderNo(){long No = 0
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd")
String nowdate = sdf.format(new Date())
No = Long.parseLong(nowdate)*1000//这里如果一天订单多的话可以用一万或更大
No+=getNo()
return getUserId+No
}
public static int getNo(){//返回当天的订单数+1
return 001
}
public static String getUserId(){
return "123"
}
用System.out.print(getOrderNo())测试得到:12320060307001 一般订单号用这样还不错吧。呵呵
java项目实现流水号自动增长项目中有一个规则编号字段,从1开始,编号长度为5位,那么第一条数据编号就是00001。
实现的基本思路就是项目启动时,从数据库获取当前最大值,作为静态变量存储;
业务获取新的编码,考虑并发问题,获取编码方法(编码自增部分)为synchronized同步方法,如果自增为原子操作,则无需同步;
编码前置0,使用String.format("%05d", newNum)格式化获取。
实现代码如下:
private final static AtomicInteger atomic = new AtomicInteger(0)
public static String startFormat(String format) {
return String.format(format, atomic.incrementAndGet())
}