package com.dy.common.mybatis; import com.dy.common.po.BaseEntity; import com.dy.common.util.IDLongGenerator; import org.apache.ibatis.executor.Executor; import org.apache.ibatis.mapping.MappedStatement; import org.apache.ibatis.mapping.SqlCommandType; import org.apache.ibatis.plugin.*; import java.lang.reflect.Method; @Intercepts( { @Signature( type = Executor.class, method = "update", args = { MappedStatement.class, Object.class } ) } ) public class AutoGenerateIdInterceptor implements Interceptor { static int MAPPED_STATEMENT_INDEX = 0; static int PARAMETER_INDEX = 1; static String BASE_FIELD_SET_PRIMARY_KEY_FUNTION_SETID = "setId"; static String BASE_FIELD_SET_PRIMARY_KEY_FUNTION_SETUSERID = "setUserId"; static String BASE_FIELD_SET_PRIMARY_KEY_FUNTION_SETROLEID = "setRoleId"; /** * 拦截逻辑实现 * @param invocation 代理 * @return Object * @throws Throwable 异常 */ public Object intercept(Invocation invocation) throws Throwable { MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[MAPPED_STATEMENT_INDEX]; SqlCommandType commandType = mappedStatement.getSqlCommandType(); if (commandType.equals(SqlCommandType.INSERT)) { Object entity = invocation.getArgs()[PARAMETER_INDEX]; if (entity instanceof BaseEntity) { //Class entityClass = entity.getClass(); Class entityClass = entity.getClass(); Method setId = null ; Method setUserId = null ; Method setRoleId = null ; try{ /* // 添加用户时userId为自动生成主键。roleId存在时是为用户绑角色 String jsonString = JSONObject.toJSONString(entity, JSONWriter.Feature.WriteMapNullValue); JSONObject jsonObject = JSONObject.parseObject(jsonString); if(jsonObject.containsKey("userId") && !jsonObject.containsKey("roleId")) { setUserId = entityClass.getMethod(BASE_FIELD_SET_PRIMARY_KEY_FUNTION_SETUSERID, Long.class) ; setRoleId = entityClass.getMethod(BASE_FIELD_SET_PRIMARY_KEY_FUNTION_SETROLEID, Long.class) ; }else { //有一些实体没有id,例如中间表 setId = entityClass.getMethod(BASE_FIELD_SET_PRIMARY_KEY_FUNTION_SETID, Long.class) ; } */ //有一些实体没有id,例如中间表 setId = entityClass.getMethod(BASE_FIELD_SET_PRIMARY_KEY_FUNTION_SETID, Long.class) ; // BaUser实体中是setUserId, BaUserRole实体中包含setUserId,和setRoleId setUserId = entityClass.getMethod(BASE_FIELD_SET_PRIMARY_KEY_FUNTION_SETUSERID, Long.class) ; setRoleId = entityClass.getMethod(BASE_FIELD_SET_PRIMARY_KEY_FUNTION_SETROLEID, Long.class) ; }catch (Exception e){ //当entityClass没有setId方法时,会抛出异常 } if(setUserId != null && setRoleId == null){ setUserId.invoke(entity, new IDLongGenerator().generate()); }else if(setId != null){ setId.invoke(entity, new IDLongGenerator().generate()); } invocation.getArgs()[PARAMETER_INDEX] = entity; } } return invocation.proceed(); } public Object plugin(Object target) { return Plugin.wrap(target, this); } }