`
kanpiaoxue
  • 浏览: 1782020 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Java格式化SQL语句

 
阅读更多

 

很多时候我们需要将文本的sql转换为可阅读的格式化好的sql。

这里推荐使用阿里的druid。里面有个工具类可以完成这个功能。

com.alibaba.druid.sql.SQLUtils

它支持:

写道
public static String formatMySql(String sql)
public static String formatOracle(String sql)
public static String formatOdps(String sql)
public static String toOracleString(SQLObject sqlObject)
public static String toPGString(SQLObject sqlObject)
public static String toDB2String(SQLObject sqlObject)
public static String toSQLServerString(SQLObject sqlObject)
public static String formatPGSql(String sql)

 

示例:

String sql = SQLUtils.formatMySql("CREATE TABLE `tb_test` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID', `test_name` varchar(2000) NOT NULL COMMENT '操作对象', `path` varchar(500) NOT NULL COMMENT '操作路径', `op_type` int(4) NOT NULL COMMENT '操作类型:1,新增;2,删除;3,更新;', `op_user` varchar(100) NOT NULL COMMENT '操作人', `info` varchar(4000) NOT NULL DEFAULT '' COMMENT '描述信息', `address` varchar(100) NOT NULL DEFAULT '' COMMENT '操作地址', `gmt_create` datetime NOT NULL COMMENT '创建时间', PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='演示test表';");
        System.out.println(sql);

 输出:

CREATE TABLE `tb_test` (
	`id` bigint(20) AUTO_INCREMENT NOT NULL COMMENT '主键ID', 
	`test_name` varchar(2000) NOT NULL COMMENT '操作对象', 
	`path` varchar(500) NOT NULL COMMENT '操作路径', 
	`op_type` int(4) NOT NULL COMMENT '操作类型:1,新增;2,删除;3,更新;', 
	`op_user` varchar(100) NOT NULL COMMENT '操作人', 
	`info` varchar(4000) DEFAULT'' NOT NULL COMMENT '描述信息', 
	`address` varchar(100) DEFAULT'' NOT NULL COMMENT '操作地址', 
	`gmt_create` datetime NOT NULL COMMENT '创建时间', 
	PRIMARY KEY (`id`)
) ENGINE = InnoDB CHARSET = utf8 COMMENT = '演示test表'
这个工具类里面还有很多实用的小工具。 
 
 
/*
 * Copyright 1999-2011 Alibaba Group Holding Ltd.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.alibaba.druid.sql;

import java.util.ArrayList;
import java.util.List;

import com.alibaba.druid.DruidRuntimeException;
import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.SQLObject;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr;
import com.alibaba.druid.sql.dialect.db2.visitor.DB2OutputVisitor;
import com.alibaba.druid.sql.dialect.db2.visitor.DB2SchemaStatVisitor;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlOutputVisitor;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor;
import com.alibaba.druid.sql.dialect.odps.visitor.OdpsOutputVisitor;
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleOutputVisitor;
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor;
import com.alibaba.druid.sql.dialect.postgresql.visitor.PGOutputVisitor;
import com.alibaba.druid.sql.dialect.postgresql.visitor.PGSchemaStatVisitor;
import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerOutputVisitor;
import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerSchemaStatVisitor;
import com.alibaba.druid.sql.parser.ParserException;
import com.alibaba.druid.sql.parser.SQLExprParser;
import com.alibaba.druid.sql.parser.SQLParserUtils;
import com.alibaba.druid.sql.parser.SQLStatementParser;
import com.alibaba.druid.sql.parser.Token;
import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor;
import com.alibaba.druid.sql.visitor.SchemaStatVisitor;
import com.alibaba.druid.support.logging.Log;
import com.alibaba.druid.support.logging.LogFactory;
import com.alibaba.druid.util.JdbcConstants;
import com.alibaba.druid.util.JdbcUtils;
import com.alibaba.druid.util.StringUtils;

public class SQLUtils {

    private final static Log LOG = LogFactory.getLog(SQLUtils.class);

    public static String toSQLString(SQLObject sqlObject, String dbType) {
        if (JdbcUtils.MYSQL.equals(dbType) || //
            JdbcUtils.MARIADB.equals(dbType) || //
            JdbcUtils.H2.equals(dbType)) {
            return toMySqlString(sqlObject);
        }

        if (JdbcUtils.ORACLE.equals(dbType) || JdbcUtils.ALI_ORACLE.equals(dbType)) {
            return toOracleString(sqlObject);
        }

        if (JdbcUtils.POSTGRESQL.equals(dbType)) {
            return toPGString(sqlObject);
        }

        if (JdbcUtils.DB2.equals(dbType)) {
            return toDB2String(sqlObject);
        }
        
        if (JdbcUtils.ODPS.equals(dbType)) {
            return toDB2String(sqlObject);
        }

        return toSQLServerString(sqlObject);
    }

    public static String toSQLString(SQLObject sqlObject) {
        StringBuilder out = new StringBuilder();
        sqlObject.accept(new SQLASTOutputVisitor(out));

        String sql = out.toString();
        return sql;
    }

    public static String toOdpsString(SQLObject sqlObject) {
        StringBuilder out = new StringBuilder();
        sqlObject.accept(new OdpsOutputVisitor(out));

        String sql = out.toString();
        return sql;
    }
    
    public static String toMySqlString(SQLObject sqlObject) {
        StringBuilder out = new StringBuilder();
        sqlObject.accept(new MySqlOutputVisitor(out));
        
        String sql = out.toString();
        return sql;
    }

    public static SQLExpr toMySqlExpr(String sql) {
        return toSQLExpr(sql, JdbcUtils.MYSQL);
    }

    public static String formatMySql(String sql) {
        return format(sql, JdbcUtils.MYSQL);
    }

    public static String formatOracle(String sql) {
        return format(sql, JdbcUtils.ORACLE);
    }
    
    public static String formatOdps(String sql) {
        return format(sql, JdbcUtils.ODPS);
    }

    public static String toOracleString(SQLObject sqlObject) {
        StringBuilder out = new StringBuilder();
        sqlObject.accept(new OracleOutputVisitor(out, false));

        String sql = out.toString();
        return sql;
    }

    public static String toPGString(SQLObject sqlObject) {
        StringBuilder out = new StringBuilder();
        sqlObject.accept(new PGOutputVisitor(out));

        String sql = out.toString();
        return sql;
    }

    public static String toDB2String(SQLObject sqlObject) {
        StringBuilder out = new StringBuilder();
        sqlObject.accept(new DB2OutputVisitor(out));

        String sql = out.toString();
        return sql;
    }

    public static String toSQLServerString(SQLObject sqlObject) {
        StringBuilder out = new StringBuilder();
        sqlObject.accept(new SQLServerOutputVisitor(out));

        String sql = out.toString();
        return sql;
    }

    public static String formatPGSql(String sql) {
        return format(sql, JdbcUtils.POSTGRESQL);
    }

    public static SQLExpr toSQLExpr(String sql, String dbType) {
        SQLExprParser parser = SQLParserUtils.createExprParser(sql, dbType);
        SQLExpr expr = parser.expr();

        if (parser.getLexer().token() != Token.EOF) {
            throw new ParserException("illegal sql expr : " + sql);
        }

        return expr;
    }

    public static List<SQLStatement> toStatementList(String sql, String dbType) {
        SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, dbType);
        return parser.parseStatementList();
    }

    public static SQLExpr toSQLExpr(String sql) {
        return toSQLExpr(sql, null);
    }

    public static String format(String sql, String dbType) {
        return format(sql, dbType, null);
    }

    public static String format(String sql, String dbType, List<Object> parameters) {
        try {
            List<SQLStatement> statementList = toStatementList(sql, dbType);

            return toSQLString(statementList, dbType, parameters);
        } catch (ParserException ex) {
            LOG.warn("format error", ex);
            return sql;
        }
    }

    public static String toSQLString(List<SQLStatement> statementList, String dbType) {
        return toSQLString(statementList, dbType, null);
    }

    public static String toSQLString(List<SQLStatement> statementList, String dbType, List<Object> parameters) {
        StringBuilder out = new StringBuilder();
        SQLASTOutputVisitor visitor = createFormatOutputVisitor(out, statementList, dbType);
        if (parameters != null) {
            visitor.setParameters(parameters);
        }

        for (SQLStatement stmt : statementList) {
            stmt.accept(visitor);
        }

        return out.toString();
    }

    public static SQLASTOutputVisitor createFormatOutputVisitor(Appendable out, List<SQLStatement> statementList,
                                                                String dbType) {
        if (JdbcUtils.ORACLE.equals(dbType) || JdbcUtils.ALI_ORACLE.equals(dbType)) {
            if (statementList.size() == 1) {
                return new OracleOutputVisitor(out, false);
            } else {
                return new OracleOutputVisitor(out, true);
            }
        }

        if (JdbcUtils.MYSQL.equals(dbType) || //
            JdbcUtils.MARIADB.equals(dbType) || //
            JdbcUtils.H2.equals(dbType)) {
            return new MySqlOutputVisitor(out);
        }

        if (JdbcUtils.POSTGRESQL.equals(dbType)) {
            return new PGOutputVisitor(out);
        }

        if (JdbcUtils.SQL_SERVER.equals(dbType) || JdbcUtils.JTDS.equals(dbType)) {
            return new SQLServerOutputVisitor(out);
        }

        if (JdbcUtils.DB2.equals(dbType)) {
            return new DB2OutputVisitor(out);
        }

        return new SQLASTOutputVisitor(out);
    }

    public static SchemaStatVisitor createSchemaStatVisitor(List<SQLStatement> statementList, String dbType) {
        if (JdbcUtils.ORACLE.equals(dbType) || JdbcUtils.ALI_ORACLE.equals(dbType)) {
            if (statementList.size() == 1) {
                return new OracleSchemaStatVisitor();
            } else {
                return new OracleSchemaStatVisitor();
            }
        }

        if (JdbcUtils.MYSQL.equals(dbType) || //
            JdbcUtils.MARIADB.equals(dbType) || //
            JdbcUtils.H2.equals(dbType)) {
            return new MySqlSchemaStatVisitor();
        }

        if (JdbcUtils.POSTGRESQL.equals(dbType)) {
            return new PGSchemaStatVisitor();
        }

        if (JdbcUtils.SQL_SERVER.equals(dbType) || JdbcUtils.JTDS.equals(dbType)) {
            return new SQLServerSchemaStatVisitor();
        }

        if (JdbcUtils.DB2.equals(dbType)) {
            return new DB2SchemaStatVisitor();
        }

        return new SchemaStatVisitor();
    }

    public static List<SQLStatement> parseStatements(String sql, String dbType) {
        SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, dbType);
        List<SQLStatement> stmtList = parser.parseStatementList();
        if (parser.getLexer().token() != Token.EOF) {
            throw new DruidRuntimeException("syntax error : " + sql);
        }
        return stmtList;
    }

    /**
     * @author owenludong.lud
     * @param columnName
     * @param tableAlias
     * @param pattern if pattern is null,it will be set {%Y-%m-%d %H:%i:%s} as mysql default value and set {yyyy-mm-dd
     * hh24:mi:ss} as oracle default value
     * @param dbType {@link JdbcConstants} if dbType is null ,it will be set the mysql as a default value
     */
    public static String buildToDate(String columnName, String tableAlias, String pattern, String dbType) {
        StringBuilder sql = new StringBuilder();
        if (StringUtils.isEmpty(columnName)) return "";
        if (StringUtils.isEmpty(dbType)) dbType = JdbcConstants.MYSQL;
        String formatMethod = "";
        if (JdbcConstants.MYSQL.equalsIgnoreCase(dbType)) {
            formatMethod = "STR_TO_DATE";
            if (StringUtils.isEmpty(pattern)) pattern = "%Y-%m-%d %H:%i:%s";
        } else if (JdbcConstants.ORACLE.equalsIgnoreCase(dbType)) {
            formatMethod = "TO_DATE";
            if (StringUtils.isEmpty(pattern)) pattern = "yyyy-mm-dd hh24:mi:ss";
        } else {
            return "";
            // expand date's handle method for other database
        }
        sql.append(formatMethod).append("(");
        if (!StringUtils.isEmpty(tableAlias)) sql.append(tableAlias).append(".");
        sql.append(columnName).append(",");
        sql.append("'");
        sql.append(pattern);
        sql.append("')");
        return sql.toString();
    }

    public static List<SQLExpr> split(SQLBinaryOpExpr x) {
        List<SQLExpr> groupList = new ArrayList<SQLExpr>();
        groupList.add(x.getRight());

        SQLExpr left = x.getLeft();
        for (;;) {
            if (left instanceof SQLBinaryOpExpr && ((SQLBinaryOpExpr) left).getOperator() == x.getOperator()) {
                SQLBinaryOpExpr binaryLeft = (SQLBinaryOpExpr) left;
                groupList.add(binaryLeft.getRight());
                left = binaryLeft.getLeft();
            } else {
                groupList.add(left);
                break;
            }
        }
        return groupList;
    }
}
 

 

分享到:
评论

相关推荐

    Java打印漂亮的SQL语句(被格式化的SQL语句)

    为了提高效率并使SQL语句更易于理解和分析,格式化SQL语句显得尤为重要。标题提及的"Java打印漂亮的SQL语句(被格式化的SQL语句)"就是一种解决方案,它利用特定的工具或库将原本杂乱无章的SQL转换为结构清晰、简洁易...

    Java Sql 格式化工具

    "Java Sql 格式化工具"是一个专为提升SQL代码可读性和规范性而设计的实用工具,尤其对于那些频繁编写和维护SQL语句的开发者而言,它能显著提高工作效率。本工具基于Sqlplus developer,它提供了一种将混乱无序的SQL...

    SQL格式化功能(JAVA代码)

    在IT行业中,数据库查询语言SQL(Structured Query Language)是数据管理...通过深入研究提供的Java代码,开发者不仅可以提升自己的编程技能,还能了解如何处理SQL语句的格式化问题,这对于日常开发工作是非常有益的。

    SQL格式化功能(C#代码)

    SQL格式化是将原始的、未经排版的SQL语句转换为遵循特定编码风格的、清晰易读的代码。这个过程包括缩进、换行、添加空格等,使得代码结构更加清晰,便于阅读和理解。这对于团队协作和代码审查尤其重要,因为它可以...

    开发sql语句拼接自动格式化工具

    SQL语句格式化工具是一种非常实用的开发辅助软件,它主要解决了在编写和维护大量SQL代码时遇到的格式混乱和拼接困难的问题。通过这款工具,开发者可以快速地将大段的SQL语句进行自动格式化,使得代码更加清晰、易读...

    Oracle Sql语句转换成Mysql Sql语句

    在使用这个工具时,开发者需要确保源代码中的SQL语句是标准的Oracle SQL格式,避免使用特定Oracle数据库的特性,以提高转换的成功率。同时,转换后还需要对生成的MySQL SQL进行测试,确保在目标数据库环境中能正常...

    js实现SQL语句格式化(附ACE编辑器使用示例及效果)

    我们知道,在编辑SQL语句的时候,可以通过各种客户端软件对SQL语句进行格式化,但是我们如果想通过前端来格式化SQL怎么办呢?这时我们可以借助sql-formatter.js插件来实现,具体参考Demo附件(可直接运行,内附ACE...

    sql语句格式化工具

    SQL语句格式化工具是一种专为数据库管理员和开发人员设计的实用程序,旨在将混乱、难以阅读的SQL查询转换为整洁、易于理解的格式。在处理复杂查询时,这种工具显得尤为重要,因为它们能帮助我们避免语法错误,提高...

    关于在Java代码中写Sql语句需要注意的问题

    近做程序,时不时需要自己去手动将sql语句直接写入到Java代码中,写入sql语句时,需要注意几个小问题。  先看我之前写的几句简单的sql语句,自以为没有问题,但是编译直接报错。  String str = insert into XXX...

    DBeaver sql格式化V1.4

    【DBeaver SQL格式化V1.4】是一款专门针对DBeaver数据库管理工具的SQL代码美化插件,主要用于帮助用户将杂乱无章的SQL语句自动格式化为清晰易读的结构,提高代码的可读性和维护性。这款插件的版本号为1.4,表明它...

    java_SQL文件批量删除注释

    java_SQL文件批量删除注释 ,实现自动批量处理Sql脚本中的注释,方便发布您自己的脚本,简单好用。亲测可以用的,谢谢支持。

    sql语句转为java的StringBuilder

    先在navicat之类的工具格式化sql!!!!! sql语句写完之后转为美观的java,在sql语句很长了之后有点麻烦。 其实代码逻辑简单,但是有一点就是有时候没时间来写,所以附上源代码和可执行的jar文件

    sql-formatter:格式化SQL语句

    格式化SQL语句。格式化从标准输入接收SQL语句,并将其输出到标准输出。 使用例 echo " SELECT * FROM HOGE WHERE HOGE.FUGA = :fuga " | java -jar target/sql-formatter-1.0.1-jar-with-dependencies.jar 输出...

    java控制台输出可执行sql,支持oracle,mysql,sqlserver,kingbas

    "可执行(尽可能)的sql输出"可能指的是这个库尝试生成的SQL语句是可直接在数据库管理工具中执行的,这意味着输出的SQL语句格式化良好,没有程序内部处理的额外信息,方便开发者理解和测试。 从标签"sqlserver ...

    JsonSQL:用SQL语句解析JSON文件

    **JsonSQL: SQL语句解析JSON文件** 在大数据处理和Web应用中,JSON(JavaScript Object Notation)格式已经成为数据交换的常见格式。然而,对于习惯使用SQL查询关系型数据库的人来说,处理JSON数据可能会觉得不太...

    基于SQL 语法解释器JSqlParser实现的SQL解析工具

    总之,JSqlParser作为一个强大的SQL解析工具,通过提供对SQL语句的结构化解析,极大地简化了开发者处理SQL相关任务的复杂度。通过学习和应用JSqlParser,我们可以更好地理解和控制SQL查询,提高代码的健壮性和安全性...

    sql代码格式化工具类

    至于“sql-java格式化”这个压缩包子文件,很可能包含以下内容: 1. 工具类的Java源代码文件:这是实现SQL格式化的核心代码,通常以.java为扩展名。 2. 使用示例或测试用例:可能包含一些示例SQL语句,演示如何调用...

    idea插件mybaits log 打印sql语句

    5. **格式化输出**:对打印的SQL进行格式化,使其更易读。 6. **搜索和过滤**:提供搜索和过滤功能,方便在大量的日志中查找特定的SQL。 总的来说,"idea插件mybaits log 打印sql语句"是一个针对IntelliJ IDEA的...

    页面sql编辑高亮显示

    例如,关键字可能用一种颜色,数据表名用另一种颜色,这有助于用户快速理解和检查SQL语句。 在实际应用中,当用户在输入框中键入SQL时,可以使用JavaScript事件监听器(如`input`事件)来捕获文本变化。一旦检测到...

    sql语句生成的工具

    1. **图形化界面**:提供拖拽式界面,用户可以直观地选择表、字段、条件,工具会自动生成相应的SQL语句。 2. **代码编辑器**:具备自动补全、语法高亮、错误检查等功能,帮助用户更准确地编写和修改SQL语句。 3. **...

Global site tag (gtag.js) - Google Analytics