import java.util.Random;
public class NumberGenerator {
public NumberGenerator() {
}
//随机数工具方法
public static long getNumber(int length) {
StringBuilder buf = new StringBuilder();
Random random = new Random();
/*开头不为0,建议数据量较少时只放开部分,比如1至3开头的数,等业务达到一定数量时,再逐步放开剩余的号码段,由于是固定位数,总数量一定,生成的数越多,重复的几率越大**/
int firstNumber = random.nextInt(9) + 1;
buf.append(firstNumber);
for(int i = 0; i < length - 1; ++i) {
buf.append(random.nextInt(10));
}
return Long.valueOf(buf.toString());
}
}
mybatis-plus service:
@Override
@Transactional(propagation = Propagation.REQUIRES_NEW)//脱离业务事务,开启新事务
private String getNumber(int length, int numberType) {
String number = null;
ResourceNumber resourceNumber = new ResourceNumber();
//最多尝试10次
for (int time = 0; time < 10; time++) {
try {
long userNumberL = NumberGenerator.getNumber(length);
resourceNumber.setNumber(userNumberL);
resourceNumber.setNumberType(numberType);
if (this.insert(resourceNumber)) {//入库
number = String.valueOf(userNumberL);
break;
}
} catch (DuplicateKeyException e) {
log.warn("getUserNumber insert DuplicateKeyException ", e);
}
}
return number;
}
SQL 表结构:
DROP TABLE IF EXISTS `resource_number`;
CREATE TABLE `resource_number` (
`number` BIGINT NOT NULL COMMENT '编号',
`number_type` TINYINT NOT NULL COMMENT '编号类型 0xxx 1xxx 2xxx',
`create_date_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`last_update_date_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后修改时间',
PRIMARY KEY (`number`,`number_type`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='号码段表';