生成规则: 日期+每日自增ID 例20220214001 20220214002
直接上方法:
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.chunxiao.xd.dao.OrderRepair;
import com.chunxiao.xd.mapper.OrderRepairMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
import java.util.concurrent.atomic.AtomicInteger;
/**
* 生成自增ID
* @data 2022/2/14 0014 -下午 3:12
*/
@Slf4j
@Component
public class SnowflakeIdWorker implements CommandLineRunner{
//静态变量存储最大值
public static final AtomicInteger atomicNum = new AtomicInteger();
//初始化分组编号
public final int INIT_GROUP_NUM = 0;
//获取一个日期
public static String day = DateUtil.getData("yyyy-MM-dd");
@Autowired
private OrderRepairMapper orderRepairMapper;
/**
* @Author javaloveiphone
* @Description :初始化设置分组编号最大值
* @throws Exception
* void
*/
@Override
public void run(String... args) throws Exception {
try{
//获取今天的数据数量
String data = DateUtil.getData("yyyy-MM-dd");
int maxGroupNum = orderRepairMapper.selectCount(new QueryWrapper<OrderRepair>()
.ge("create_time", data+ " 00:00:00")
.le("create_time", data + " 23:59:59"));
if(maxGroupNum<INIT_GROUP_NUM){
maxGroupNum = INIT_GROUP_NUM;
}
day = data;
log.error("初始化分组编号最大值为:"+maxGroupNum+" 日期为:"+day);
atomicNum.set(maxGroupNum);
}catch(Exception e){
log.error("初始化获取分组编号最大值异常",e);
}
}
/**
* @Author javaloveiphone
* @Description :获取最新分组编号
* @return
* int
* 注:此方法并没有使用synchronized进行同步,因为共享的编号自增操作是原子操作,线程安全的
*/
public static String getNewAutoNum(String str){
//判断是否是当前日期
String data = DateUtil.getData("yyyy-MM-dd");
if(!StringUtils.equals(day,data)){
day = data;
atomicNum.set(0);
}
//线程安全的原子操作,所以此方法无需同步
int newNum = atomicNum.incrementAndGet();
//数字长度为5位,长度不够数字前面补0
String newStrNum = str+DateUtil.getData("yyyyMMdd")+String.format("%03d", newNum);
return newStrNum;
}
}
直接调用getNewAutoNum() 方法
原理:每次项目启动时,自动从数据库获取一个最大的ID 值,每次调用会+1,
弊端:没有类似于mysql 的事务回滚