Java port of great SQL formatter https://github.com/zeroturnaround/sql-formatter.
Written with only Java Standard Library, without dependencies.
Demo is running on Google Cloud Function, with native-compiled shared library by GraalVM.
This does not support:
- Stored procedures.
- Changing of the delimiter type to something else than ;.
- 支持格式化时移除注释
String format =
SqlFormatter.of(Dialect.MySql)
.format("-- test \nSELECT -- test \nid from where id = ${abc}",
FormatConfig
.builder()
.removeComments()
.build());
SELECT
id
from
where
id = ${abc}
- 支持格式化成一行
String format =
SqlFormatter.of(Dialect.MySql)
.format("-- test \nSELECT -- test \nid from where id = ${abc}",
FormatConfig
.builder()
.oneLine()
.build());
SELECT id from where id = ${abc}
- 支持格式化自定义占位符作为独立,占位符格式为
${xxxx}
String format =
SqlFormatter.of(Dialect.MySql)
.format("-- test \nSELECT -- test \nid from where id = ${abc}",
FormatConfig
.builder()
.build());
输出
-- test
SELECT
-- test
id
from
where
id = ${abc}
<dependency>
<groupId>com.github.vertical-blank</groupId>
<artifactId>sql-formatter</artifactId>
<version>2.0.5</version>
</dependency>
implementation 'com.github.vertical-blank:sql-formatter:2.0.5'
You can easily use com.github.vertical_blank.sqlformatter.SqlFormatter
:
SqlFormatter.format("SELECT * FROM table1")
This will output:
SELECT
*
FROM
table1
You can also pass FormatConfig
object built by builder:
SqlFormatter.format('SELECT * FROM tbl',
FormatConfig.builder()
.indent(" ") // Defaults to two spaces
.uppercase(true) // Defaults to false (not safe to use when SQL dialect has case-sensitive identifiers)
.linesBetweenQueries(2) // Defaults to 1
.maxColumnLength(100) // Defaults to 50
.params(Arrays.asList("a", "b", "c")) // Map or List. See Placeholders replacement.
.build()
);
You can pass dialect com.github.vertical_blank.sqlformatter.languages.Dialect
or String
to SqlFormatter.of
:
SqlFormatter
.of(Dialect.N1ql) // Recommended
//.of("n1ql") // String can be passed
.format("SELECT *");
SQL formatter supports the following dialects:
- sql - Standard SQL
- mariadb - MariaDB
- mysql - MySQL
- postgresql - PostgreSQL
- db2 - IBM DB2
- plsql - Oracle PL/SQL
- n1ql - Couchbase N1QL
- redshift - Amazon Redshift
- spark - Spark
- tsql - SQL Server Transact-SQL
Formatters can be extended as below :
SqlFormatter
.of(Dialect.MySql)
.extend(cfg -> cfg.plusOperators("=>"))
.format("SELECT * FROM table WHERE A => 4")
Then it results in:
SELECT
*
FROM
table
WHERE
A => 4
You can pass List
or Map
to format
:
// Named placeholders
Map<String, String> namedParams = new HashMap<>();
namedParams.put("foo", "'bar'");
SqlFormatter.of(Dialect.TSql).format("SELECT * FROM tbl WHERE foo = @foo", namedParams);
// Indexed placeholders
SqlFormatter.format("SELECT * FROM tbl WHERE foo = ?", Arrays.asList("'bar'"));
Both result in:
SELECT
*
FROM
tbl
WHERE
foo = 'bar'
Building this library requires JDK 11 because of ktfmt.