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:

  1. mvn install -Dmaven.javadoc.skip=true -Dmaven.test.skip=true

编译后代码目录多出target子目录,里面有class和代码文件的jar包

调用很简单

  1. package parse;
  2.  
  3. import java.util.Iterator;
  4. import java.util.List;
  5. import java.util.Map;
  6. import java.util.Set;
  7.  
  8. import com.alibaba.druid.sql.SQLUtils;
  9. import com.alibaba.druid.sql.ast.SQLStatement;
  10. import com.alibaba.druid.sql.dialect.postgresql.visitor.PGSchemaStatVisitor;
  11. import com.alibaba.druid.stat.TableStat.*;
  12. import com.alibaba.druid.stat.*;
  13. import com.alibaba.druid.util.JdbcConstants;
  14.  
  15. public class testparse {
  16.  
  17. public static void main(String[] args) {
  18.  
  19. String sql= ""
  20. + "insert into tar select * from boss_table bo, ("
  21. + "select a.f1, ff from emp_table a "
  22. + "inner join log_table b "
  23. + "on a.f2 = b.f3"
  24. + ") f "
  25. + "where bo.f4 = f.f5 "
  26. + "group by bo.f6 , f.f7 having count(bo.f8) > 0 "
  27. + "order by bo.f9, f.f10;"
  28. + "select func(f) from test1; "
  29. + "";
  30. String dbType = JdbcConstants.POSTGRESQL;
  31.  
  32. //格式化输出
  33. String result = SQLUtils.format(sql, dbType);
  34. System.out.println(result); // 缺省大写格式
  35. List<SQLStatement> stmtList = SQLUtils.parseStatements(sql, dbType);
  36.  
  37. //解析出的独立语句的个数
  38. System.out.println("size is:" + stmtList.size());
  39. for (int i = 0; i < stmtList.size(); i++) {
  40.  
  41. SQLStatement stmt = stmtList.get(i);
  42.  
  43. PGSchemaStatVisitor visitor = new PGSchemaStatVisitor();
  44. stmt.accept(visitor);
  45. Map<String, String> aliasmap = visitor.getAliasMap();
  46. for (Iterator iterator = aliasmap.keySet().iterator(); iterator.hasNext();) {
  47. String key = iterator.next().toString();
  48. System.out.println("[ALIAS]" + key + " - " + aliasmap.get(key));
  49. }
  50. Set<Column> groupby_col = visitor.getGroupByColumns();
  51. //
  52. for (Iterator iterator = groupby_col.iterator(); iterator.hasNext();) {
  53. Column column = (Column) iterator.next();
  54. System.out.println("[GROUP]" + column.toString());
  55. }
  56. //获取表名称
  57. System.out.println("table names:");
  58. Map<Name, TableStat> tabmap = visitor.getTables();
  59. for (Iterator iterator = tabmap.keySet().iterator(); iterator.hasNext();) {
  60. Name name = (Name) iterator.next();
  61. System.out.println(name.toString() + " - " + tabmap.get(name).toString());
  62. }
  63. //System.out.println("Tables : " + visitor.getCurrentTable());
  64. //获取操作方法名称,依赖于表名称
  65. System.out.println("Manipulation : " + visitor.getTables());
  66. //获取字段名称
  67. System.out.println("fields : " + visitor.getColumns());
  68. }
  69.  
  70. }
  71.  
  72. }

几种基于Java的SQL解析工具的比较与调用的更多相关文章

  1. Java XML Dom解析工具

    Java XML Dom解析工具 缩进等 transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no"); ...

  2. SQL解析工具

    面对复杂的SQL可用这个SQL解析工具,分析出用到了哪些表哪些字段: http://107.170.101.241:8080/getTableColumn/

  3. java 常用的解析工具

    这里介绍两种 java 解析工具. 第一种:java 解析 html 工具 jsoup 第二种: java 解析 XML 工具 Dom4j jsoup jsoup是一个用于处理真实HTML的Java库 ...

  4. Java:JSON解析工具-org.json

    一.简介 org.json是Java常用的Json解析工具,主要提供JSONObject和JSONArray类,现在就各个类的使用解释如下. 二.准备 1.在使用org.json之前,我们应该先从该网 ...

  5. 一种基于Java Swing/HTML/MySQL的汽车租赁系统

    该项目是一个Java的课程作业(大二),主要运用Java.Swing.HTML.MySQL,实现基本的租车逻辑.界面可视化.信息导出.数据存储等功能.实现管理员.用户两种角色登录,并结合Java开发中 ...

  6. 基于JAVA原生HTTP请求工具类 httphelper

    原文地址;http://lushuifa.iteye.com/blog/2313896 import java.io.BufferedReader; import java.io.BufferedWr ...

  7. 推荐Java字节码解析工具classpy

    Classpy Classpy is a GUI tool for investigating Java class file, Lua binary chunk, Wasm binary code, ...

  8. 基于Java的简易表达式解析工具(一)

    最近需要用到相关表达式解析的工具,然后去网上搜索,找到了一个用C#写的表达式解析工具,仔细看了功能后发现,这正是我需要的,如果我能将它改造成基于Java语言的方式,岂不是更好吗,所以花了一段时间,把网 ...

  9. 四种java代码静态检查工具

    [转载]常用 Java 静态代码分析工具的分析与比较 转载自 开源中国社区 http://www.oschina.net/question/129540_23043       1月16日厦门 OSC ...

随机推荐

  1. BZOJ 4003 左偏树

    思路: 用到了左偏树合并复杂度是logn的性质 一开始先BFS一遍 打标记的左偏树 //By SiriusRen #include <cstdio> #include <cstrin ...

  2. 传说用户发来的请求是在JIoEndpoint的accept函数中接收的,是tomact与外界交互的分界点

    传说用户发来的请求是在JIoEndpoint的accept函数中接收的, 这是tomact与外界交互的分界点,所以来研究一下, >>>>>>>>> ...

  3. 数据库SQL Server2012笔记(四)——多表查询、子查询、分页查询、用查询结果创建新表和外连接

    1.多表查询 1)笛卡尔集: select  *  from  表名1,表名2 select  *  from  表名1.表名2  where   表名1.字段名=表名2.字段名 注: 若有两张表有同 ...

  4. 内网使用 IPV6 之 Chrome 浏览器 扩展程序 篇

    手机端的 Google Chrome 浏览器在打开 "流量节省程序"后,它会通过 Google 的服务器中转流量,这台服务器支持 IPV4 和 IPV6.想在PC端使用类似的&qu ...

  5. POJ 3051 DFS

    题意:判断连通块大小 水题 //By SiriusRen #include <cstdio> #include <cstring> #include <algorithm ...

  6. js全局的解析与执行过程

    先看下面实例的执行结果: alert(a);//undefined alert(b);//报错 alert(f);//输出f函数字符串 alert(g);//undefined var a = 1; ...

  7. C#List<string>和string[]之间的相互转换

     一.LIST概述 所属命名空间:System.Collections.Generic      public class List<T> : IList<T>, IColle ...

  8. 使用Vue动态生成form表单

    form-create 表单生成器 具有数据收集.校验和提交功能的表单生成器,支持双向数据绑定和事件扩展,组件包含有复选框.单选框.输入框.下拉选择框等表单元素以及省市区三级联动,时间选择,日期选择, ...

  9. wget 指令学习之递归抓取文档技巧

    在线上阅读文档的时候,有没有想将它抓取到本地,以备没有网的时候阅读只需? 先上指令: $ wget --user-agent="Mozilla/5.0 (X11; Linux x86_64) ...

  10. shell项目-告警系统

    告警系统 1. 告警系统需求分析 需求:使用shell定制各种个性化告警工具,但需要统一化管理.规范化管理. 思路:指定一个脚本包,包含主程序.子程序.配置文件.邮件引擎.输出日志等. 主程序:作为整 ...