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日
    浏览(56)
  • [druid or mybatis] merge sql error, dbType mysql, druid-1.2.12, sql : .

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

    2024年02月12日
    浏览(48)
  • 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日
    浏览(43)
  • 数据库连接池Druid

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

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

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

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

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

    2024年02月16日
    浏览(43)
  • 【Java】数据库连接池--Druid

    数据库连接池是一个容器,负责分配、管理数据库连接(Connection) 它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个 释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏 好处: 资源重用 提升系统的响应

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

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

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

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

    2024年02月15日
    浏览(37)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包