codeslave

常用链接

统计

Link

最新评论

java实现数据库序号(流水号)

开发中经常会用到如001,002,或者DOC001,DOC002之类的序号(俗称的流水号)作为主键,实现
的方法不难,原理也是取得数据库中最大的记录然后进行加1操作,而取得最大记录的方式应该有两种,一种
是从数据库中取得记录集,然后用代码去遍历和判断,不过这种方式感觉不太实际(^-^汗)!而另一种方式是
用sql语句直接取出最大的记录!

呵呵!~还是不讲太多废话了,相信这些大家都知道!下面就共享一些主要用第二种方式来实现的源码!

源码:sequencenumber1.0_src.rar

jar包(^_^方便用):sequencenumber1.0.rar

不过只现在只支持mysql,sqlserver,access,oracle等四种数据库(^_^因为偶也只用到这几种数据库)!不

过各位程序员们可自行扩展,原开发环境是eclipse3.2 + jdk1.5!

支持的格式有纯数字(如:1、2),字符(如:001、002),序号头 + 序号(如DOC001、DOC002),序号头 + 日期 + 序号(如:DOC20070206001、DOC20070206002)

源码中有测试的例子,如:

// test
public   static   void  main(String[] args)  throws  Exception  {
        
// 不需要数据库支持
        SequenceNumber sn  =   new  AccessSequenceNumber();
        System.out.println(
" general number: "   +  sn.getGeneralNumber( " DOC " ));
        
// 需要数据库支持(以下测试部分需要Connection,请先根据数据库类型取得连接对象,再进行测试^-^)
        
// 测试前先建立表:TEST;字段:TESTID:文本(30)
        
// 型式:sn = new AccessSequenceNumber(Connection对象)或sn.setConnection(Connection对象);
        sn.setConnection(JdbcUtil.getConnection_Access());
        
// 注:getSequenceNumber_Number方法中如果字段的原始记录存在非数字字符,例:'A12'、'f22',则会抛出字符到数字的转换异常。
        
// 建议getSequenceNumber_Number与其它方法不要同时测试。
        System.out.println( " sequencenumber number: "   +  sn.getSequenceNumber_Number( " TEST " " TESTID " ));
        System.out.println(
" sequencenumber number: "   +  sn.getSequenceNumber_Number( " TEST " " TESTID " 10000 ));
        
// 测试下面时请最好先注释上面两句代码,否则当数据库存在非纯数字记录时会抛出异常。
        
// 建议一次只测试一个方法。
        
// System.out.println("sequencenumber number:" + sn.getSequenceNumber_String("TEST", "TESTID", null, 6));
        
// System.out.println("sequencenumber number:" + sn.getSequenceNumber_String("TEST", "TESTID", "DOC", 6));
        
// System.out.println("sequencenumber number:" + sn.getSequenceNumber_String("TEST", "TESTID", null, 6, 'A'));
        
// System.out.println("sequencenumber number:" + sn.getSequenceNumber_String("TEST", "TESTID", "DOC", 6, 'A'));
        
// System.out.println("sequencenumber number:" + sn.getSequenceNumber_Date("TEST", "TESTID", "DOC", 6));
        
// System.out.println("sequencenumber number:" + sn.getSequenceNumber_Date("TEST", "TESTID", null, 6));
        
// System.out.println("sequencenumber number:" + sn.getSequenceNumber_Date("TEST", "TESTID", "DOC", 6, 'A'));
        
// System.out.println("sequencenumber number:" + sn.getSequenceNumber_Date("TEST", "TESTID", null, 6, 'A'));
        sn.close();
    }

不说太多了,还是自已慢慢看吧!

posted on 2007-02-06 15:51 codeslave 阅读(5014) 评论(11)  编辑  收藏 所属分类: java

评论

# re: java实现数据库序号(流水号) 2007-02-06 15:53 lxc

好贴,定了~  回复  更多评论   

# re: java实现数据库序号(流水号) 2007-02-06 15:54 lxc

这次顶两次了~^_^  回复  更多评论   

# re: java实现数据库序号(流水号)[未登录] 2007-02-06 15:58 leon

顶顶顶顶顶 顶顶顶顶顶
  顶    顶
  顶   顶顶顶顶顶
  顶   顶 顶 顶
  顶   顶 顶 顶
  顶    顶 顶
 顶顶    顶 顶  回复  更多评论   

# re: java实现数据库序号(流水号) 2007-02-07 08:37 匿名

不考虑事务的话。你不担心主键冲突啊。  回复  更多评论   

# re: java实现数据库序号(流水号) 2007-02-07 09:32 codeslave

首先感谢你提出的宝贵意见,不过我未清楚你所讲的事务指的是那个,线程内的事务可用connection来控制!如果你指的是多用户并发,那确实有可能产生主键冲突的异常,不过要解决这个问题不是少少代码就做到的(但还是可以实现^-^,如用线程同步,只要缓存序号,那么并发产生的序号也不会相同)!而且并发性太大的系统也应该采用数据库自动生成的序号或者一些产生唯一编号的算法,而现在这个还是可以用在并发性不大的系统上!  回复  更多评论   

# re: java实现数据库序号(流水号) 2007-02-09 12:07 匿名

嗯。我是说多用户并发。可能大多数开发,采用自动增长字段作为主键吧。或者是sequence来处理吧。  回复  更多评论   

# re: java实现数据库序号(流水号) 2009-01-14 15:34 匿名

太天真了,完全没考虑并发。  回复  更多评论   

# re: java实现数据库序号(流水号) 2009-01-15 09:27 codeslave

@匿名
呵呵!想不到还有人关注这个,里面的确没考虑,但可以外部做,如下
private static Object synO = new Object();

public void method() {
synchronized(synO) {
取得流水号!
}
}  回复  更多评论   

# re: java实现数据库序号(流水号) 2009-05-26 17:02 kelli

顶!!!!  回复  更多评论   

# re: java实现数据库序号(流水号) 2009-07-10 10:32 prance

没考虑在负载均衡情况下的使用  回复  更多评论   

# re: java实现数据库序号(流水号) 2009-07-10 12:42 codeslave

群集...高...这个我真的没办法!呵呵!有什么好的建议能否分享下?  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航: