一个NoCtrl类的实现
·
·import Java.sql.*;
·import com.liming.db.*;
·import com.liming.util.*;
·import java.text.*;
·
·/**
· * <pTitle: 编号控制档</p
· * <pDescription: </p
· * <pCopyright:Copyright (c) 2005</p
· * <pCompany: 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