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
一个数据库序号类NoCtr类的实现
【IT168 技术文档】一个NoCtrl类的实现
0
相关文章