网管联盟 | 网管论坛 | 网管u家 | 网管博客 | 网管软件 | 网管求职 | 小游戏 | 网管搜索 | 网管原创 | 网管聚合 | 网管读摘 | 网管焦点 | 世界素材 | 会员投稿 | 会员中心 
中国网管联盟
Windows Linux Cisco 网络技术 数据库 黑客攻防 DotNet Java PHP 认证 新闻资讯 服务器 存储资讯 网络设备 网管学堂 技术专题 焦点 网吧频道
 当前位置: > bitsCN.com > JAVA > 核心技术 > 高级编程 > 一个数据库序号类NoCtr类的实现  

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

2005-07-23  作者:BitsCN整理  来源:中国网管联盟  点评 投稿 收藏


  一个NoCtrl类的实现
  
  ·
  ·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;
网管bitscn_com

  ·  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");

网管联盟bitsCN@com


  ·     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));
  · 网管网www.bitscn.com
  ·
  ·  /*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)); 网管下载dl.bitscn.com
  ·  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){ 网管u家www.bitscn.net
  ·  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+"'"; 网管联盟bitsCN_com
  ·   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); 网管网www.bitscn.com
  ·    }
  ·    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
TAGs实现   更新   AppTools.printStack   if   编号   null   sqlStr    
 上一篇:软件开发详解:从Continuation说起   下一篇:Java.util包简介 如何开发应用之二
相关文章列表
一个数据库序号类NoCtr类的实现 评论:
loading.. 评论加载中…
评论:请自觉遵守互联网相关政策法规,评论不得超过250字。

验证码: 注册用户
本类热门排行:
1.ajax验证用户名是否可用
2.在jbuilder和netbeans中打jar包发布程序
3.如何在java中操作word
4.Proxool连接池相关介绍
5.Hibernate实现DAO的常用CRUD操作
6.用javascript与java进行RSA加密与解密
7.使用java zip 压缩文件目录
8.身份证号码的升位和验证
9.jsp 实现在线人数统计
10.jdbc方式读取oracle的clob字段实例
最新推荐文章:
1.该如何实践State模式
2.JFreeChart中柱状图的详细设置
3.Java Swing APIs可插拔式外观风格特性应
4.用信号量Semaphore实现互斥锁Mutex
5.使用Weblogic Integration的应用程序架构
6.设计Java应用程序
7.对Java嵌套类的讨论(上)
8.提高Java代码可重用性的三个措施
9.JAVA上加密算法的实现用例
10.总结篇:将内部类进行到底
网管论坛交流:
·大家来开心一下吧---看了会很开心的东西-
·中国人不可不知道的知识
·@@小鹏◎◎小鹏同志与某位女明星亲密接触
·◎◎小鹏◎◎发现不明生物,居然正在交配
·[图文]^^^版主是什么?????
·泡论坛的女人是好女人
·做个“水性杨花”的女人
·献给mm俱乐部的所有mm
·深圳一集团企业电脑基础应用培训教程
·■■■■十一遊玩照■■■■■