日期+序列構建系統唯一序列號(一)
阿新 • • 發佈:2019-01-09
專案中用到的流水號格式要求如: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>
三、拼接日期和序列
這個流水號設計得比較簡單,序列自增到999999就迴圈又從1開始,和當前日期沒有什麼特別的關聯, 改天設計一個可以按日、月或年復位的流水號。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; } }