因为最近在研究分布式项目,所以学习到了几个知识点
1、雪花算法
3、分布式ID生成
正常来说ID生成是很简单的,但是因为本人比较懒,喜欢统一处理问题,所以,决定通过mybaits插件的形式进行全局生成
/**
* 自动添加ID
*
* @author 戚辰先生
*
*/
@Intercepts({ @Signature(type = Executor.class, method = "update", args = { MappedStatement.class, Object.class }) })
@Component
public class AutoGeneratePrimaryKeyMyBatisPluginInterceptor implements Interceptor {
static int MAPPED_STATEMENT_INDEX = 0;
static int PARAMETER_INDEX = 1;
static int ROWBOUNDS_INDEX = 2;
static int RESULT_HANDLER_INDEX = 3;
static String BASE_FIELD_SET_PRIMARY_KEY_FUNTION_NAME = "setPrimaryKey";
static String BASE_FIELD_SET_CREATE_TIME_FUNTION_NAME = "setCreateTime";
static String BASE_FIELD_SET_UPDATE_TIME_FUNTION_NAME = "setCreateTime";
static String BASE_FIELD_SET_DELETE_FUNTION_NAME = "setDelete";
@Autowired
private IdGenerator generator;
public AutoGeneratePrimaryKeyMyBatisPluginInterceptor() {
System.out.println("auto generate primaryKey mybatis plugin start!!!");
}
@SuppressWarnings("static-access")
public Object intercept(Invocation invocation) throws Throwable {
System.out.println(generator);
MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[MAPPED_STATEMENT_INDEX];
SqlCommandType commandType = mappedStatement.getSqlCommandType();
if (commandType.INSERT.equals(SqlCommandType.INSERT)) {
Object params = invocation.getArgs()[PARAMETER_INDEX];
if (params instanceof BaseEntity) {
Class<? extends Object> class1 = params.getClass();
for (Method method : class1.getMethods()) {
if (BASE_FIELD_SET_PRIMARY_KEY_FUNTION_NAME.equals(method.getName())) {
method.invoke(params, String.valueOf(generator.generateId()));
}
}
invocation.getArgs()[PARAMETER_INDEX] = params;
}
}
return invocation.proceed();
}
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}
@Bean
public IdGenerator generatorId() {
return new CommonSelfIdGenerator();
}
}