注:本文编写与 2019年12月17日, 内容可能存在时效性问题。
数据库使用MySQL5.7 集成于SpringBoot 2.0.X , 引用国产的开源工具类Hutool
本教程建议显示大纲视图 配合食用
一 、简介
1. 设定使用场景
任意 insert 、update 语句,都需要记录下语句的操作用户(CREATOR), 但由于系统早期设计不规范,大量SQL语句中,部分有写入CREATOR部分没有CREATOR,现在需要设计一段代码,能够自动拦截下所有的insert和update 语句,自动添加user 字段,及其字段值;
例如插入语句:
insert into table(id,name,age) values("efdefbb1970b486f8985fa19ab3ab22e","筱黄舒",12);
# 拦截后修改成
insert into table(id,name,age,createor) values("efdefbb1970b486f8985fa19ab3ab22e","筱黄舒",12,"admin");
2. 教程所用到的框架
此处列出 pom.xml 所依赖的一些包的版本,其中用到hutool这个工具类
<properties>
<java.version>1.8</java.version>
<hutool-all.version>4.5.1</hutool-all.version>
<spring-boot-start.version>2.0.7.RELEASE</spring-boot-start.version>
<druid-spring-boot-starter.version>1.1.10</druid-spring-boot-starter.version>
<mysql-connector-java.version>5.1.47</mysql-connector-java.version>
<spring-boot-start-mybatis.version>2.0.0</spring-boot-start-mybatis.version>
.......
</properties>
二、拦截器
2.1 创建拦截器
@Intercepts({
@Signature(
type = Executor.class, method = "update",
args = {
MappedStatement.class, Object.class})})
@Component
public class demo implements Interceptor {
private static final int PARAMETER_INDEX = 1;
private static final int MAPPED_STATEMENT_INDEX = NumConstant.COMMON_NUMBER_ZERO;
private static final String UPDATE_SQL_TYPE = "Update";
private static final String INSERT_SQL_TYPE = "Insert";
private Logger logger = LoggerFactory.getLogger(ModifyInterceptor.class);
private static LRUCache<String, Boolean> modifyCache = new LRUCache<>(Byte.MAX_VALUE);
private static LRUCache<String, Boolean> insertCache = new LRUCache<>(Byte.MAX_VALUE);
/**
* 拦截主要的逻辑
*/
@Override
public Object intercept(Invocation invocation) throws Throwable {
return null;
}
@Override
public Object plugin(Object o) {
return o instanceof Executor? Plugin.wrap(o, this):o;
}
@Override
public void setProperties(Properties properties)