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

在实际的开发中,可能会有根据一定的规则生成流水号的需求(比如根据根据公司编码和日期生成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中生成流水号的一个例子(使用关系型数据库),布布扣,bubuko.com

时间: 2024-10-01 05:01:56

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

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

package com.jiaoyiping.berkeleydb; import com.sleepycat.je.*; import com.sleepycat.utilint.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.UnsupportedEncodingException; /** * Created with IntelliJ IDEA. * User: 焦一

JAVA中生成二维码图片的方法

JAVA中生成二维码的方法并不复杂,使用google的zxing包就可以实现.下面的方法包含了生成二维码.在中间附加logo.添加文字功能. 一.下载zxing的架包,并导入项目中,如下: 最主要的包都在com.google.zxing.core下.如果是maven项目,maven依赖如下: 1 <dependency> 2 <groupId>com.google.zxing</groupId> 3 <artifactId>core</artifact

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

概述:本文介绍以下java五种创建对象的方式: 1.用new语句创建对象,这是最常用的创建对象的方式. 2.使用Class类的newInstance方法 3.运用反射手段,调用java.lang.reflect.Constructor类的newInstance()实例方法. 4.调用对象的clone()方法. 5.运用反序列化手段,调用java.io.ObjectInputStream对象的readObject()方法. 一.使用new关键字 这是最常见也是最简单的创建对象的方式了.通过这种方式

Java中生成符合http响应头中的Date格式的字符串

在http header中,Date头域表示消息发送的时间,时间的描述格式由rfc822(电子邮件的标准格式)定义.例如,Date: Sat, 05 Jul 2014 12:53:36 GMT.具体格式说明如下: 标准格式:DAY, DD MMM YYYY HH:MM:SS GMT,其中 DAY: 由三个英文字母指代的星期(Sun, Mon, Tue, Wed, Thu, Fri, Sat). DD: 日(such as 01 for the first day of the month). M

JAVA中TCP和UDP传输例子的对比

在本文中我将学到的java中的UDP和TCP在局域网内的传输做了对比,这里强调 的是局域网范围内,非广域网.首先,下面的是我写的在局域网内利用java中的UDP协议写的一个传输文件或者图片的类. --------------------------------------------------------------------------------------------------------------------------------------------------------

Java中关于 BigDecimal 的一个导致double精度损失的&quot;bug&quot;

背景 在博客 恶心的0.5四舍五入问题 一文中看到一个关于 0.5 不能正确的四舍五入的问题.主要说的是 double 转换到 BigDecimal 后,进行四舍五入得不到正确的结果: public class BigDecimalTest { public static void main(String[] args){ double d = 301353.05; BigDecimal decimal = new BigDecimal(d); System.out.println(decima

Java中生成帮助文档

如何在Java中使用注释 在编写程序时,经常需要添加一些注释,用以描述某段代码的作用. 一般来说,对于一份规范的程序源代码而言,注释应该占到源代码的 1/3 以上.因此,注释是程序源代码的重要组成部分,一定要加以重视哦! Java 中注释有三种类型:单行注释.多行注释.文档注释 运行结果:?Hello Imooc! 看:被注释的代码块在程序运行时是不会被执行的~~ 我们可以通过?javadoc?命令从文档注释中提取内容,生成程序的 API 帮助文档. 打开首页,查看下生成的 API 文档 PS:

为什么java中只允许继承一个类?

一个类只能继承一个其他的类 在Java语言中禁止多重继承:一个类可以具有多个直接父类.多重继承不合法的原因是容易引发意义不明确.例如,有一个类C,如果允许它同时继承A类与B类(class C extends A,B{}),假如A.B两个类都有同一种方法fun(),如果定义: C c = new C(); 那么c.fun()应该调用哪一个父类的fun()方法?无法给出答案,因此Java语言禁止多重继承. 但C++却是可以的,所以C++比起java在语法上却难了些. 这一特性和上一特性结合使用,可以

Java中为什么可以用一个char(两个字节)表示一个中文字符

比如这断程序: char word = '字'; System.out.println("字".getBytes().length); // 输出为 3 其输出结果为3, 小伙伴们就要问了:“奇怪了,'字'这个字符,明明是三个字节,怎么可以用char类型的变量来表示? char类型不是在java中是两个字节么?” 其实,java中有外码和内码之分,顾名思义,外码就是JVM外部使用的编码,比如你在编辑器中输入的“字”,假设是UTF-8编码,UTF-8是变长编码,一个中文可能是1-3个字节