准考证号生成策略

准考证号生成策略

考生号生成规则:

例如:X0001、X0002、X0003、X0004这种有顺序的号

  • 方法一: 基于主键

如果生成的只有一个规则的号(一个前缀),可以单独的建一张表;利用主键递增来维持号的顺序;缺点:不灵活 真能有一种规则 适合简单的业务

  • 方法二:基于联合主键

如果生成的号有多个前缀,可以建一张表 有两个字段一个是前缀、一个递增的号 设成联合主键(不能插入两个一摸一样的值)

表结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

/*
Navicat MySQL Data Transfer

Source Server : localhost
Source Server Version : 50620
Source Host : localhost:3306
Source Database : hset-daoju

Target Server Type : MYSQL
Target Server Version : 50620
File Encoding : 65001

Date: 2018-03-12 09:47:34
*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for code_rule
-- ----------------------------
DROP TABLE IF EXISTS `code_rule`;
CREATE TABLE `code_rule` (
`type` varchar(255) NOT NULL,
`code` int(11) NOT NULL,
PRIMARY KEY (`type`,`code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

核心生成考生号业务:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
static Lock lock = new ReentrantLock();// 锁---这里加不加锁都一样

public String updateZkzh(String category) {
String code = category;
lock.lock();// 取得锁
try {
int count = 0;
try {
Map<String,Object> param = new HashMap<>();
param.put("type",category);
List<CodeRule> list = codeRuleMapper.selectByMap(param);
CodeRule codeRule = null;
if(list!=null&&list.size()>0){
codeRule = list.get(list.size()-1);
CodeRule codeRuleNew = new CodeRule();
codeRuleNew.setType(category);
codeRuleNew.setCode(codeRule.getCode()+1);//加一
codeRuleMapper.insert(codeRuleNew);
count = codeRuleNew.getCode();//count
}else{
//第一次
codeRule = new CodeRule();
codeRule.setType(category);
codeRule.setCode(1);
codeRuleMapper.insert(codeRule);
count = codeRule.getCode();//count
}
} catch (Exception e) {
updateZkzh(category);//失败了递归调用
}
if(sizeOfInt(count)==1){//count是1位数
code = code +"000"+count;
}else if(sizeOfInt(count)==2){//count是2位数
code = code +"00"+count;
}else if(sizeOfInt(count)==3){//count是3位数
code = code +"0"+count;
}else if(sizeOfInt(count)==4){//count是4位数
code = code +count;
}
return code;
}finally {
lock.unlock();
}
}

final static int[] sizeTable = { 9, 99, 999, 9999, 99999, 999999, 9999999,
99999999, 999999999, Integer.MAX_VALUE };

static int sizeOfInt(int x) {
for (int i = 0;; i++){
if (x <= sizeTable[i]){
return i + 1;
}
}
}
-------------已经触及底线 感谢您的阅读-------------

本文标题:准考证号生成策略

文章作者:趙小傑~~

发布时间:2018年01月18日 - 00:00:00

最后更新:2019年09月16日 - 19:34:10

原始链接:https://cnsyear.com/posts/286db112.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

0%