关于Java:寻找可嵌入的SQL美化器或重新格式化

Looking for an embeddable SQL beautifier or reformatter

我正在寻找SQL的Java开放源代码美化工具或重新格式化工具,可用于清理使用openArchitectureWare生成的DDL语句。

"在线代码美化工具和格式化程序"的答案对我没有任何帮助,并且我还无法使Simple SQL Formatter对我有用。


更新2:

org.hibernate.jdbc.util.BasicFormatterImpl在版本4.0中被移动。现在它位于:org.hibernate.engine.jdbc.internal.BasicFormatterImpl

更新1:

技术在前进。正如Alex所指出的,org.hibernate.pretty.Formatter从3.3.2.GA版本开始不再存在。替换为org.hibernate.jdbc.util.BasicFormatterImpl

1
String formattedSQL = new BasicFormatterImpl().format(sql);

原始答案:

如果您使用的是Hibernate,则它们具有一个内置的:org.hibernate.pretty.Formatter

1
String formattedSQL = new Formatter(sql).format();


在Hibernate v3.3.2.GA中,org.hibernate.pretty.Formatter不再存在。
您可以使用其替换:org.hibernate.jdbc.util.BasicFormatterImpl

将org.hibernate.engine.jdbc.internal.BasicFormatterImpl用于Hibernate 4.0及更高版本。

1
2
Formatter f = new BasicFormatterImpl();
String formatted_sql_code = f.format(ugly_sql_code);

Eclipse数据工具平台的一部分是SQL开发工具项目。

描述如何使用SQL查询解析器的页面对SQLQuerySourceFormat的使用非常简短,其中提供了以下选项:

  • reserveSourceFormat =用于在生成SQL源文本时保留输入源格式的选项
  • statementTerminator =分隔多个SQL语句的字符
  • hostVariablePrefix =主机语言变量之前的字符
  • parameterMarker =标识宿主语言参数的字符
  • delimitedIdentifierQuote * =包含定界标识符的字符,以防万一,将保留其写法
  • omitSchema =当前模式(在SQL源中省略,隐式表示为不合格的表引用)
  • qualifyIdentifiers =描述如何限定SQL源中的标识符的标志
  • reserveComments =在已解析的SQL源或/和生成的SQL源中保留注释的选项
  • generateCommentsForStatementOnly =仅在完整语句的上下文中为SQL源生成注释的选项;如果设置为false,则也为语句上下文之外的单个SQL Query对象生成注释


你有没有考虑过:

http://www.sqlinform.com

它们提供API版本和命令行版本(以及在线版本)。

虽然不知道成本。


这行得通吗-SQL Formatter。


也许jsqlparser将为您工作。

不像您想的那样容易找到,因为那里有很多已经停工的项目。实际上,我找不到它,所以最终做了我自己的事情(基于h2解析器-如果其他所有方法都失败,则可以与我联系)。结果,我不知道它是否具有美化剂,但是在上面写一个应该足够简单。

它基于语法和JavaCC,因此在任何情况下都可能比使用antlr重新发明这种轮子更好。您可能会发现,如果需要在复杂的语句中支持各种sql方言,那么基于语法的任何方法都将使您失败。


因此,这绝对是您要寻找的:一个支持Oracle,SQL Server,DB2,MySQL,Teradata和PostgreSQL的SQL格式化程序库。


您可以只使用SQL语法并使用antlr构建AST。然后,您可以按任意格式输出树。