几种基于Java的SQL解析工具的比较与调用
1、sqlparser
http://www.sqlparser.com/
优点:支持的数据库最多,除了传统数据库外还支持hive和greenplum一类比较新的数据库,调用比较方便,功能不错
缺点:收费,500$起
2、Apache Calcite
一个构建JDBC或者ODBC访问数据库的框架,通过自定义一些adapter通过sql访问任意类型的数据
优点:开源
缺点:sql解析只是一小部分功能,且只支持通用的文法树,无法对不同数据库提供本地化支持
3、druid
阿里的一个开源项目,其实是个JDBC,但是可以通过这个JDBC统计通过它提交的各种sql执行情况等信息,对提交sql进行监控统计
主页:https://github.com/alibaba/druid
我们用到的SQL-Parser是它的一个组件:
https://github.com/alibaba/druid/wiki/SQL-Parser
支持数据库不算少:
db2
mysql
odps
oracle
phoenix
postgresql
sqlserver
transact
不过部分语法支持还处于开发中,比如,不支持解析postgresql的begin/commit语法,不支持group by 1, 2这种指定字段的语法。。。-_||
编译:
一开始懒得安装maven使用javac编译,结果出了一堆代码中包含的中文编码问题,花时间研究编码不如乖乖下载安装maven……-_-
在源码根目录下直接执行mvn:
mvn install -Dmaven.javadoc.skip=true -Dmaven.test.skip=true
编译后代码目录多出target子目录,里面有class和代码文件的jar包
调用很简单
package parse; import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set; import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.sql.ast.SQLStatement;
import com.alibaba.druid.sql.dialect.postgresql.visitor.PGSchemaStatVisitor;
import com.alibaba.druid.stat.TableStat.*;
import com.alibaba.druid.stat.*;
import com.alibaba.druid.util.JdbcConstants; public class testparse { public static void main(String[] args) { String sql= ""
+ "insert into tar select * from boss_table bo, ("
+ "select a.f1, ff from emp_table a "
+ "inner join log_table b "
+ "on a.f2 = b.f3"
+ ") f "
+ "where bo.f4 = f.f5 "
+ "group by bo.f6 , f.f7 having count(bo.f8) > 0 "
+ "order by bo.f9, f.f10;"
+ "select func(f) from test1; "
+ "";
String dbType = JdbcConstants.POSTGRESQL; //格式化输出
String result = SQLUtils.format(sql, dbType);
System.out.println(result); // 缺省大写格式
List<SQLStatement> stmtList = SQLUtils.parseStatements(sql, dbType); //解析出的独立语句的个数
System.out.println("size is:" + stmtList.size());
for (int i = 0; i < stmtList.size(); i++) { SQLStatement stmt = stmtList.get(i); PGSchemaStatVisitor visitor = new PGSchemaStatVisitor();
stmt.accept(visitor);
Map<String, String> aliasmap = visitor.getAliasMap();
for (Iterator iterator = aliasmap.keySet().iterator(); iterator.hasNext();) {
String key = iterator.next().toString();
System.out.println("[ALIAS]" + key + " - " + aliasmap.get(key));
}
Set<Column> groupby_col = visitor.getGroupByColumns();
//
for (Iterator iterator = groupby_col.iterator(); iterator.hasNext();) {
Column column = (Column) iterator.next();
System.out.println("[GROUP]" + column.toString());
}
//获取表名称
System.out.println("table names:");
Map<Name, TableStat> tabmap = visitor.getTables();
for (Iterator iterator = tabmap.keySet().iterator(); iterator.hasNext();) {
Name name = (Name) iterator.next();
System.out.println(name.toString() + " - " + tabmap.get(name).toString());
}
//System.out.println("Tables : " + visitor.getCurrentTable());
//获取操作方法名称,依赖于表名称
System.out.println("Manipulation : " + visitor.getTables());
//获取字段名称
System.out.println("fields : " + visitor.getColumns());
} } }
几种基于Java的SQL解析工具的比较与调用的更多相关文章
- Java XML Dom解析工具
Java XML Dom解析工具 缩进等 transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no"); ...
- SQL解析工具
面对复杂的SQL可用这个SQL解析工具,分析出用到了哪些表哪些字段: http://107.170.101.241:8080/getTableColumn/
- java 常用的解析工具
这里介绍两种 java 解析工具. 第一种:java 解析 html 工具 jsoup 第二种: java 解析 XML 工具 Dom4j jsoup jsoup是一个用于处理真实HTML的Java库 ...
- Java:JSON解析工具-org.json
一.简介 org.json是Java常用的Json解析工具,主要提供JSONObject和JSONArray类,现在就各个类的使用解释如下. 二.准备 1.在使用org.json之前,我们应该先从该网 ...
- 一种基于Java Swing/HTML/MySQL的汽车租赁系统
该项目是一个Java的课程作业(大二),主要运用Java.Swing.HTML.MySQL,实现基本的租车逻辑.界面可视化.信息导出.数据存储等功能.实现管理员.用户两种角色登录,并结合Java开发中 ...
- 基于JAVA原生HTTP请求工具类 httphelper
原文地址;http://lushuifa.iteye.com/blog/2313896 import java.io.BufferedReader; import java.io.BufferedWr ...
- 推荐Java字节码解析工具classpy
Classpy Classpy is a GUI tool for investigating Java class file, Lua binary chunk, Wasm binary code, ...
- 基于Java的简易表达式解析工具(一)
最近需要用到相关表达式解析的工具,然后去网上搜索,找到了一个用C#写的表达式解析工具,仔细看了功能后发现,这正是我需要的,如果我能将它改造成基于Java语言的方式,岂不是更好吗,所以花了一段时间,把网 ...
- 四种java代码静态检查工具
[转载]常用 Java 静态代码分析工具的分析与比较 转载自 开源中国社区 http://www.oschina.net/question/129540_23043 1月16日厦门 OSC ...
随机推荐
- 利用CORS实现跨域请求--转
原文地址:http://newhtml.net/using-cors/ 跨域请求一直是网页编程中的一个难题,在过去,绝大多数人都倾向于使用JSONP来解决这一问题.不过现在,我们可以考虑一下W3C中一 ...
- 内联函数(Inline Functions)
影响性能的一个重要因素是内联技巧.内联函数也可称为内嵌函数. 在C++中,函数调用需要建立栈环境,进行参数复制,保护调用现场,返回时,还要进行返回值复制,恢复调用现场.这些工作都是与完成特定任务的操作 ...
- WISP > Client+AP > WDS 的区别
最直白易懂的分别:WISP > Client+AP > WDS WISP,真正万能,兼容任何厂牌的上级AP,毋须设置上级AP,不受上级AP的信道影响,自由DHCP,所带机器或设备的IP,上 ...
- Django transaction 误用之后遇到的一个问题与解决方法
今天在调试项目开发好的一个模块的时候,发现了一个很诡异的现象,最后追踪发现是因为在项目中事务处理有误所致.这个问题坑了我好一会,所以记录一下,以免再踩坑.下面开始详述. 我们都知道 Django 框架 ...
- tcpg通信
1.客户端 from socket import * def main(): # 创建套接字 tcp_socket = socket(AF_INET,SOCK_STREAM) # 链接服务端 ip = ...
- Python中import和from的一些事。。。
摘自python学习手册, 用于记录. 客户端可以执行import或from语句.如果模块还没有加载,这两个语句会去搜索.编译以及执行模块文件程序.主要差别在于,import会读取整个模块,所以必须进 ...
- 数据库更新DATE类型的时间
使用to_date() 进行格式转换 to_date('2018/11/16','yyyy/MM/dd') update tableName t set t.shipment_date = to_da ...
- 代码正常,junit却报错原因及解决方法
junit测试,不能有参数 和static,去掉static测试正常;
- Spring MVC 转发和重定向
本文介绍Spring MVC中转发和重定向的区别. 转发和重定向 开始Java EE时,可能会对转发(forward)和重定向(redirect)这个两个概念不清楚.本文先通过代码实例和运行结果图片感 ...
- 实际运用中DataSet、DataTable、DataRow点滴
DataSet.DataTable都自带有序列化标记,但是DataRow没有, 所以如果是在CS程序中,Release版本程序DataTable才是最小的数据传输单元,如果使用DataRow则会报[未 ...