|  |  | 
 |  |  | 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.Interceptor; | 
 |  |  | import org.apache.ibatis.plugin.Intercepts; | 
 |  |  | import org.apache.ibatis.plugin.Invocation; | 
 |  |  | import org.apache.ibatis.plugin.Plugin; | 
 |  |  | import org.apache.ibatis.plugin.Signature; | 
 |  |  | import org.apache.ibatis.plugin.*; | 
 |  |  |  | 
 |  |  | import java.lang.reflect.Method; | 
 |  |  |  | 
 |  |  | 
 |  |  |     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"; | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 拦截逻辑实现 | 
 |  |  | 
 |  |  |                 Class<?> entityClass = entity.getClass(); | 
 |  |  |                 Method setMt = null ; | 
 |  |  |                 try{ | 
 |  |  |                     //有一些实体没有id,例如中间表 | 
 |  |  |                     setMt = entityClass.getMethod(BASE_FIELD_SET_PRIMARY_KEY_FUNTION_NAME, Long.class) ; | 
 |  |  |                     // 添加用户时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方法时,会抛出异常 | 
 |  |  |                 } |