几种基于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 ...
随机推荐
- Firefox 浏览器添加Linux jre插件
在安装 Java 平台时,Java 插件文件将作为该安装的一部分包含在内.要在 Firefox 中使用 Java,您需要从该发行版中的插件文件手动创建符号链接指向 Firefox 预期的其中一个位置. ...
- element-ui表格控件前端分页方法
<div id="app"> <el-table :data="tableData.slice((currentPage-1)*pageSize,cur ...
- Centos6.5 安装lnmp环境
最近项目要配置在nginx上,所以搜索了下具体nginx的安装,看到这篇文章简洁明了而且测试成功就借用了,作品出处:http://www.cnblogs.com/xiaoit/p/3991037.ht ...
- kettle(一)概述
近期两个月一直和kettle打交道,从開始的没听说过,到如今能够熟练运用,不得不说项目驱动下,学习东西是最快的.好了,尽管使用kettle应付项目的任务绰绰有余.可是还是想系统的学习一下,总结一下.比 ...
- C#变量的作用域
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 【基础篇】EditText的一些属性设置
设置EditText的背景颜色 private test_editText=null; test_editText= (EditText) findViewById(R.id.EditTextInp ...
- STANDBY REDO LOG
SRL Introduce 从">ORACLE9i开始,出现了Standby Redo Logs(SRL),9.1开始只有">physical standby支持SRL ...
- BZOJ4712: 洪水(树链剖分维护Dp)
Description 小A走到一个山脚下,准备给自己造一个小屋.这时候,小A的朋友(op,又叫管理员)打开了创造模式,然后飞到 山顶放了格水.于是小A面前出现了一个瀑布.作为平民的小A只好老实巴交地 ...
- Input/output subsystem having an integrated advanced programmable interrupt controller for use in a personal computer
A computer system is described having one or more host processors, a host chipset and an input/outpu ...
- Resource Access Based on Multiple Credentials
A collection of multiple user credentials each associated with one of multiple different users is ob ...