java根据年月日序号生成主键

第一步:实现思路。

1、首先获取年月日将日期格式化为自己需要的格式。

2、按4到6位的序号+当前年月日存储到数据库或者文件中(理论上文件的读取效率更高,在操作比较频繁的情况下使用文件更合适)

3、每次读取时判断日期是否相同如果不同更新日期,并将序号重置。(保证每个年月日的单号都是从初始化的“00001”这样开始)

第二步:文件的读写工具类FileUtil

1、实现存储文件生成文件的方法rewrite

2、实现读取dat文件的方法readList

3、具体代码如下:

 

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.File;

import java.io.FileReader;

import java.io.FileWriter;

import java.io.IOException;

import java.util.ArrayList;

import java.util.List;

 

public class FileUtil {

 

public static void rewrite(File file, String data) {

BufferedWriter bw = null;

try {

bw = new BufferedWriter(new FileWriter(file));

bw.write(data);

} catch (IOException e) {

e.printStackTrace();

} finally {

if (bw != null) {

try {

bw.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

 

public static List<String> readList(File file) {

BufferedReader br = null;

List<String> data = new ArrayList<String>();

try {

br = new BufferedReader(new FileReader(file));

String str = null;

while ((str = br.readLine()) != null) {

data.add(str);

}

} catch (IOException e) {

e.printStackTrace();

} finally {

if (br != null) {

try {

br.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

return data;

}

 

}

第三步:生成存储订单号。

1、主抽象类SerialNumber

public abstract class SerialNumber {

public synchronized String getSerialNumber() {

return process();

}

 

protected abstract String process();

}

2、抽象继承类EveryDaySerialNumber 

import java.text.DecimalFormat;

import java.text.SimpleDateFormat;

import java.util.Date;

 

public abstract class EveryDaySerialNumber extends SerialNumber {

 

protected final static SimpleDateFormat sdf = new SimpleDateFormat(

"yyyyMMdd");

protected DecimalFormat df = null;

 

public EveryDaySerialNumber(int width) {

if (width < 1) {

throw new IllegalArgumentException(

"Parameter length must be great than 1!");

}

char[] chs = new char[width];

for (int i = 0; i < width; i++) {

chs[i] = '0';

}

df = new DecimalFormat(new String(chs));

}

 

protected String process() {

Date date = new Date();

int n = getOrUpdateNumber(date, 1);

return format(date) + format(n);

}

 

protected String format(Date date) {

return sdf.format(date);

}

 

protected String format(int num) {

return df.format(num);

}

 

/**

* 获得序列号,同时更新持久化存储中的序列

* @param current

*            当前的日期

* @param start

*            初始化的序号

* @return 所获得新的序列号

*/

protected abstract int getOrUpdateNumber(Date current, int start);

}

第四步:逻辑功能类FileEveryDaySerialNumber

import java.io.File;

import java.util.Date;

import java.util.List;

 

import order.EveryDaySerialNumber;

 

public class FileEveryDaySerialNumber extends EveryDaySerialNumber {

 

/**

* 持久化存储的文件

*/

private File file = null;

 

/**

* 存储的分隔符

*/

private final static String FIELD_SEPARATOR = ",";

 

public FileEveryDaySerialNumber(int width, String filename) {

super(width);

file = new File(filename);

}

 

@Override

protected int getOrUpdateNumber(Date current, int start) {

String date = format(current);

int num = start;

if (file.exists()) {

List<String> list = FileUtil.readList(file);

String[] data = list.get(0).split(FIELD_SEPARATOR);

if (date.equals(data[0])) {

num = Integer.parseInt(data[1]);

}

}

FileUtil.rewrite(file, date + FIELD_SEPARATOR + (num + 1));

return num;

}

 

}

 

第五步:编写功能测试代码。

import java.util.concurrent.TimeUnit;

/**

 * JAVA版本的自动生成有规则的订单号(或编号) 生成的格式是: 200908010001 前面几位为当前的日期,后面五位为系统自增长类型的编号 原理:

 * 1.获取当前日期格式化值; 2.读取文件,上次编号的值+1最为当前此次编号的值 (新的一天会重新从1开始编号)

 */

public class TestOrderNo {

 

public static void main(String[] args) throws InterruptedException {

SerialNumber serial = new FileEveryDaySerialNumber(5,

"SerialOrder.dat");

while (true) {

System.out.println(serial.getSerialNumber());

TimeUnit.SECONDS.sleep(2);

}

}

}

 

百度经验:https://jingyan.baidu.com/article/0320e2c1679ce41b87507bf7.html

posted @ 2021-08-28 22:28  银河系的极光  阅读(640)  评论(0编辑  收藏  举报