使用拦截器和自定义id生成工具,完成insert语句id的自生成和赋值操作

本文介绍了在微服务系统中如何利用自定义拦截器AutoFillInterceptor和IDGenUtil工具类,为插入MySQL数据库的记录生成包含服务名称的唯一id。拦截器在MyBatis执行INSERT语句前自动填充id,工具类通过UUID的哈希码和时间戳生成随机数。请求实体类需继承特定父类,并在前端请求中添加业务名称以确保id的正确生成。
摘要由CSDN通过智能技术生成

业务场景

在微服务系统中,考虑到业务表的字段id要拼接本服务名称,就不能使用mysql自带的id生成规则,现使用自己封装的id生成规则和拦截器,在mybatis执行insert语句时自动赋值我们规则生成的id。

工具类详解

1. IDGenUtil业务流水号生成工具类
使用UUID的哈希码来作为后十位随机数,再拼接年月日时分秒和毫秒的时间戳,最后在首位继续拼接传来的业务名称前缀。

import java.text.SimpleDateFormat;
import java.util.*;

/**
 *  @description 用作表的自生成id
 *  @author wanxu
 */
public class IDGenUtil {
   

    public static String getGenId(String prefix){
   

        // 中间整数,标识日期
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
        String dayTime = sdf.format(new Date());
        //生成uuid的hashCode值
        long hashCode = UUID.randomUUID().toString().hashCode();
        //可能为负数
        if(hashCode < 0){
   
            hashCode = -hashCode;
        }
        // 算法处理: 0-代表前面补充0; 10-代表长度为10; d-代表参数为正数型
        String value =dayTime + String.format("%010d", hashCode);
        if (null!=prefix){
   
            return prefix+value;
        }
        return value;
    }
}
2. 自定义拦截器AutoFillInterceptor

自定义拦截器因为是在与数据库交互前进行拦截,所以要继承mybatis自带的拦截器并重写其中的拦截代码。
为了防止传来的参数为空,需要加一层非空校验,且如果没有传来对于的业务前缀,则使用prefix作为临时前缀。

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.SqlCommandType;
import org
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值