生成自增的编号:



	/**
	 * 生成工单编码
	 * 
	 * @param workSheetType
	 *            工单类型
	 * @param systemName
	 *            系统名称
	 * @param cityCode
	 *            城市编码
	 * @return 形如AAA-BBB-CC-081127-0029
	 */
	public synchronized String nextWorkSheetNum(String workSheetType, String systemName, String cityCode)
	{
		String seqName = workSheetType + SEPARATOR + systemName + SEPARATOR + cityCode;
		int nextSequnceValue = nextDailySequnceValue(seqName);
		String result = seqName + SEPARATOR + todayStr() + SEPARATOR + leftPadWithZero(nextSequnceValue, PAD4);
		return result;
	}


	//org.apache.commons.lang.StringUtils
	//num为原数字,padwith为总共补齐的位数,0 为用什么补齐。 leftPad 是在左边用0补齐。
	return StringUtils.leftPad(String.valueOf(num), padWith, '0');

	//存储编号的类
	public class IdSequnce {
		private String name;
		private int curVal;
		private Date updatedAt;
		....
	}

	/**
	 * 下一序列值,以天为周期
	 * 
	 * @param name
	 *            序列名
	 * @return int数值>=1
	 */
	public int nextDailySequnceValue(String name)
	{
		IdSequnce seq = idSequnceDAO.getSequnceByName(name);
		if (seq == null)
		{
			seq = new IdSequnce();
			seq.setName(name);
			seq.setCurVal(0);
			seq.setUpdatedAt(new Date());
			try
			{
				idSequnceDAO.insert(seq);
			}
			catch (Exception e)
			{// 集群环境并发情况下,已被别应用服初始化该记录
				seq = idSequnceDAO.getSequnceByName(name);
			}
		}
		if (seq.getUpdatedAt() != null && DateUtil.isBeforeToday(seq.getUpdatedAt()))//(修改日期不为空,并且是今天之前修改的)所以,今天还没有编号
		{
			DevLog.debug("initial seq value");
			seq.setCurVal(0);
		}
		seq.setUpdatedAt(new Date());
		idSequnceDAO.increaseSequnce(seq);
		return seq.getCurVal();
	}
	
	
	/**
	 * 今天之前的日期
	 * 
	 * @return boolean
	 */
	public static boolean isBeforeToday(Date date) {
		Date todayZero = getTodayZeroClock();
		return isBefore(date, todayZero);
	}
	//编号加一
	public void increaseSequnce(IdSequnce sequnce){
		sequnce.setCurVal(sequnce.getCurVal()+1);
		update(sequnce);
	}

	
	
说明:IdSequnce 创建了一个表,一个类,用来存储当前的最大的编号。

结果为:形如AAA-BBB-CC-081127-0005