在实际的开发中,可能会有根据一定的规则生成流水号的需求(比如根据根据公司编码和日期生成4位流水号)我们可以把公司和日期联合起来作为一个业务编码,把这个业务编码和序列的值存储到数据库中,每次需要生成流水号的时候根据公司和日期联合起来生成的这个业务编码去数据库里边去查,若有记录的话就把记录的话就把对应的序列值返回,然后序列的值加一,若根据对应的业务编码查询不到相应的记录就把流水号对应的最小的值返回,然后在数据库中插入相应的记录

缺点:在集群环境下可能导致在两台服务器上生成的流水号一致的情况(解决方法是在数据库中使用存储过程来生成随机数,在存储过程中进行同步)

这种场景使用类似BerkeleyDB这种K,Value对数据库来实现是最好的选择(下面先贴出使用传统的关系型数据库来实现的例子,使用BerkeleyDB的例子随后会给出)

import java.math.BigDecimal;
import org.quickbundle.project.RmProjectHelper;
import org.quickbundle.project.common.vo.RmCommonVo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; /**
* 流水号生成器
* @author Administrator
*
*/
public class SeriaNumberGenerator {
Logger logger = LoggerFactory.getLogger(SeriaNumberGenerator.class);
private static int MAX_VALUE=9999;
private static int MIN_VALUE = 1;
/**
* 根据业务标识符取到下一个流水号
* @param businessCode
* @return
*/
public synchronized String getNextVal(String businessCode){ int currentValue ;
int nextValue ;
RmCommonVo comonVo =null;
try{
comonVo = RmProjectHelper.getCommonServiceInstance().doQueryForObject("select CURRENT_VALUE from SERIAL_NUMBER WHERE KEY ='"+businessCode+"'");
}catch( org.springframework.dao.EmptyResultDataAccessException ex){
logger.error("结果集为空,SpringJdbc抛出异常,不影响程序执行...");
} //该key不存在(存放进去)
if(comonVo == null ||comonVo.size()== 0){
currentValue= MIN_VALUE;
nextValue = currentValue +1; RmProjectHelper.getCommonServiceInstance().doUpdate(" insert into SERIAL_NUMBER (KEY, CURRENT_VALUE ) VALUES ('"+businessCode+"','"+nextValue+"')"); }
//
else{ currentValue = ((BigDecimal)comonVo.get("CURRENT_VALUE")).intValue();
//已经到达最大值
if(MAX_VALUE==currentValue){
nextValue =MIN_VALUE;
}else{
nextValue = currentValue+1;
}
RmProjectHelper.getCommonServiceInstance().doUpdate("update SERIAL_NUMBER set CURRENT_VALUE='"+nextValue+"' WHERE KEY='"+businessCode+"'");
} String finalValue = this.formatString(currentValue);
return finalValue ;
} public SeriaNumberGenerator(){ } /**
* 将数字转换为字符串(当不足4位时高位补0)
* @param input
* @return
*/
public String formatString(int input){
String result ;
//大于1000时直接转换成字符串返回
if(input > 1000){
result = input+"";
}else{//根据位数的不同前边补不同的0
int length = (input +"").length(); if(length == 1){
result = "000"+input;
}else if(length ==2){
result = "00"+input;
}else{
result = "0"+input;
}
}
return result;
} }

java中生成流水号的一个例子(使用关系型数据库)的更多相关文章

  1. java中生成流水号的一个例子(使用BerkeleyDB)

    package com.jiaoyiping.berkeleydb; import com.sleepycat.je.*; import com.sleepycat.utilint.StringUti ...

  2. (转)Java中使用正则表达式的一个简单例子及常用正则分享

    转自:http://www.jb51.net/article/67724.htm 这篇文章主要介绍了Java中使用正则表达式的一个简单例子及常用正则分享,本文用一个验证Email的例子讲解JAVA中如 ...

  3. 关于android开发添加菜单XML文件之后无法在R.java中生成ID的问题

    因为和同学分开做的android软件,现在想整合他做的界面部分,于是拷贝了res和src文件夹的文件,其中包括一个res.menu文件夹中的XML.但是每次将该文件导入到工程总无法自动在R.java中 ...

  4. 在java中生成二维码,并直接输出到jsp页面

    在java中生成的二维码不存到磁盘里要直接输出到页面上,这就需要把生成的二维码直接以流的形式输出到页面上,我用的是myeclipse 和 tomcat 它的原理是:在加载页面时,根据img的src(c ...

  5. JAVA中生成、解析二维码图片的方法

    JAVA中生成.解析二维码的方法并不复杂,使用google的zxing包就可以实现.下面的方法包含了生成二维码.在中间附加logo.添加文字功能,并有解析二维码的方法. 一.下载zxing的架包,并导 ...

  6. 【学习笔记】Java中生成对象的5中方法

    概述:本文介绍以下java五种创建对象的方式: 1.用new语句创建对象,这是最常用的创建对象的方式. 2.使用Class类的newInstance方法 3.运用反射手段,调用java.lang.re ...

  7. JAVA中生成指定位数随机数的方法总结

    JAVA中生成指定位数随机数的方法很多,下面列举几种比较常用的方法. 方法一.通过Math类 public static String getRandom1(int len) { int rs = ( ...

  8. Java中是否可以调用一个类中的main方法?

    前几天面试的时候,被问到在Java中是否可以调用一个类中的main方法?回来测试了下,答案是可以!代码如下: main1中调用main2的主方法 package org.fiu.test; impor ...

  9. java中生成验证码,以及验证码的使用

    java中生成验证码,以及验证码的使用: 1:验证码生成工具类: import java.awt.Color; import java.awt.Font; import java.awt.Graphi ...

随机推荐

  1. 我的mac的其他满了,发现是一个叫core的文件

    6Q12KFX%PDARS7B{B__OZVW.jpg (97.93 KB, 下载次数: 0) 下载附件  保存到相册 2014-7-3 15:40 上传   如图,电脑虽然买了半年但是基本没怎么用, ...

  2. html静态页面调用php文件

    如在页面a.html中用下面这句调用,可以将action=test的参数传递到b.php. Javascript代码 <script type="text/javascript&quo ...

  3. /etc/fstab下的挂载类型defaults默认参数

    [root@ob2 data]# cat /etc/fstab -98c0-59dbbcf8b040 / ext4 defaults UUID=e4ab7a0c-500f--bcd2-a77be0ce ...

  4. Hbase建模

    转自:http://blog.itpub.net/28912557/viewspace-1119865/ 什么情况下使用Hbase?1,成熟的数据分析主题,查询模式已经确定并且不易轻易改变.(主要还是 ...

  5. 终于想明白一些事,关于NAS

    一直以来想搞好一部NAS存储小孩的视频和照片,一直纠结用什么硬件,硬件解决后虽然不甚满意,不过无论怎么样都算投入巨资(超过7千……)组装完毕,然后就一直纠结用什么NAS系统,终于下定决心使用了OMV, ...

  6. imx6 qt 24bpp RGB

    imx6运行qt,在24bit的LVDS接口屏上显示时,显示效果与实际的不同.蓝色变成了黄色. 本来应该显示成蓝色: 实际上去显示成了黄色: 而其他绿色的图标并没有改变,只是蓝色和黄色互换了. 猜想应 ...

  7. (转)音频输出PCM与LPCM有什么不同

     多声道LPCM:无损音轨原始存在格式,概念上等效于wave文件,并不需要运算解码,可直接输入功放进行DA转换,光纤和同轴接口只能传输2声道LPCM,多声道LPCM需要HDMI接口传输.   PCM: ...

  8. 转载:15个最受欢迎的Python开源框架

    出自:http://python.jobbole.com/72306/?replytocom=57112 15个最受欢迎的Python开源框架 Django: Python Web应用开发框架 Dja ...

  9. Labview按钮的机械动作

    LabVIEW 对于按钮控件的机械动作提供了六个不同的选择,它们可以通过右键按钮并选择机械动作来找到.这些不同的选项导致按钮输出的值的行为不同.下里将这六个选项做一个简短的总结: 单击时转换当用鼠标将 ...

  10. 文本处理三剑客之AWK的用法

    1.awk命令简介: awk是一种可以处理数据.产生格式化报表的语言,功能十分强大. awk的工作方式是读取数据,将每一行数据视为一条记录(record)每笔记录以字段分隔符分成若干字段,然后输出各个 ...