|
@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.toolkit.StringUtils;
|
|
|
import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor;
|
|
|
import net.sf.jsqlparser.JSQLParserException;
|
|
|
import net.sf.jsqlparser.expression.Expression;
|
|
|
+import net.sf.jsqlparser.expression.LongValue;
|
|
|
import net.sf.jsqlparser.expression.StringValue;
|
|
|
import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
|
|
|
import net.sf.jsqlparser.expression.operators.relational.EqualsTo;
|
|
@@ -17,6 +18,7 @@ import net.sf.jsqlparser.statement.select.SelectBody;
|
|
|
import org.apache.ibatis.executor.Executor;
|
|
|
import org.apache.ibatis.mapping.BoundSql;
|
|
|
import org.apache.ibatis.mapping.MappedStatement;
|
|
|
+import org.apache.ibatis.mapping.SqlCommandType;
|
|
|
import org.apache.ibatis.session.ResultHandler;
|
|
|
import org.apache.ibatis.session.RowBounds;
|
|
|
import org.slf4j.Logger;
|
|
@@ -25,6 +27,7 @@ import org.springframework.web.context.request.RequestContextHolder;
|
|
|
import org.springframework.web.context.request.ServletRequestAttributes;
|
|
|
|
|
|
import javax.servlet.http.HttpServletRequest;
|
|
|
+import java.lang.reflect.Field;
|
|
|
import java.sql.SQLException;
|
|
|
|
|
|
/**
|
|
@@ -33,6 +36,32 @@ import java.sql.SQLException;
|
|
|
*/
|
|
|
public class ProjectInterceptor implements InnerInterceptor {
|
|
|
Logger logger = LoggerFactory.getLogger(ProjectInterceptor.class);
|
|
|
+ private String convertDeleteToUpdate(String originalSql) {
|
|
|
+ // 示例:将DELETE FROM table WHERE ... 转为 UPDATE table SET deleted=1 WHERE ...
|
|
|
+ return originalSql.replaceFirst("DELETE FROM", "UPDATE") + " SET delete_flag=1";
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void beforeUpdate(Executor executor, MappedStatement ms, Object parameter) throws SQLException {
|
|
|
+ BoundSql boundSql = ms.getBoundSql(parameter);
|
|
|
+ if (ms.getSqlCommandType().equals(SqlCommandType.DELETE)) {
|
|
|
+ // 转换DELETE为UPDATE,此处需复杂处理,示例简化
|
|
|
+ // 实际需解析原始SQL并替换,此处仅为思路
|
|
|
+ String newSql = convertDeleteToUpdate(boundSql.getSql());
|
|
|
+ // 反射修改BoundSql中的SQL
|
|
|
+ Class<? extends BoundSql> aClass = boundSql.getClass();
|
|
|
+ Field declaredField = null;
|
|
|
+ try {
|
|
|
+ declaredField = aClass.getDeclaredField("sql");
|
|
|
+ declaredField.setAccessible(true);
|
|
|
+ declaredField.set(boundSql,newSql);
|
|
|
+ } catch (Exception e) {
|
|
|
+ throw new RuntimeException(e);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
@Override
|
|
|
public void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException {
|
|
|
HttpServletRequest request = ((ServletRequestAttributes) (RequestContextHolder.currentRequestAttributes())).getRequest();
|
|
@@ -43,12 +72,6 @@ public class ProjectInterceptor implements InnerInterceptor {
|
|
|
return;
|
|
|
}
|
|
|
logger.debug("origin sql: " + originSql);
|
|
|
-// Map parameterMap = (Map) parameter;
|
|
|
-// // QueryWrapper,实际上就是 在 代码查询的地方创建的QueryWrapper。
|
|
|
-// Object obj = parameterMap.get("ew");
|
|
|
-// QueryWrapper queryWrapper = (QueryWrapper) obj;
|
|
|
-// queryWrapper.eq("project", project);
|
|
|
-// queryWrapper.eq("delete_flag",0);
|
|
|
//获取 Statement 执行sql的对象
|
|
|
Statement statement = null;
|
|
|
try {
|
|
@@ -71,7 +94,7 @@ public class ProjectInterceptor implements InnerInterceptor {
|
|
|
projectEq.setRightExpression(new StringValue(project));
|
|
|
EqualsTo deleteFlag = new EqualsTo();
|
|
|
deleteFlag.setLeftExpression(new Column("delete_flag"));
|
|
|
- deleteFlag.setRightExpression(new StringValue("0"));
|
|
|
+ deleteFlag.setRightExpression(new LongValue(0));
|
|
|
String plainSelectString = plainSelect.toString();
|
|
|
if (!plainSelectString.contains("project = ") && !plainSelectString.contains("delete_flag = ")) {
|
|
|
AndExpression targetExpression = new AndExpression(projectEq, deleteFlag);
|