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 閱讀(5026) 評論(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

          群集...高...這個我真的沒辦法!呵呵!有什么好的建議能否分享下?  回復  更多評論   


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 五华县| 湛江市| 金乡县| 东宁县| 黎平县| 明水县| 杭锦后旗| 龙口市| 金寨县| 辽中县| 孝义市| 巴林右旗| 宁陕县| 郑州市| 宁化县| 清涧县| 临泉县| 平罗县| 永定县| 库尔勒市| 浮梁县| 潞城市| 永安市| 眉山市| 寻甸| 容城县| 胶州市| 怀集县| 九寨沟县| 迭部县| 山西省| 张家港市| 广河县| 达日县| 潞西市| 云浮市| 南漳县| 沁源县| 彩票| 青神县| 宁津县|