浏览 6372 次
锁定老帖子 主题:用SerialNumber生成流水号
该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间:2009-09-28
在很多程序的应用中,有许多的地方会用到流水号,我写了个专门用来生成流水号的类
使用:
SerialNumber sn=new SerialNumber(); sn.getSerialNum(tablename, column);//tablename 表名 //column 主键字段(流水号列) sn.toString(num, length); //将指定的数字格式化 如: sn.toString(1,4); //结果为0001
下面是SerialNumber类的源代码
package com.aiy.util; import java.text.SimpleDateFormat; import java.util.Date; import com.aiy.base.DatabaseUtil; /** * * @author aiyanbo * */ public class SerialNumber { private String prefix="SN"; private String timeFormat="yyMMdd"; private int digit=4; public SerialNumber() {} public SerialNumber(String prefix) { this.prefix = prefix; } public SerialNumber(String prefix, String timeFormat, int digit) { if(digit<2) digit=2; this.prefix = prefix; this.timeFormat = timeFormat; this.digit = digit; } public synchronized String getSerialNum(String tablename,String column){ SerialSource ins=setInstace(tablename, column); String date=getDate(); if(ins==null){ return prefix+date+toString(1, digit); } int max=getMax(ins.getSn()); return prefix+date+toString(max, digit); } private SerialSource setInstace(String tablename,String column){ DatabaseUtil<SerialSource> db=new DatabaseUtil<SerialSource>(SerialSource.class); String sql="select top 1 "+column+" sn from "+tablename+" where "+column+" like '"+(prefix+getDate())+"%' order by "+column+" desc"; return db.queryOne(sql); } private String getDate(){ SimpleDateFormat format=new SimpleDateFormat(timeFormat); Date date=new Date(); return format.format(date); } private int getMax(String sn){ return Integer.parseInt(sn.substring((prefix+getDate()).length()))+1; } public String toString(int num,int length){ String str=""; String numlen=""+num; for(int i=length-(numlen.length());i>0;i-- ){ str=str+"0"; } return str+num; } } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-09-29
直接用 java.util.concurrent.atomic.AtomicLong生成流水号 也不错吧~~
如果不是分布式系统的话 |
|
返回顶楼 | |
发表时间:2009-09-29
我们系统的流水号是:yyyyMMdd-HHmmssSSS-XXXX,精确到毫秒,再加了4位随机数,这个若能重复,就碰墙去了。且从流水号可以看出操作时间
|
|
返回顶楼 | |
发表时间:2009-09-29
其实很多系统都是整到纳秒级别,之后加随机数,毫秒级别的还是比较容易的,特别是在分布式的情况下。
|
|
返回顶楼 | |
发表时间:2009-09-30
mwmw 写道 其实很多系统都是整到纳秒级别,之后加随机数,毫秒级别的还是比较容易的,特别是在分布式的情况下。
不过现在好像生成的那个纳秒数都是有错的 !! 不知道 大家注意到没 |
|
返回顶楼 | |
发表时间:2009-09-30
java.util.concurrent.atomic.AtomicLong
好用。学习了。 |
|
返回顶楼 | |
发表时间:2009-09-30
再次被雷倒了。
spring的不好用吗? 配一个: maxValueIncrementer=org.springframework.jdbc.support.incrementer.MySQLMaxValueIncrementer 再配一个bean: <bean id="userIncrementer" class="${maxValueIncrementer}"> <property name="dataSource" ref="dataSource"/> <property name="incrementerName" value="user_sequence"/> <property name="columnName" value="value"/> </bean> 人家的还有并发缓存控制。 |
|
返回顶楼 | |
发表时间:2009-09-30
流水号应该能定制的,这样搞有啥用。。。。
|
|
返回顶楼 | |