业务场景
在微服务系统中,考虑到业务表的字段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