在web项目中有时候会遇到需要将用户输入的sql格式化的需求,笔者最近就遇到这样一个项目,经过查找资料,总结下面的随手笔记,后续有空会在重新整理。sql语句本质上是字符串,要对其格式化,也就是字符串的查找、解析、替换之类的操作。
1.如果要求不高,可以自己写一个简单的格式化方法。参考https://www.cnblogs.com/firstdream/p/5651994.htm
package aaa;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Set;
import java.util.StringTokenizer;
public class SqlFormatterUtils {
private static final Set<String> BEGIN_CLAUSES = new HashSet<String>();
private static final Set<String> END_CLAUSES = new HashSet<String>();
private static final Set<String> LOGICAL = new HashSet<String>();
private static final Set<String> QUANTIFIERS = new HashSet<String>();
private static final Set<String> DML = new HashSet<String>();
private static final Set<String> MISC = new HashSet<String>();
static final String indentString = " ";
static final String initial = "\n ";
public String format(String source) {
return new FormatProcess(source).perform().trim();
}
static {
BEGIN_CLAUSES.add("left");
BEGIN_CLAUSES.add("right");
BEGIN_CLAUSES.add("inner");
BEGIN_CLAUSES.add("outer");
BEGIN_CLAUSES.add("group");
BEGIN_CLAUSES.add("order");
END_CLAUSES.add("where");
END_CLAUSES.add("set");
END_CLAUSES.add("having");
END_CLAUSES.add("join");
END_CLAUSES.add("from");
END_CLAUSES.add("by");
END_CLAUSES.add("join");
END_CLAUSES.add("into");
END_CLAUSES.add("union");
LOGICAL.add("and");
LOGICAL.add("or");
LOGICAL.add("when");
LOGICAL.add("else");
LOGICAL.add("end");
QUANTIFIERS.add("in");
QUANTIFIERS.add("all");
QUANTIFIERS.add("exists");
QUANTIFIERS.add("some");
QUANTIFIERS.add("any");
DML.add("insert");
DML.add("update");
DML.add("delete");
MISC.add("select");
MISC.add("on");
}
private static class FormatProcess {
boolean beginLine = true;
boolean afterBeginBeforeEnd