通过MyBaits拦截器设置全局generatorId

2 篇文章 0 订阅
1 篇文章 0 订阅

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

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值