| 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; | 
| import java.util.List; | 
| import java.util.Map; | 
|   | 
| @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"; | 
|   | 
|     /** | 
|      * 拦截逻辑实现 | 
|      * @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(); | 
|                  Method setIdMt = null ; | 
|                 try{ | 
|                     setIdMt = entityClass.getMethod(BASE_FIELD_SET_PRIMARY_KEY_FUNTION_NAME, Long.class) ; | 
|                 }catch (Exception e){ | 
|                     //当entityClass没有setId方法时,会抛出异常 | 
|                 } | 
|                 if(setIdMt != null){ | 
|                     setIdMt.invoke(entity, new IDLongGenerator().generate()); | 
|                 } | 
|   | 
|                 invocation.getArgs()[PARAMETER_INDEX] = entity; | 
|             }else if(entity instanceof Map){ | 
|                 try { | 
|                     ((List)((Map<?, ?>) entity).get("list")).forEach(e -> { | 
|                         if (e instanceof BaseEntity) { | 
|                             Class<?> entityClass = e.getClass(); | 
|                             Method setIdMt = null ; | 
|                             try{ | 
|                                 setIdMt = entityClass.getMethod(BASE_FIELD_SET_PRIMARY_KEY_FUNTION_NAME, Long.class) ; | 
|                                 if(setIdMt != null){ | 
|                                     setIdMt.invoke(e, new IDLongGenerator().generate()); | 
|                                 } | 
|                             }catch (Exception e1){ | 
|                                 //当entityClass没有setId方法时,会抛出异常 | 
|                             } | 
|                         } | 
|                     }); | 
|                 }catch (Exception e){ | 
|   | 
|                 } | 
|             } | 
|         } | 
|         return invocation.proceed(); | 
|     } | 
|   | 
|     public Object plugin(Object target) { | 
|         return Plugin.wrap(target, this); | 
|     } | 
|   | 
| } |