北在北方

太白枝头看,花开不计年,杯中浮日月,楼外是青天。

导航

简单流水号生成

Posted on 2012-09-16 17:52  CN.programmer.Luxh  阅读(1694)  评论(3编辑  收藏  举报

  项目中有这样的需求:每天从00001开始生成5位的流水号,比如2012年9月16日,00001、00002、......99999,到2012年9月17日,又从00001开始。而且系统重启后依然需要保持流水性,重启前是00012,那么重启后需要从00013开始。

  选择的一个方案就是将流水号保存到数据库。

  1、流水号实体

/**
 * 流水号
 * @author Luxh
 * 2012-9-16
 */
public class SerialNumber {
    
    
    private String id;
    
    /**
     * 流水号
     */
    private Integer serialNo;
    
    /**
     * 生成日期(格式:yyyyMMdd)
     */
    private String generateDate;
    
    //getter/setter方法
    //...
}

  2、流水号实体对应的数据表

  3、生成流水号的程序

/**
     * 生成流水号
     * @return
     */
    public String generateSerialNumber() {
        //当天的初始化流水号为1
        Integer serialNo = 1;
        //查询当天的下一个流水号
        String hql = "SELECT max(t.serialNo+1) FROM SerialNumber t WHERE t.generateDate=?";
        
        String generateDate = DateUtils.formatDate(new Date(), "yyyyMMdd");
        Object obj = session.createQuery(hql).setParameter(0, generateDate).uniqueResult();
        if(obj != null) {
            serialNo = (Integer) obj;
        }
        
        //将当前序列号保存到数据库
        SerialNumber sn = new SerialNumber();
        sn.setSerialNo(serialNo);
        sn.setGenerateDate(generateDate);
        session.save(sn);
        
        //将流水号格式化为 "00001"  5位长度返回
        return String.format("%05d", serialNo);
    }