1 概述:SQL注释清除
- 情况1:对于数据中台、查询引擎而言,对SQL脚本中注释的清除,是必须考虑的一个问题。
- 情况2:解决 GeminiDB 等尚不成熟的数据库,其提交 SQL中不允许有注释信息(例如 "-- xxxxx")的问题
Z 最佳实践
import lombok.extern.slf4j.Slf4j;import javax.annotation.Nonnull;
import java.util.regex.Pattern;/*** SQL注释剥离器* @create-time 2025-09-10 23:48* @note* 为解决 GeminiDB 等数据库 的 提交 SQL中不允许有注释信息(例如 "-- xxxxx")* 在提交SQL到数据库前, SQL 中自动去除注释*/
@Slf4j
public class SqlCommentStripper {//Pattern.MULTILINE : 用于处理多行文本 ; Pattern.DOTALL : 让.匹配包括行终止符在内的任意字符private static final Pattern SINGLE_LINE_COMMENT_PATTERN = Pattern.compile("--.*?\n", Pattern.DOTALL);//LAST_LINE_SINGLE_LINE_COMMENT_PATTERN : 解决SQL最后一行存在单行注释的问题private static final Pattern LAST_LINE_SINGLE_LINE_COMMENT_PATTERN = Pattern.compile("--.*?$", Pattern.MULTILINE);private static final Pattern MULTI_LINE_COMMENT_PATTERN = Pattern.compile("/\\*.*?\\*/", Pattern.DOTALL);/*** 自动去除注释* @param sql* @return*/public static String stripComments(@Nonnull String sql) {//eg: sql = "SELECT * FROM users WHERE id = 1; -- This is a single-line comment\n-- test1\n/* Hello Guys \n * This is a multi-line comment! */-- test2\n/* test 3*/SELECT * FROM product WHERE id = 2;-- test4";log.debug("strip-before-sql:\n{}", sql);String cleanSql = SINGLE_LINE_COMMENT_PATTERN.matcher(sql).replaceAll("\n");cleanSql = LAST_LINE_SINGLE_LINE_COMMENT_PATTERN.matcher(cleanSql).replaceAll("");//去除最后一行SQL存在单行注释的问题cleanSql = MULTI_LINE_COMMENT_PATTERN.matcher(cleanSql).replaceAll("");//eg : SELECT * FROM users WHERE id = 1; SELECT * FROM product WHERE id = 2;log.debug("strip-after-sql:\n{}", cleanSql);return cleanSql;}
}
X 参考文献