项目中用到的流水号格式要求如: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;
}
}
改天设计一个可以按日、月或年复位的流水号。