package com.dy.common.mybatis; 
 | 
  
 | 
  
 | 
import com.alibaba.fastjson2.JSONObject; 
 | 
import com.alibaba.fastjson2.JSONWriter; 
 | 
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_NAME = "setId"; 
 | 
    static String BASE_FIELD_SET_PRIMARY_KEY_FUNTION_NAME2 = "setUserId"; 
 | 
  
 | 
    /** 
 | 
     * 拦截逻辑实现 
 | 
     * @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<? extends Object> entityClass = entity.getClass(); 
 | 
                Class<?> entityClass = entity.getClass(); 
 | 
                Method setMt = null ; 
 | 
                try{ 
 | 
                    // 添加用户时userId为自动生成主键。roleId存在时是为用户绑角色 
 | 
                    String jsonString = JSONObject.toJSONString(entity, JSONWriter.Feature.WriteMapNullValue); 
 | 
                    JSONObject jsonObject = JSONObject.parseObject(jsonString); 
 | 
                    if(jsonObject.containsKey("userId") && !jsonObject.containsKey("roleId")) { 
 | 
                        setMt = entityClass.getMethod(BASE_FIELD_SET_PRIMARY_KEY_FUNTION_NAME2, Long.class) ; 
 | 
                    }else { 
 | 
                        //有一些实体没有id,例如中间表 
 | 
                        setMt = entityClass.getMethod(BASE_FIELD_SET_PRIMARY_KEY_FUNTION_NAME, Long.class) ; 
 | 
                    } 
 | 
                }catch (Exception e){ 
 | 
                    //当entityClass没有setId方法时,会抛出异常 
 | 
                } 
 | 
                if(setMt != null){ 
 | 
                    setMt.invoke(entity, new IDLongGenerator().generate()); 
 | 
                } 
 | 
  
 | 
                invocation.getArgs()[PARAMETER_INDEX] = entity; 
 | 
            } 
 | 
        } 
 | 
        return invocation.proceed(); 
 | 
    } 
 | 
  
 | 
    public Object plugin(Object target) { 
 | 
        return Plugin.wrap(target, this); 
 | 
    } 
 | 
  
 | 
} 
 |