一个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