通过MyBaits拦截器设置全局generatorId

因为最近在研究分布式项目,所以学习到了几个知识点

1、雪花算法

2、sharding jdbc

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 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();
	}
}

 

你可能感兴趣的:(SPRING,框架,JAVA基础)