龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > 软件开发 > JAVA开发 >

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

时间:2009-12-23 15:42来源:未知 作者:admin 点击:
分享到:
一个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

  一个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
  
精彩图集

赞助商链接