1. 程式人生 > >日期+序列構建系統唯一序列號(一)

日期+序列構建系統唯一序列號(一)

專案中用到的流水號格式要求如:20170928000001,即當前年月日 + 自增序列構成

一、建立序列

create sequence sys_seq
minvalue 1
maxvalue 999999
start whit 1
increment by 1
cache 50
cycle
NOORDER;

二、獲取序列

<select id="selectSequence.sql" resultClass="string">
    select sys_seq.nextval from dual
</select>

三、拼接日期和序列

package sequence;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;

@Service
public class SerialServiceImpl implements SerialService {
	
	@Resource
	private SequenceDao sequenceDao;
	
	//為了防止併發問題  這裡利用ThreadLocal來保護DateFormat物件
	//當然也可以將DateFormat作為方法getSerial的區域性變數,每次取都new一個
	private static final ThreadLocal<DateFormat> df = new ThreadLocal<DateFormat>() {
		@Override
		protected DateFormat initialValue() {
			return new SimpleDateFormat("yyyyMMdd");
		}
	};

	@Override
	public String getSerial() {
		String seq = sequenceDao.selectSequence();
		String date = df.get().format(new Date());
		//序列前需要填充0補足6位
		String serial = date + String.format("%06d", Integer.parseInt(seq));
		return serial;
	}

}
這個流水號設計得比較簡單,序列自增到999999就迴圈又從1開始,和當前日期沒有什麼特別的關聯, 改天設計一個可以按日、月或年復位的流水號。