Druid连接池工具公式化SQL附踩坑记录

这篇具有很好参考价值的文章主要介绍了Druid连接池工具公式化SQL附踩坑记录。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 需求

使用Druid连接池工具格式化sql用于回显时候美观展示

2. 代码示例

2.1 依赖

<dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
      <version>1.2.6</version>
</dependency>

2.2 ParseUtils

import com.alibaba.druid.DbType;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.dialect.postgresql.visitor.PGOutputVisitor;
import com.alibaba.druid.sql.parser.SQLParserUtils;
import com.alibaba.druid.sql.parser.SQLStatementParser;
import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor;

import java.util.List;

/**
 * @author pp_lan
 * @date 2024/1/15
 */
public class ParseUtils {

    private ParseUtils() {
    }

    public static String format(String sql, String dbTypeStr) {
        DbType dbType = DbType.of(dbTypeStr);
        if (dbType == null) {
            throw new RuntimeException("不支持的数据库类型");
        }
        List<SQLStatement> statementList = toStatementList(sql, dbType);
        String result = sqlToString(statementList, dbTypeStr, null);
        return result;
    }

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

    public static String sqlToString(List<SQLStatement> statementList, String dbType, List<Object> parameters) {
        StringBuilder sb = new StringBuilder();
        SQLASTOutputVisitor visitor;
        switch (dbType) {
            case "postgresql":
                visitor = new PGOutputVisitor(sb);
                break;
            case "mysql":
                visitor = new MySqlOutputVisitor(sb);
                break;
            default:
                visitor = new SQLASTOutputVisitor(sb);
        }

        visitor.setParameters(parameters);

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

        return sb.toString();
    }

    public static void main(String[] args) {
        // 使用::将数值转为varchar
        try {
            System.out.println("[使用::转换]");
            String sql = "select sum(in_use) :: varchar from t_user";
            System.out.println(format(sql, DbType.postgresql.name()));
        } catch (Exception e) {
            System.out.println("使用::转换异常");
        }
        // 使用cast将数值转为varchar
        try {
            System.out.println("[使用cast转换]");
            String newSql = "select cast(sum(in_use) as varchar) from t_user";
            System.out.println(format(newSql, DbType.postgresql.name()));
        } catch (Exception e) {
            System.out.println("使用cast转换异常");
        }
    }

}

3. 运行结果

[使用::转换]
SELECT sum(in_use)::varchar
FROM t_user
[使用cast转换]
SELECT CAST(sum(in_use) AS varchar)
FROM t_user

4. 踩坑记录

4.1 描述

之前我使用的是druid为1.2.4版本,在解析pg库sql时候,发现执行结果如下:

[使用::转换]
使用::转换异常
[使用cast转换]
SELECT CAST(sum(in_use) AS varchar)
FROM t_user

可以发现,转换函数::在解析时候异常了

4.2 解决方法

切换高版本1.2.6及以上,可以正常解析。

4.3 总结

druid的1.2.6以下版本对于包含数值使用::转换为varchar的场景不支持,会导致解析报错。可以使用以下方法解决:文章来源地址https://www.toymoban.com/news/detail-804780.html

  • 升级druid版本到1.2.6及以上
  • 在格式化的方法上加上try-catch,格式化异常的时候使用原来的sql用于回显

到了这里,关于Druid连接池工具公式化SQL附踩坑记录的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 在线SQL格式化工具

    工具地址:http://sql.wc139.com/ SQL格式化工具介绍 在线SQL格式化工具是一款针对SQL语句进行压缩与格式化的工具,可实现SQL语句的在线压缩与格式化功能,可运用于对复杂SQL语句的分析或者是程序代码优化上,只是清晰的结构,才能让您更好的优化数据库查询或写入。 关于SQL介绍

    2024年02月03日
    浏览(53)
  • [druid or mybatis] merge sql error, dbType mysql, druid-1.2.12, sql : .

    报这个问题,处理的时候是真的难受了。最终定位到的是自己的mybatis的标签内存在多余的标点 \\\" . \\\" 当时都给尬笑了,还好解决了。

    2024年02月12日
    浏览(45)
  • springboot引入druid解析sql

    一、前言 在开发中,有时我们可能会需要获取SQL中的表名,那么因为不同的数据源类型SQL会存在部分差异,那么我们就可以使用alibaba 的druid包实现不同的数据源类型的sql解析。 二、引入相关maven依赖 三、通过工具类SqlUtils实现对SQL的解析。 三、测试结果 运行结果如下: 大

    2024年02月12日
    浏览(36)
  • 使用Druid解析SQL,获取SQL中所有使用的表

      Druid SQL Parser分三个模块: - Parser - AST - Visitor 1.1 Parser parser是将输入文本转换为ast(抽象语法树),parser有包括两个部分,Parser和Lexer,其中Lexer实现词法分析,Parser实现语法分析。 1.2 AST AST是Abstract Syntax Tree的缩写,也就是抽象语法树。AST是parser输出的结果。这也是语法树

    2024年02月12日
    浏览(42)
  • 数据库连接池Druid

    在 Spring Boot 项目中,数据库连接池已经成为标配,然而,我曾经遇到过不少连接池异常导致业务错误的事故。很多经验丰富的工程师也可能不小心在这方面出现问题。 在这篇文章中,我们将探讨数据库连接池,深入解析其实现机制,以便更好地理解和规避潜在的风险。 假如

    2024年02月05日
    浏览(37)
  • 搞懂Druid之连接获取和归还

    Druid 是阿里开源的数据库连接池,是阿里监控系统 Dragoon 的副产品,提供了强大的可监控性和基于 Filter-Chain 的可扩展性。 本篇文章将对 Druid 数据库连接池的 连接获取 , 归还 和 连接泄漏检测 进行分析。分析 Druid 数据库连接池的源码前,需要明确几个概念。 Druid 数据库连

    2024年02月05日
    浏览(37)
  • 【Druid】Druid连接池泄露问题排查: wait millis 60000, active 50, maxActive 50

    要排查Druid连接池泄漏问题,可以按照以下步骤进行: 检查代码中的连接释放:确保在使用完连接后,及时调用 connection.close() 或相应的释放连接的方法。确保没有遗漏或误释放连接的情况。 检查连接池配置:确认连接池的参数设置是否正确。包括最大连接数、最小空闲连接

    2024年02月16日
    浏览(42)
  • druid之连接空闲超时问题FIX

    彼时的少年站在成长的尽头,回首过去,一路崎岖早已繁花盛开 druid 是一个用于 Java 的高效数据库连接池,它提供了强大的监控和扩展功能。 mysql数据库等待超时时间(wait_timeout)是28800,也就是8小时,而druid连接池参数max-wait是30000 连接空闲超时问题的原因通常与连接池和

    2024年02月08日
    浏览(37)
  • Druid连接池实现数据库加密

    不难发现,以我们现在的开发习惯,无论是公司的项目还是个人的项目,都会选择将源码上传到 Git 服务器(GitHub、Gitee 或是自建服务器),但只要将源码提交到公网服务器就会存在源码泄漏的风险,而数据库配置信息作为源码的一部分,一旦出现源码泄漏,那么数据库中的

    2024年02月13日
    浏览(40)
  • 数据库连接池druid参数详解

    1、type: 数据源类型,这里使用了Druid连接池的类型。 2、url: 数据库连接的URL。 注意事项:需要根据实际情况修改URL。 3、username: 数据库用户名。 4、password: 数据库密码 包含一些特殊字符的时候需要加引号。 5、initialSize: 连接池初始化时创建的连接数。 需要根据实际情况设置

    2024年02月15日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包