| | |
| | | package com.zy.asrs.wms.common.interceptor; |
| | | |
| | | import com.zy.asrs.framework.common.SpringUtils; |
| | | import com.zy.asrs.wms.common.constant.RedisConstants; |
| | | import com.zy.asrs.wms.utils.RedisUtil; |
| | | import org.apache.ibatis.executor.statement.StatementHandler; |
| | | import org.apache.ibatis.plugin.*; |
| | | import java.sql.Connection; |
| | | import java.util.Properties; |
| | | import java.util.Set; |
| | | import java.util.regex.Matcher; |
| | | import java.util.regex.Pattern; |
| | | |
| | | @Intercepts({ |
| | | @Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class}) |
| | | }) |
| | | public class DataChangeInterceptor implements Interceptor { |
| | | |
| | | @Override |
| | | public Object intercept(Invocation invocation) throws Throwable { |
| | | StatementHandler statementHandler = (StatementHandler) invocation.getTarget(); |
| | | String sql = statementHandler.getBoundSql().getSql(); |
| | | if (sql != null) { |
| | | String trimmedSql = sql.trim().toUpperCase(); |
| | | // System.out.println("SQL: " + sql); |
| | | if (trimmedSql.startsWith("INSERT")) { |
| | | clearRedisCache(trimmedSql); |
| | | } else if (trimmedSql.startsWith("UPDATE")) { |
| | | clearRedisCache(trimmedSql); |
| | | } else if (trimmedSql.startsWith("DELETE")) { |
| | | clearRedisCache(trimmedSql); |
| | | } |
| | | } |
| | | |
| | | // 根据需要进行SQL解析 |
| | | return invocation.proceed(); |
| | | } |
| | | |
| | | @Override |
| | | public Object plugin(Object target) { |
| | | return Plugin.wrap(target, this); |
| | | } |
| | | |
| | | @Override |
| | | public void setProperties(Properties properties) {} |
| | | |
| | | public static String extractTableName(String sql) { |
| | | if (sql == null || sql.trim().isEmpty()) { |
| | | return "无效的SQL语句"; |
| | | } |
| | | |
| | | String trimmedSql = sql.trim().toUpperCase(); |
| | | String tableName = ""; |
| | | |
| | | // 定义正则表达式 |
| | | Pattern insertPattern = Pattern.compile("INSERT INTO (\\S+)", Pattern.CASE_INSENSITIVE); |
| | | Pattern updatePattern = Pattern.compile("UPDATE (\\S+)", Pattern.CASE_INSENSITIVE); |
| | | Pattern deletePattern = Pattern.compile("DELETE FROM (\\S+)", Pattern.CASE_INSENSITIVE); |
| | | |
| | | Matcher matcher; |
| | | |
| | | // 检查INSERT语句 |
| | | matcher = insertPattern.matcher(trimmedSql); |
| | | if (matcher.find()) { |
| | | tableName = matcher.group(1); |
| | | } else { |
| | | // 检查UPDATE语句 |
| | | matcher = updatePattern.matcher(trimmedSql); |
| | | if (matcher.find()) { |
| | | tableName = matcher.group(1); |
| | | } else { |
| | | // 检查DELETE语句 |
| | | matcher = deletePattern.matcher(trimmedSql); |
| | | if (matcher.find()) { |
| | | tableName = matcher.group(1); |
| | | } |
| | | } |
| | | } |
| | | |
| | | if (tableName.isEmpty()) { |
| | | return null; |
| | | } |
| | | |
| | | return tableName; |
| | | } |
| | | |
| | | private void clearRedisCache(String sql) { |
| | | RedisUtil redisUtil = SpringUtils.getBean(RedisUtil.class); |
| | | if (redisUtil == null) { |
| | | return; |
| | | } |
| | | |
| | | String tableName = extractTableName(sql); |
| | | if (tableName == null) { |
| | | return; |
| | | } |
| | | |
| | | tableName = tableName.toLowerCase(); |
| | | |
| | | Set<String> keys = redisUtil.searchRedisKeys(tableName); |
| | | for (String key : keys) { |
| | | if (!key.startsWith(RedisConstants.CACHE_DATA)) { |
| | | continue; |
| | | } |
| | | redisUtil.del(key); |
| | | } |
| | | } |
| | | } |
| | | package com.zy.asrs.wms.common.interceptor;
|
| | |
|
| | | import com.zy.asrs.framework.common.SpringUtils;
|
| | | import com.zy.asrs.wms.common.constant.RedisConstants;
|
| | | import com.zy.asrs.wms.utils.RedisUtil;
|
| | | import org.apache.ibatis.executor.statement.StatementHandler;
|
| | | import org.apache.ibatis.plugin.*;
|
| | | import java.sql.Connection;
|
| | | import java.util.Properties;
|
| | | import java.util.Set;
|
| | | import java.util.regex.Matcher;
|
| | | import java.util.regex.Pattern;
|
| | |
|
| | | @Intercepts({
|
| | | @Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})
|
| | | })
|
| | | public class DataChangeInterceptor implements Interceptor {
|
| | |
|
| | | @Override
|
| | | public Object intercept(Invocation invocation) throws Throwable {
|
| | | StatementHandler statementHandler = (StatementHandler) invocation.getTarget();
|
| | | String sql = statementHandler.getBoundSql().getSql();
|
| | | if (sql != null) {
|
| | | String trimmedSql = sql.trim().toUpperCase();
|
| | | // System.out.println("SQL: " + sql);
|
| | | if (trimmedSql.startsWith("INSERT")) {
|
| | | clearRedisCache(trimmedSql);
|
| | | } else if (trimmedSql.startsWith("UPDATE")) {
|
| | | clearRedisCache(trimmedSql);
|
| | | } else if (trimmedSql.startsWith("DELETE")) {
|
| | | clearRedisCache(trimmedSql);
|
| | | }
|
| | | }
|
| | |
|
| | | // 根据需要进行SQL解析
|
| | | return invocation.proceed();
|
| | | }
|
| | |
|
| | | @Override
|
| | | public Object plugin(Object target) {
|
| | | return Plugin.wrap(target, this);
|
| | | }
|
| | |
|
| | | @Override
|
| | | public void setProperties(Properties properties) {}
|
| | |
|
| | | public static String extractTableName(String sql) {
|
| | | if (sql == null || sql.trim().isEmpty()) {
|
| | | return "无效的SQL语句";
|
| | | }
|
| | |
|
| | | String trimmedSql = sql.trim().toUpperCase();
|
| | | String tableName = "";
|
| | |
|
| | | // 定义正则表达式
|
| | | Pattern insertPattern = Pattern.compile("INSERT INTO (\\S+)", Pattern.CASE_INSENSITIVE);
|
| | | Pattern updatePattern = Pattern.compile("UPDATE (\\S+)", Pattern.CASE_INSENSITIVE);
|
| | | Pattern deletePattern = Pattern.compile("DELETE FROM (\\S+)", Pattern.CASE_INSENSITIVE);
|
| | |
|
| | | Matcher matcher;
|
| | |
|
| | | // 检查INSERT语句
|
| | | matcher = insertPattern.matcher(trimmedSql);
|
| | | if (matcher.find()) {
|
| | | tableName = matcher.group(1);
|
| | | } else {
|
| | | // 检查UPDATE语句
|
| | | matcher = updatePattern.matcher(trimmedSql);
|
| | | if (matcher.find()) {
|
| | | tableName = matcher.group(1);
|
| | | } else {
|
| | | // 检查DELETE语句
|
| | | matcher = deletePattern.matcher(trimmedSql);
|
| | | if (matcher.find()) {
|
| | | tableName = matcher.group(1);
|
| | | }
|
| | | }
|
| | | }
|
| | |
|
| | | if (tableName.isEmpty()) {
|
| | | return null;
|
| | | }
|
| | |
|
| | | return tableName;
|
| | | }
|
| | |
|
| | | private void clearRedisCache(String sql) {
|
| | | RedisUtil redisUtil = SpringUtils.getBean(RedisUtil.class);
|
| | | if (redisUtil == null) {
|
| | | return;
|
| | | }
|
| | |
|
| | | String tableName = extractTableName(sql);
|
| | | if (tableName == null) {
|
| | | return;
|
| | | }
|
| | |
|
| | | tableName = tableName.toLowerCase();
|
| | |
|
| | | Set<String> keys = redisUtil.searchRedisKeys(tableName);
|
| | | for (String key : keys) {
|
| | | if (!key.startsWith(RedisConstants.CACHE_DATA)) {
|
| | | continue;
|
| | | }
|
| | | redisUtil.del(key);
|
| | | }
|
| | | }
|
| | | }
|