java怎样自动生成流水号

Python09

java怎样自动生成流水号,第1张

方法一:

   不用数据库的话弄个 static个变量,自己设置个synchronized

   示例:

import java.text.DecimalFormat

import java.text.SimpleDateFormat

import java.util.Date

public class PrimaryGenerater {

    private static final String SERIAL_NUMBER = "XXXX" // 流水号格式

    private static PrimaryGenerater primaryGenerater = null

    private PrimaryGenerater() {

    }

    /**

     * 取得PrimaryGenerater的单例实现

     *

     * @return

     */

    public static PrimaryGenerater getInstance() {

        if (primaryGenerater == null) {

            synchronized (PrimaryGenerater.class) {

                if (primaryGenerater == null) {

                    primaryGenerater = new PrimaryGenerater()

                }

            }

        }

        return primaryGenerater

    }

    /**

     * 生成下一个编号

     */

    public synchronized String generaterNextNumber(String sno) {

        String id = null

        Date date = new Date()

        SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd")

        if (sno == null) {

            id = formatter.format(date) + "0001"

        } else {

            int count = SERIAL_NUMBER.length()

            StringBuilder sb = new StringBuilder()

            for (int i = 0 i < count i++) {

                sb.append("0")

            }

            DecimalFormat df = new DecimalFormat("0000")

            id = formatter.format(date)

                    + df.format(1 + Integer.parseInt(sno.substring(8, 12)))

        }

        return id

    }

}

方法二:

 可以在数据库新建序列,再新建一个存储过程控制序列,返回序列值,比如sqlserver用identity,oracle用序列,存储过程可以加锁,当达到999999的时候重置序列,通过代码调用存储过程获得返回值。

2、全局变量。通过方法获取下一个值,方法同步。

public static String getOrderNo(){

long No = 0

SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd")

String nowdate = sdf.format(new Date())

No = Long.parseLong(nowdate)*1000//这里如果一天订单多的话可以用一万或更大

No+=getNo()

return getUserId+No

}

public static int getNo(){//返回当天的订单数+1

return 001

}

public static String getUserId(){

return "123"

}

用System.out.print(getOrderNo())测试得到:12320060307001 一般订单号用这样还不错吧。呵呵

java项目实现流水号自动增长

项目中有一个规则编号字段,从1开始,编号长度为5位,那么第一条数据编号就是00001。

实现的基本思路就是项目启动时,从数据库获取当前最大值,作为静态变量存储;

业务获取新的编码,考虑并发问题,获取编码方法(编码自增部分)为synchronized同步方法,如果自增为原子操作,则无需同步;

编码前置0,使用String.format("%05d", newNum)格式化获取。

实现代码如下:

private final static AtomicInteger atomic = new AtomicInteger(0)

public static String startFormat(String format) {

return String.format(format, atomic.incrementAndGet())

}