package cn.besteam.config.mybatis; import cn.besteam.common.util.oConvertUtils; import cn.besteam.modules.shiro.authc.util.EnvUtils; import cn.besteam.modules.system.entity.SysUser; import lombok.extern.slf4j.Slf4j; import org.apache.ibatis.binding.MapperMethod.ParamMap; 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.Date; import java.util.Properties; /** * mybatis拦截器,自动注入创建人、创建时间、修改人、修改时间 * * @author scott * @date 2019-01-19 */ @Slf4j @Component @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]; String sqlId = mappedStatement.getId(); // log.debug("------sqlId------" + sqlId); SqlCommandType sqlCommandType = mappedStatement.getSqlCommandType(); Object parameter = invocation.getArgs()[1]; // log.info("------sqlCommandType------" + sqlCommandType); if (parameter == null) { return invocation.proceed(); } if (SqlCommandType.INSERT == sqlCommandType) { Field[] fields = parameter.getClass().getDeclaredFields(); for (Field field : fields) { // log.debug("------field.name------" + field.getName()); try { if ("creator".equals(field.getName())) { field.setAccessible(true); Object local_createBy = field.get(parameter); field.setAccessible(false); if (local_createBy == null || local_createBy.equals("")) { String creator = null; // 获取登录用户信息 SysUser user = EnvUtils.getUser(); if (user != null) { // 登录账号 creator = user.getName(); } if (!oConvertUtils.isEmpty(creator)) { field.setAccessible(true); field.set(parameter, creator); field.setAccessible(false); } } } if ("createBy".equals(field.getName())) { field.setAccessible(true); Object local_createBy = field.get(parameter); field.setAccessible(false); if (local_createBy == null || local_createBy.equals("")) { Integer createBy = null; // 获取登录用户信息 SysUser user = EnvUtils.getUser(); if (user != null) { // 登录账号 createBy = user.getId(); } if (!oConvertUtils.isEmpty(createBy)) { field.setAccessible(true); field.set(parameter, createBy); field.setAccessible(false); } } } // 注入创建时间 if ("createTime".equals(field.getName())) { field.setAccessible(true); Object local_createDate = field.get(parameter); field.setAccessible(false); if (local_createDate == null || local_createDate.equals("")) { field.setAccessible(true); field.set(parameter, new Date()); field.setAccessible(false); } } } catch (Exception e) { } } } if (SqlCommandType.UPDATE == sqlCommandType) { Field[] fields = null; if (parameter instanceof ParamMap) { ParamMap p = (ParamMap) parameter; if (p.containsKey("et")) { parameter = p.get("et"); } else { parameter = p.get("param1"); } fields = parameter.getClass().getDeclaredFields(); } else { fields = parameter.getClass().getDeclaredFields(); } for (Field field : fields) { // log.debug("------field.name------" + field.getName()); try { if ("updateBy".equals(field.getName())) { field.setAccessible(true); Object local_updateBy = field.get(parameter); field.setAccessible(false); if (local_updateBy == null || local_updateBy.equals("")) { Integer updateBy = null; // 获取登录用户信息 SysUser user = EnvUtils.getUser(); if (user != null) { // 登录账号 updateBy = user.getId(); } if (!oConvertUtils.isEmpty(updateBy)) { field.setAccessible(true); field.set(parameter, updateBy); field.setAccessible(false); } } } if ("updateTime".equals(field.getName())) { field.setAccessible(true); Object local_updateDate = field.get(parameter); field.setAccessible(false); if (local_updateDate == null || local_updateDate.equals("")) { field.setAccessible(true); field.set(parameter, new Date()); field.setAccessible(false); } } } catch (Exception e) { } } } return invocation.proceed(); } @Override public Object plugin(Object target) { return Plugin.wrap(target, this); } @Override public void setProperties(Properties properties) { // } }