拦截:https://blog.csdn.net/CaptHua/article/details/126417608
@Component
@Order(1)
@Intercepts({@Signature(type = StatementHandler.class, method = "update", args = {Statement.class}),})
public class SqlValidateMybatisInterceptor extends PRSMybatisInterceptor {
@Override
protected Object before(Invocation invocation) throws Throwable {
String sql="";
Statement statement=(Statement) invocation.getArgs()[0];
if(Proxy.isProxyClass(statement.getClass())){
MetaObject metaObject= SystemMetaObject.forObject(statement);
Object h=metaObject.getValue("h");
if(h instanceof StatementLogger){
RoutingStatementHandler rsh=(RoutingStatementHandler) invocation.getTarget();
sql=rsh.getBoundSql().getSql();
}else {
PreparedStatementLogger psl=(PreparedStatementLogger) h;
sql=psl.getPreparedStatement().toString();
}
}else{
sql=statement.toString();
}
if(containsDelete(sql)&&!containsWhere(sql)){
throw new SQLException("不能删除整张表,sql:"+sql);
}
return null;
}
private boolean containsDelete(String sql){
return sql.contains("delete")||sql.contains("DELETE");
}
private boolean containsWhere(String sql){
return sql.contains("where")||sql.contains("WHERE");
}
}
public class PRSMybatisInterceptor implements Interceptor {
Boolean needBreak=false;
@Override
public Object intercept(Invocation invocation) throws Throwable {
Object result= before(invocation);
if(needBreak){
return result;
}
result= invocation.proceed();
result=after(result,invocation);
return result;
}
protected Object before(Invocation invocation) throws Throwable{
return null;
}
protected Object after(Object result,Invocation invocation) throws Throwable{
return result;
}
@Override
public Object plugin(Object o) {
return Plugin.wrap(o, this);
}
@Override
public void setProperties(Properties properties) {
}
}
private SqlSession openSessionFromConnection(ExecutorType execType, Connection connection) {
...
final Executor executor = configuration.newExecutor(tx, execType);
return new DefaultSqlSession(configuration, executor, autoCommit);
}
public Executor newExecutor(Transaction transaction, ExecutorType executorType) {
executorType = executorType == null ? defaultExecutorType : executorType;
executorType = executorType == null ? ExecutorType.SIMPLE : executorType;
Executor executor;
if (ExecutorType.BATCH == executorType) {
executor = new BatchExecutor(this, transaction);
} else if (ExecutorType.REUSE == executorType) {
executor = new ReuseExecutor(this, transaction);
} else {
executor = new SimpleExecutor(this, transaction);
}
if (cacheEnabled) {
executor = new CachingExecutor(executor);
}
executor = (Executor) interceptorChain.pluginAll(executor);
return executor;
}
StatementHandler handler = configuration.newStatementHandler(wrapper, ms, parameterObject, rowBounds, resultHandler, boundSql);
public StatementHandler newStatementHandler(Executor executor, MappedStatement mappedStatement, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) {
StatementHandler statementHandler = new RoutingStatementHandler(executor, mappedStatement, parameterObject, rowBounds, resultHandler, boundSql);
statementHandler = (StatementHandler) interceptorChain.pluginAll(statementHandler);
return statementHandler;
}
this.parameterHandler = configuration.newParameterHandler(mappedStatement, parameterObject, boundSql);
public ParameterHandler newParameterHandler(MappedStatement mappedStatement, Object parameterObject, BoundSql boundSql) {
ParameterHandler parameterHandler = mappedStatement.getLang().createParameterHandler(mappedStatement, parameterObject, boundSql);
parameterHandler = (ParameterHandler) interceptorChain.pluginAll(parameterHandler);
return parameterHandler;
}
this.resultSetHandler = configuration.newResultSetHandler(executor, mappedStatement, rowBounds, parameterHandler, resultHandler, boundSql);
public ResultSetHandler newResultSetHandler(Executor executor, MappedStatement mappedStatement, RowBounds rowBounds, ParameterHandler parameterHandler,
ResultHandler resultHandler, BoundSql boundSql) {
ResultSetHandler resultSetHandler = new DefaultResultSetHandler(executor, mappedStatement, parameterHandler, resultHandler, boundSql, rowBounds);
resultSetHandler = (ResultSetHandler) interceptorChain.pluginAll(resultSetHandler);
return resultSetHandler;
}
Interceptor
@Override
public Object plugin(Object o) {
return Plugin.wrap(o, this);
}
public class PRSMybatisInterceptor implements Interceptor {
Boolean needBreak = false;
@Override
public Object intercept(Invocation invocation) throws Throwable {
Object result = before(invocation);
if (needBreak) {
return result;
}
result = invocation.proceed();
result = after(result, invocation);
return result;
}
protected Object before(Invocation invocation) throws Throwable {
return null;
}
protected Object after(Object result, Invocation invocation) throws Throwable {
return result;
}
@Override
public Object plugin(Object o) {
return Plugin.wrap(o, this);
}
@Override
public void setProperties(Properties properties) {
}
}
/**
* @author CaptHua
*/
@Component
@Order(1)
@Intercepts({@Signature(type = StatementHandler.class, method = "update", args = {Statement.class}),})
public class SqlValidateMybatisInterceptor extends PRSMybatisInterceptor {
@Override
protected Object before(Invocation invocation) throws Throwable {
String sql = "";
Statement statement = (Statement) invocation.getArgs()[0];
if (Proxy.isProxyClass(statement.getClass())) {
MetaObject metaObject = SystemMetaObject.forObject(statement);
Object h = metaObject.getValue("h");
if (h instanceof StatementLogger) {
RoutingStatementHandler rsh = (RoutingStatementHandler) invocation.getTarget();
sql = rsh.getBoundSql().getSql();
} else {
PreparedStatementLogger psl = (PreparedStatementLogger) h;
sql = psl.getPreparedStatement().toString();
}
} else {
sql = statement.toString();
}
if (containsDelete(sql) && !containsWhere(sql)) {
throw new SQLException("不能删除整张表,sql:" + sql);
}
return null;
}
private boolean containsDelete(String sql) {
return sql.contains("delete") || sql.contains("DELETE");
}
private boolean containsWhere(String sql) {
return sql.contains("where") || sql.contains("WHERE");
}
}