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