技术开发 频道

一个数据库序号类NoCtr类的实现

  【IT168 技术文档】一个NoCtrl类的实现
  

  import java.sql.*;   import com.liming.db.*;   import com.liming.util.*;   import java.text.*;      /**    * <p>Title: 编号控制档</p>    * <p>Description: </p>    * <p>Copyright: Copyright (c) 2005</p>    * <p>Company: Liming Network System</p>    * @author Yao Kui    * @version 1.0    */      public class NoCtrl {    /**     * 调试模式     * 0=非调试模式;1=调试模式     */    public static int DebugMode = 0;       public static String CURR_DATE = "CURR_DATE";//编码规则,当前日期eg:20050501    public NoCtrl() {    }    /**     * @deprecated     * @see currNO     * @param tableCode     * @param columnCode     * @return     */    public static String currNo(String tableCode,String 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;       AppTools.printStack(sqlStr);          if (DebugMode==0) {         con = dbMgr.getConnect(JndiName.JNDIORACLE);       }       else {         con = dbMgr.getConnDirect();       }       stmt = con.createStatement();          ResultSet rst = stmt.executeQuery(sqlStr);       if(rst.next()){        String prefix = coverFixString(rst.getString("PREFIX"));        String postfix = coverFixString(rst.getString("POSTFIX"));        int currNo = rst.getInt("CURR_NO");        int numLen = rst.getInt("NUM_LEN");        stmt.executeUpdate("UPDATE NO_CTRL SET CURR_NO=CURR_NO+1"+where);        return prefix+lpad(Integer.toString(currNo),"0",numLen)+postfix;       }else{        return null;       }     }     catch(SQLException se) {       AppTools.printStack("操作编号控制档失败!");       AppTools.printStack(se);       return null;     }     catch(Exception e) {       AppTools.printStack("操作编号控制档失败!");       AppTools.printStack(e);       return null;     }     finally     {       dbMgr.release(con,stmt);     }    }    private static String coverFixString(String fix){     if(fix == null) return "";     java.text.SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");     long date = System.currentTimeMillis();     String datestr = df.format(new Date(date));           /*if(CURR_DATE.equals(fix)){      java.text.SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");      long date = System.currentTimeMillis();      return df.format(new Date(date));     }*/     return fix.replaceAll(CURR_DATE,datestr);    }    //将字符串左补串到一定长度    private static String lpad(String src,String pad,int len){     if(src.length() >= len) return src;     int padLen = len - src.length();     int padTimes = padLenpad.length() + 1;     StringBuffer sb = new StringBuffer();     for(int i=0;i<padTimes;i++){      sb.append(pad);     }     return sb.toString().substring(0,padLen)+src;    }    public static void main(String args){     System.out.println(NoCtrl.lpad("15","0",5));        System.out.println(NoCtrl.lpad("aaas15","0",5));     System.out.println(NoCtrl.lpad("15","ab",5));     System.out.println(NoCtrl.coverFixString(null));        System.out.println(NoCtrl.coverFixString("asdff"));     System.out.println(NoCtrl.currNo("IN_BOX","IN_NO"));    }       /*上面的currNo方法对于业务逻辑后面报错的情况,会出现跳号的情况。对于要保证不跳号的业务则不可以。      下面是将取号与更新分开,延迟更新来保证不跳号的情况。首先业务取得的号(在出现新增页面则就要显示编号的情况)     只是表示“大致”的编号,在更新时一个事务中重新取号与更新编号。     */    public static String currNO(String tableCode,String columnCode){     return currNO(tableCode,columnCode,false);    }       /**     *更新序号,在业务新增数据中一起执行,为了保证多用户时也正确,不会重复。取得号后更新时加上原号     * 作为条件,正如多用户更新加上版本(version)字段一样。     * @param tableCode     * @param columnCode     * @param currNum     * @return     */    public static String updateNOSql(String tableCode,String columnCode,String currNum){     return updateNOSql(tableCode,columnCode,currNum,1);    }       /*对于上面的取与更新在一个事务中进行。只取一个号,取时不用加锁。     对于如果后台要进行插入(多条),取回多个号,最好是连续时。如     for(){     insert(no,..);     }     由于在一个事务中,所以NO_CTRL没有更新,对自己或其它用户,取下一个号都不对。     所以最好使用加锁(for update)读出第一个号,最后的更新语句传导入使用的个数。     var no = 加锁读出第一个号。     for(i=0;i<xxx;i++){     insert(no+i,...);     }     update(curr_no=curr_no+xxx)。     */    public static String currNO(String tableCode,String columnCode,boolean lock){     Connection con = null;     Statement stmt = null;     DBManager dbMgr = new DBManager();     String rt = new String2;     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       AppTools.printStack(sqlStr);          if (DebugMode==0) {         con = dbMgr.getConnect(JndiName.JNDIORACLE);       }       else {         con = dbMgr.getConnDirect();       }       stmt = con.createStatement();          ResultSet rst = stmt.executeQuery(sqlStr);       if(rst.next()){        String prefix = coverFixString(rst.getString("PREFIX"));        String postfix = coverFixString(rst.getString("POSTFIX"));        int currNo = rst.getInt("CURR_NO");        int numLen = rst.getInt("NUM_LEN");        //stmt.executeUpdate("UPDATE NO_CTRL SET CURR_NO=CURR_NO+1"+where);//延迟更新        rt0 = prefix+lpad(Integer.toString(currNo),"0",numLen)+postfix;        rt1 = Integer.toString(currNo);       }       return rt;     }     catch(SQLException se) {       AppTools.printStack("操作编号控制档失败!");       AppTools.printStack(se);       return null;     }     catch(Exception e) {       AppTools.printStack("操作编号控制档失败!");       AppTools.printStack(e);       return null;     }     finally     {       dbMgr.release(con,stmt);     }    }    /**     * 返回更新NO_CTRL的语句     * @param tableCod
0
相关文章