熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

一個數據庫序號類NoCtr類的實現

2013-11-23 18:39:18  來源: Java核心技術 

  一個NoCtrl類的實現
  
  ·
  ·import javasql*;
  ·import comlimingdb*;
  ·import comlimingutil*;
  ·import javatext*;
  ·
  ·/**
  · * <p>Title: 編號控制檔</p>
  · * <p>Description: </p>
  · * <p>Copyright: Copyright (c) </p>
  · * <p>Company: Liming Network System</p>
  · * @author Yao Kui
  · * @version
  · */
  ·
  ·public class NoCtrl {
  · /**
  ·  * 調試模式
  ·  * =非調試模式=調試模式
  ·  */
  · public static int DebugMode = ;
  ·
  · public static String CURR_DATE = CURR_DATE;//編碼規則當前日期eg:
  · public NoCtrl() {
  · }
  · /**
  ·  * @deprecated
  ·  * @see currNO
  ·  * @param tableCode
  ·  * @param columnCode
  ·  * @return
  ·  */
  · public static String currNo(String tableCodeString columnCode){
  ·  Connection con = null;
  ·  Statement stmt = null;
  ·  DBManager dbMgr = new DBManager();
  ·
  ·  try{
  ·   String sqlStr =
  ·     SELECT * FROM NO_CTRL;
  ·   String where = WHERE TABLE_CODE=+tableCode+;
  ·   if(columnCode != null) where += AND COLUMN_CODE=+columnCode+;
  ·   sqlStr += where;
  ·    AppToolsprintStack(sqlStr);
  ·
  ·    if (DebugMode==) {
  ·      con = dbMgrgetConnect(JndiNameJNDIORACLE);
  ·    }
  ·    else {
  ·      con = dbMgrgetConnDirect();
  ·    }
  ·    stmt = concreateStatement();
  ·
  ·    ResultSet rst = stmtexecuteQuery(sqlStr);
  ·    if(rstnext()){
  ·     String prefix = coverFixString(rstgetString(PREFIX));
  ·     String postfix = coverFixString(rstgetString(POSTFIX));
  ·     int currNo = rstgetInt(CURR_NO);
  ·     int numLen = rstgetInt(NUM_LEN);
  ·     stmtexecuteUpdate(UPDATE NO_CTRL SET CURR_NO=CURR_NO++where);
  ·     return prefix+lpad(IntegertoString(currNo)numLen)+postfix;
  ·    }else{
  ·     return null;
  ·    }
  ·  }
  ·  catch(SQLException se) {
  ·    AppToolsprintStack(操作編號控制檔失敗!);
  ·    AppToolsprintStack(se);
  ·    return null;
  ·  }
  ·  catch(Exception e) {
  ·    AppToolsprintStack(操作編號控制檔失敗!);
  ·    AppToolsprintStack(e);
  ·    return null;
  ·  }
  ·  finally
  ·  {
  ·    dbMgrrelease(constmt);
  ·  }
  · }
  · private static String coverFixString(String fix){
  ·  if(fix == null) return ;
  ·  javatextSimpleDateFormat df = new SimpleDateFormat(yyyyMMdd);
  ·  long date = SystemcurrentTimeMillis();
  ·  String datestr = dfformat(new Date(date));
  ·
  ·
  ·  /*if(CURR_DATEequals(fix)){
  ·   javatextSimpleDateFormat df = new SimpleDateFormat(yyyyMMdd);
  ·   long date = SystemcurrentTimeMillis();
  ·   return dfformat(new Date(date));
  ·  }*/
  ·  return fixreplaceAll(CURR_DATEdatestr);
  · }
  · //將字符串左補串到一定長度
  · private static String lpad(String srcString padint len){
  ·  if(srclength() >= len) return src;
  ·  int padLen = len srclength();
  ·  int padTimes = padLenpadlength() + ;
  ·  StringBuffer sb = new StringBuffer();
  ·  for(int i=;i<padTimes;i++){
  ·   sbappend(pad);
  ·  }
  ·  return sbtoString()substring(padLen)+src;
  · }
  · public static void main(String args){
  ·  Systemoutprintln(NoCtrllpad());
  ·
  ·  Systemoutprintln(NoCtrllpad(aaas));
  ·  Systemoutprintln(NoCtrllpad(ab));
  ·  Systemoutprintln(verFixString(null));
  ·
  ·  Systemoutprintln(verFixString(asdff));
  ·  Systemoutprintln(NoCtrlcurrNo(IN_BOXIN_NO));
  · }
  ·
  · /*上面的currNo方法對於業務邏輯後面報錯的情況會出現跳號的情況對於要保證不跳號的業務則不可以
  ·   下面是將取號與更新分開延遲更新來保證不跳號的情況首先業務取得的號(在出現新增頁面則就要顯示編號的情況)
  ·  只是表示大致的編號在更新時一個事務中重新取號與更新編號
  ·  */
  · public static String currNO(String tableCodeString columnCode){
  ·  return currNO(tableCodecolumnCodefalse);
  · }
  ·
  · /**
  ·  *更新序號在業務新增數據中一起執行為了保證多用戶時也正確不會重復取得號後更新時加上原號
  ·  * 作為條件正如多用戶更新加上版本(version)字段一樣
  ·  * @param tableCode
  ·  * @param columnCode
  ·  * @param currNum
  ·  * @return
  ·  */
  · public static String updateNOSql(String tableCodeString columnCodeString currNum){
  ·  return updateNOSql(tableCodecolumnCodecurrNum);
  · }
  ·
  · /*對於上面的取與更新在一個事務中進行只取一個號取時不用加鎖
  ·  對於如果後台要進行插入(多條)取回多個號最好是連續時
  ·  for(){
  ·  insert(no);
  ·  }
  ·  由於在一個事務中所以NO_CTRL沒有更新對自己或其它用戶取下一個號都不對
  ·  所以最好使用加鎖(for update)讀出第一個號最後的更新語句傳導入使用的個數
  ·  var no = 加鎖讀出第一個號
  ·  for(i=;i<xxx;i++){
  ·  insert(no+i);
  ·  }
  ·  update(curr_no=curr_no+xxx)
  ·  */
  · public static String currNO(String tableCodeString columnCodeboolean lock){
  ·  Connection con = null;
  ·  Statement stmt = null;
  ·  DBManager dbMgr = new DBManager();
  ·  String rt = new String;
  ·  try{
  ·   String sqlStr =
  ·     SELECT * FROM NO_CTRL;
  ·   String where = WHERE TABLE_CODE=+tableCode+;
  ·   if(columnCode != null) where += AND COLUMN_CODE=+columnCode+;
  ·   sqlStr += where;
  ·   if(lock) sqlStr += FOR UPDATE; //**LOCK
  ·    AppToolsprintStack(sqlStr);
  ·
  ·    if (DebugMode==) {
  ·      con = dbMgrgetConnect(JndiNameJNDIORACLE);
  ·    }
  ·    else {
  ·      con = dbMgrgetConnDirect();
  ·    }
  ·    stmt = concreateStatement();
  ·
  ·    ResultSet rst = stmtexecuteQuery(sqlStr);
  ·    if(rstnext()){
  ·     String prefix = coverFixString(rstgetString(PREFIX));
  ·     String postfix = coverFixString(rstgetString(POSTFIX));
  ·     int currNo = rstgetInt(CURR_NO);
  ·     int numLen = rstgetInt(NUM_LEN);
  ·     //stmtexecuteUpdate(UPDATE NO_CTRL SET CURR_NO=CURR_NO++where);//延遲更新
  ·     rt = prefix+lpad(IntegertoString(currNo)numLen)+postfix;
  ·     rt = IntegertoString(currNo);
  ·    }
  ·    return rt;
  ·  }
  ·  catch(SQLException se) {
  ·    AppToolsprintStack(操作編號控制檔失敗!);
  ·    AppToolsprintStack(se);
  ·    return null;
  ·  }
  ·  catch(Exception e) {
  ·    AppToolsprintStack(操作編號控制檔失敗!);
  ·    AppToolsprintStack(e);
  ·    return null;
  ·  }
  ·  finally
  ·  {
  ·    dbMgrrelease(constmt);
  ·  }
  · }
  · /**
  ·  * 返回更新NO_CTRL的語句
  ·  * @param tableCod
From:http://tw.wingwit.com/Article/program/Java/hx/201311/25532.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.