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