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

2024-01-16 06:04

本文主要是介绍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) {// 使用::将数值转为varchartry {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将数值转为varchartry {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的场景不支持,会导致解析报错。可以使用以下方法解决:

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

这篇关于Druid连接池工具公式化SQL附踩坑记录的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/611535

相关文章

MySQL中删除重复数据SQL的三种写法

《MySQL中删除重复数据SQL的三种写法》:本文主要介绍MySQL中删除重复数据SQL的三种写法,文中通过代码示例讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下... 目录方法一:使用 left join + 子查询删除重复数据(推荐)方法二:创建临时表(需分多步执行,逻辑清晰,但会

Mysql 中的多表连接和连接类型详解

《Mysql中的多表连接和连接类型详解》这篇文章详细介绍了MySQL中的多表连接及其各种类型,包括内连接、左连接、右连接、全外连接、自连接和交叉连接,通过这些连接方式,可以将分散在不同表中的相关数据... 目录什么是多表连接?1. 内连接(INNER JOIN)2. 左连接(LEFT JOIN 或 LEFT

Python pyinstaller实现图形化打包工具

《Pythonpyinstaller实现图形化打包工具》:本文主要介绍一个使用PythonPYQT5制作的关于pyinstaller打包工具,代替传统的cmd黑窗口模式打包页面,实现更快捷方便的... 目录1.简介2.运行效果3.相关源码1.简介一个使用python PYQT5制作的关于pyinstall

mysql重置root密码的完整步骤(适用于5.7和8.0)

《mysql重置root密码的完整步骤(适用于5.7和8.0)》:本文主要介绍mysql重置root密码的完整步骤,文中描述了如何停止MySQL服务、以管理员身份打开命令行、替换配置文件路径、修改... 目录第一步:先停止mysql服务,一定要停止!方式一:通过命令行关闭mysql服务方式二:通过服务项关闭

Servlet中配置和使用过滤器的步骤记录

《Servlet中配置和使用过滤器的步骤记录》:本文主要介绍在Servlet中配置和使用过滤器的方法,包括创建过滤器类、配置过滤器以及在Web应用中使用过滤器等步骤,文中通过代码介绍的非常详细,需... 目录创建过滤器类配置过滤器使用过滤器总结在Servlet中配置和使用过滤器主要包括创建过滤器类、配置过滤

SQL Server数据库磁盘满了的解决办法

《SQLServer数据库磁盘满了的解决办法》系统再正常运行,我还在操作中,突然发现接口报错,后续所有接口都报错了,一查日志发现说是数据库磁盘满了,所以本文记录了SQLServer数据库磁盘满了的解... 目录问题解决方法删除数据库日志设置数据库日志大小问题今http://www.chinasem.cn天发

mysql主从及遇到的问题解决

《mysql主从及遇到的问题解决》本文详细介绍了如何使用Docker配置MySQL主从复制,首先创建了两个文件夹并分别配置了`my.cnf`文件,通过执行脚本启动容器并配置好主从关系,文中还提到了一些... 目录mysql主从及遇到问题解决遇到的问题说明总结mysql主从及遇到问题解决1.基于mysql

使用Python制作一个PDF批量加密工具

《使用Python制作一个PDF批量加密工具》PDF批量加密‌是一种保护PDF文件安全性的方法,通过为多个PDF文件设置相同的密码,防止未经授权的用户访问这些文件,下面我们来看看如何使用Python制... 目录1.简介2.运行效果3.相关源码1.简介一个python写的PDF批量加密工具。PDF批量加密

正则表达式高级应用与性能优化记录

《正则表达式高级应用与性能优化记录》本文介绍了正则表达式的高级应用和性能优化技巧,包括文本拆分、合并、XML/HTML解析、数据分析、以及性能优化方法,通过这些技巧,可以更高效地利用正则表达式进行复杂... 目录第6章:正则表达式的高级应用6.1 模式匹配与文本处理6.1.1 文本拆分6.1.2 文本合并6

MySQL的索引失效的原因实例及解决方案

《MySQL的索引失效的原因实例及解决方案》这篇文章主要讨论了MySQL索引失效的常见原因及其解决方案,它涵盖了数据类型不匹配、隐式转换、函数或表达式、范围查询、LIKE查询、OR条件、全表扫描、索引... 目录1. 数据类型不匹配2. 隐式转换3. 函数或表达式4. 范围查询之后的列5. like 查询6