This commit is contained in:
wanghao
2026-03-06 09:54:28 +08:00
2 changed files with 125 additions and 1 deletions
@@ -345,7 +345,7 @@ public class AedEquipmentManger implements Serializable {
*/ */
@Excel(name = "型号", width = 15) @Excel(name = "型号", width = 15)
@Schema(title = "型号") @Schema(title = "型号")
@TableField("modelNumber") @TableField("MODEL_NUMBER")
private String model; private String model;
/** /**
* 来源字典 设备类型 1:立式 ,2:挂式,3:车载 * 来源字典 设备类型 1:立式 ,2:挂式,3:车载
@@ -0,0 +1,124 @@
package org.jeecg.config.mybatis;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.plugin.*;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.reflection.SystemMetaObject;
import org.springframework.stereotype.Component;
import java.sql.Connection;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Properties;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* 达梦数据库关键字拦截器
* 自动为 SQL 中的关键字别名添加双引号,避免关键字冲突
*
* @author system
* @date 2026-03-05
*/
@Slf4j
@Component
@Intercepts({
@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})
})
public class DmKeywordInterceptor implements Interceptor {
/**
* 达梦数据库关键字列表(常见关键字)
* 可根据实际需要添加更多关键字
*/
private static final Set<String> DM_KEYWORDS = new HashSet<>(Arrays.asList(
"MODEL", "BEGIN", "END"
));
@Override
public Object intercept(Invocation invocation) throws Throwable {
try {
StatementHandler statementHandler = (StatementHandler) invocation.getTarget();
MetaObject metaObject = SystemMetaObject.forObject(statementHandler);
String sql = (String) metaObject.getValue("delegate.boundSql.sql");
// 处理 AS 别名关键字冲突
String processedSql = processKeywordAlias(sql);
// 如果 SQL 被修改,则记录日志并更新
if (!sql.equals(processedSql)) {
log.debug("达梦关键字拦截器处理SQL - 原始: {} => 处理后: {}", sql, processedSql);
metaObject.setValue("delegate.boundSql.sql", processedSql);
}
} catch (Exception e) {
log.error("达梦关键字拦截器处理SQL异常", e);
// 发生异常时不影响正常流程,继续执行
}
return invocation.proceed();
}
/**
* 处理 SQL 中的关键字别名
* 将关键字别名用双引号包裹
*
* @param sql 原始 SQL
* @return 处理后的 SQL
*/
private String processKeywordAlias(String sql) {
if (sql == null || sql.trim().isEmpty()) {
return sql;
}
// 正则匹配: 字段名 as 别名 的模式
// 例如: model_no as model -> model_no as "model"
Pattern pattern = Pattern.compile(
"\\b([\\w.`]+)\\s+(?i:as)\\s+(\\w+)\\b",
Pattern.CASE_INSENSITIVE
);
Matcher matcher = pattern.matcher(sql);
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
String alias = matcher.group(2);
// 检查别名是否为关键字,且未被引号包裹
if (DM_KEYWORDS.contains(alias.toUpperCase()) && !alias.startsWith("\"")) {
// 给关键字别名加上双引号
matcher.appendReplacement(sb,
matcher.group(1) + " AS \"" + alias + "\"");
}
}
matcher.appendTail(sb);
return sb.toString();
}
@Override
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}
@Override
public void setProperties(Properties properties) {
// 可以通过配置文件注入额外的关键字
}
/**
* 添加自定义关键字到黑名单
*
* @param keywords 关键字数组
*/
public static void addKeywords(String... keywords) {
if (keywords != null) {
for (String keyword : keywords) {
if (keyword != null && !keyword.trim().isEmpty()) {
DM_KEYWORDS.add(keyword.toUpperCase());
}
}
}
}
}