生成流水号

生成规则: 日期+每日自增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 的事务回滚

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小可乐-我一直在

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值