分享
 
 
 

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

王朝other·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有