当前位置: 首页 > news >正文

springboot引入druid解析sql

一、前言
在开发中,有时我们可能会需要获取SQL中的表名,那么因为不同的数据源类型SQL会存在部分差异,那么我们就可以使用alibaba 的druid包实现不同的数据源类型的sql解析。

二、引入相关maven依赖

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

三、通过工具类SqlUtils实现对SQL的解析。

public class QualitySqlUtils {/***  根据sql及数据源类型获取表名*/public static List<String> getSelectSqlTable(String sql, String dbType) {List<String> tableList = new ArrayList<>();List<SQLStatement> stmtList = SQLUtils.parseStatements(sql, dbType);SchemaStatVisitor visitor;for (SQLStatement sqlStatement : stmtList) {if (DbType.mysql.name().equalsIgnoreCase(dbType)) {visitor = new MySqlSchemaStatVisitor();} else if (DbType.hive.name().equalsIgnoreCase(dbType)) {visitor = new HiveSchemaStatVisitor();} else if (DbType.postgresql.name().equalsIgnoreCase(dbType)) {visitor = new PGSchemaStatVisitor();} else if (DbType.oracle.name().equalsIgnoreCase(dbType)) {visitor = new OracleSchemaStatVisitor();} else {visitor = new SchemaStatVisitor(DbType.of(dbType));}sqlStatement.accept(visitor);Map<TableStat.Name, TableStat> tables = visitor.getTables();for (Map.Entry<TableStat.Name, TableStat> entry: tables.entrySet()){String value = entry.getValue().toString();if (StringUtils.isNotBlank(value)) {tableList.add(entry.getKey().getName());}}}return tableList;}/*** 根据sql获取查询的字段*/public static Map<String, String> getSelectSqlColumn(String sql, String dbType) {Map<String, String> columnMap = new HashMap<>();List<SQLStatement> stmtList = SQLUtils.parseStatements(sql, dbType);for (int i = 0; i < stmtList.size(); i++) {SQLStatement stmt = stmtList.get(i);if (stmt instanceof SQLSelectStatement) {SQLSelectStatement sqlSelectStatement = (SQLSelectStatement) stmt;SQLSelect select = sqlSelectStatement.getSelect();SQLSelectQueryBlock query = (SQLSelectQueryBlock) select.getQuery();List<SQLSelectItem> selectList = query.getSelectList();selectList.forEach(item->{columnMap.put(item.getExpr().toString(), item.getAlias());});}}return columnMap;}
}

三、测试结果

public class testDemo{public static void main(String[] args) {String sql = "select t.* from table1 as t left join table2 t2 on t.id = t2.id";List<String> tableList =getSelectSqlTable(sql, "mysql");System.out.println("获取到的表名: "+tableList);}
}

运行结果如下:

在这里插入图片描述
大家感兴趣可以尝试下。

http://www.lryc.cn/news/133415.html

相关文章:

  • 学习笔记十九:Pod常见的状态和重启策略
  • Spring的ApplicationEvent简单使用
  • python程序员面试题之:set vs tuple vs list vs dict
  • STM32 F103C8T6学习笔记11:RTC实时时钟—OLED手表日历
  • 无法将“环境变量”项识别为 cmdlet、函数、脚本文件或可运行程序的名称(pycharm)
  • 基于图像链接的批量下载
  • mongodb使用心得
  • 学习Vue:响应式原理与性能优化策略
  • 神经网络基础-神经网络补充概念-43-梯度下降法
  • Reids之Set类型解读
  • 【网络基础】数据链路层
  • 云计算|OpenStack|使用VMware安装华为云的R006版CNA和VRM---初步使用(二)
  • Python typing函式庫和torch.types
  • UE5 编程规范
  • 交互消息式IMessage扩展开发记录
  • 软件团队降本增效-建立需求评估体系
  • npm yarn pnpm 命令集
  • python 开发环境(PyCharm)搭建指南
  • springboot里 运用 easyexcel 导出
  • 一“码”当先,PR大征集!2023 和RT-Thread一起赋能开源!
  • jmeter模拟多用户并发
  • 澎峰科技|邀您关注2023 RISC-V中国峰会!
  • 【系统架构】系统架构设计之数据同步策略
  • Linux内核学习笔记——ACPI命名空间
  • 使用 OpenCV Python 实现自动图像注释工具的详细步骤--附完整源码
  • RunnerGo中WebSocket、Dubbo、TCP/IP三种协议接口测试详解
  • 【Java 动态数据统计图】动态数据统计思路案例(动态,排序,数组)一(112)
  • kafka踩坑
  • 让你专注于工作的电脑桌面日程提醒软件
  • 62页智慧产业园区数字化综合解决方案PPT