案例1
package com.byd.hr.annotation.aspect;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.SqlCommandType;
import org.apache.ibatis.plugin.*;
import org.springframework.stereotype.Component;
import java.lang.reflect.Field;
import java.util.*;
@Component
@Slf4j
@Intercepts({@Signature(type = Executor.class, method = "update", args = {
MappedStatement.class,
Object.class
})})
public class MybatisInterceptor implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
SqlCommandType sqlCommandType = mappedStatement.getSqlCommandType();
Object parameter = invocation.getArgs()[1];
if (parameter == null) {
return invocation.proceed();
}
String loginId = "lvcl-test";
if (StringUtils.isBlank(loginId)) {
return invocation.proceed();
}
if (SqlCommandType.INSERT == sqlCommandType || SqlCommandType.UPDATE == sqlCommandType) {
replaceEntityProperty(parameter, loginId, sqlCommandType);
}
return invocation.proceed();
}
private void replaceEntityProperty(Object parameter, String loginId, SqlCommandType sqlCommandType) {
if (parameter instanceof Map) {
replaceMap((Map) parameter, loginId, sqlCommandType);
} else {
replace(parameter, loginId, sqlCommandType);
}
}
private void replaceMap(Map parameter, String loginId, SqlCommandType sqlCommandType) {
Collection values = parameter.values();
for (Object value : values) {
replace(value, loginId, sqlCommandType);
}
}
private void replace(Object parameter, String loginId, SqlCommandType sqlCommandType) {
if (SqlCommandType.INSERT == sqlCommandType) {
dealInsert(parameter, loginId);
} else {
dealUpdate(parameter, loginId);
}
}
private void dealUpdate(Object parameter, String loginId) {
Field[] allFields = getAllFields(parameter);
for (Field field : allFields) {
try {
field.setAccessible(true);
Object o = field.get(parameter);
if (Objects.nonNull(o)) {
field.setAccessible(false);
continue;
}
if ("modifier".equals(field.getName())) {
field.set(parameter, loginId);
field.setAccessible(false);
} else if ("modifiedTime".equals(field.getName())) {
field.set(parameter, new Date());
field.setAccessible(false);
} else {
field.setAccessible(false);
}
} catch (Exception e) {
log.error("dealInsert.error:{}", e.getMessage(), e);
}
}
}
private void dealInsert(Object parameter, String loginId) {
Field[] allFields = getAllFields(parameter);
for (Field field : allFields) {
try {
field.setAccessible(true);
Object o = field.get(parameter);
if (Objects.nonNull(o)) {
field.setAccessible(false);
continue;
}
if ("isDeleted".equals(field.getName())) {
field.set(parameter, 0);
field.setAccessible(false);
} else if ("creator".equals(field.getName())) {
field.set(parameter, loginId);
field.setAccessible(false);
} else if ("createTime".equals(field.getName())) {
field.set(parameter, new Date());
field.setAccessible(false);
} else {
field.setAccessible(false);
}
} catch (Exception e) {
log.error("dealInsert.error:{}", e.getMessage(), e);
}
}
}
private Field[] getAllFields(Object object) {
Class<?> clazz = object.getClass();
List<Field> fieldList = new ArrayList<>();
while (clazz != null) {
fieldList.addAll(new ArrayList<>(Arrays.asList(clazz.getDeclaredFields())));
clazz = clazz.getSuperclass();
}
Field[] fields = new Field[fieldList.size()];
fieldList.toArray(fields);
return fields;
}
@Override
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}
@Override
public void setProperties(Properties properties) {
}
}
案例2
package com.alibaba.hr.annotation.aspect;
import com.byd.hr.annotation.CreateTime;
import com.byd.hr.annotation.CreatorId;
import com.byd.hr.annotation.ModifiedTime;
import com.byd.hr.annotation.ModifierId;
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.Signature;
import org.springframework.stereotype.Component;
import java.lang.reflect.Field;
import java.util.Date;
import java.util.Objects;
import java.util.Properties;
import java.util.concurrent.atomic.AtomicReference;
@Component
@Intercepts({@Signature(type = Executor.class, method = "update",
args = {MappedStatement.class, Object.class})})
public class AutoInsertTimeAndUser implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
System.out.println("自动设置基本内容");
System.out.println("自动设置基本内容");
System.out.println("自动设置基本内容");
MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
SqlCommandType sqlCommandType = mappedStatement.getSqlCommandType();
Object parameter = invocation.getArgs()[1];
Field[] declaredFields = parameter.getClass().getDeclaredFields();
for (Field field : declaredFields) {
if (Objects.nonNull(field.getAnnotation(CreateTime.class))) {
if (SqlCommandType.INSERT.equals(sqlCommandType)) {
field.setAccessible(true);
field.set(parameter, new Date());
}
}
if (Objects.nonNull(field.getAnnotation(CreatorId.class))) {
if (SqlCommandType.INSERT.equals(sqlCommandType)) {
field.setAccessible(true);
field.set(parameter, "lvcl测试");
}
}
if (Objects.nonNull(field.getAnnotation(ModifiedTime.class))) {
if (SqlCommandType.UPDATE.equals(sqlCommandType) || SqlCommandType.INSERT.equals(sqlCommandType)) {
field.setAccessible(true);
field.set(parameter, new Date());
}
}
if (Objects.nonNull(field.getAnnotation(ModifierId.class))) {
if (SqlCommandType.UPDATE.equals(sqlCommandType) || SqlCommandType.INSERT.equals(sqlCommandType)) {
field.setAccessible(true);
field.set(parameter, "lvcl测试");
}
}
}
Object[] args = invocation.getArgs();
invocation.getMethod();
invocation.getTarget();
return invocation.proceed();
}
@Override
public Object plugin(Object target) {
return Interceptor.super.plugin(target);
}
@Override
public void setProperties(Properties properties) {
Interceptor.super.setProperties(properties);
}
}
案例3
package com.alibaba.hr.annotation.aspect;
import com.byd.hr.annotation.CreatorId;
import com.byd.hr.annotation.CreateTime;
import com.byd.hr.annotation.ModifierId;
import com.byd.hr.annotation.ModifiedTime;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
import java.lang.reflect.Field;
import java.util.Date;
@Aspect
@Component
public class SqlAspect {
@Before("execution(* com.byd.hr.entity.*(..))")
public void beforeSaveOrUpdate(Object entity) throws IllegalAccessException {
System.out.println("注解生效");
System.out.println("注解生效");
System.out.println("注解生效");
System.out.println("注解生效");
if (entity != null) {
Class<?> clazz = entity.getClass();
while (clazz != null) {
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
if (field.isAnnotationPresent(CreatorId.class)) {
field.set(entity, "login_user_id");
} else if (field.isAnnotationPresent(CreateTime.class)) {
field.set(entity, new Date());
} else if (field.isAnnotationPresent(ModifierId.class)) {
field.set(entity, "login_user_id");
} else if (field.isAnnotationPresent(ModifiedTime.class)) {
field.set(entity, new Date());
}
}
clazz = clazz.getSuperclass();
}
}
}
}```