1、sqlparser

http://www.sqlparser.com/

优点:支持的数据库最多,除了传统数据库外还支持hive和greenplum一类比较新的数据库,调用比较方便,功能不错

缺点:收费,500$起

2、Apache Calcite

一个构建JDBC或者ODBC访问数据库的框架,通过自定义一些adapter通过sql访问任意类型的数据

优点:开源

缺点:sql解析只是一小部分功能,且只支持通用的文法树,无法对不同数据库提供本地化支持

3、druid

阿里的一个开源项目,其实是个JDBC,但是可以通过这个JDBC统计通过它提交的各种sql执行情况等信息,对提交sql进行监控统计

我们用到的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包

调用很简单

1 packageparse;2

3 importjava.util.Iterator;4 importjava.util.List;5 importjava.util.Map;6 importjava.util.Set;7

8 importcom.alibaba.druid.sql.SQLUtils;9 importcom.alibaba.druid.sql.ast.SQLStatement;10 importcom.alibaba.druid.sql.dialect.postgresql.visitor.PGSchemaStatVisitor;11 import com.alibaba.druid.stat.TableStat.*;12 import com.alibaba.druid.stat.*;

14 importcom.alibaba.druid.util.JdbcConstants;15

16

17 public classtestparse {18

19 public static voidmain(String[] args) {20

21 String sql= ""

22 + "insert into tar select * from boss_table bo, ("

23 + "select a.f1, ff from emp_table a "

24 + "inner join log_table b "

25 + "on a.f2 = b.f3"

26 + ") f "

27 + "where bo.f4 = f.f5 "

28 + "group by bo.f6 , f.f7 having count(bo.f8) > 0 "

29 + "order by bo.f9, f.f10;"

30 + "select func(f) from test1; "

31 + "";32 String dbType =JdbcConstants.POSTGRESQL;33

34 //格式化输出

35 String result =SQLUtils.format(sql, dbType);36 System.out.println(result); //缺省大写格式

37 List stmtList =SQLUtils.parseStatements(sql, dbType);38

39 //解析出的独立语句的个数

40 System.out.println("size is:" +stmtList.size());41 for (int i = 0; i < stmtList.size(); i++) {42

43 SQLStatement stmt =stmtList.get(i);44

45 PGSchemaStatVisitor visitor = newPGSchemaStatVisitor();46 stmt.accept(visitor);47 Map aliasmap =visitor.getAliasMap();48 for (Iterator iterator =aliasmap.keySet().iterator(); iterator.hasNext();) {49 String key =iterator.next().toString();50 System.out.println("[ALIAS]" + key + " - " +aliasmap.get(key));51 }52 Set groupby_col =visitor.getGroupByColumns();53 //54 for (Iterator iterator =groupby_col.iterator(); iterator.hasNext();) {55 Column column =(Column) iterator.next();56 System.out.println("[GROUP]" +column.toString());57 }58 //获取表名称

59 System.out.println("table names:");60 Map tabmap =visitor.getTables();61 for (Iterator iterator =tabmap.keySet().iterator(); iterator.hasNext();) {62 Name name =(Name) iterator.next();63 System.out.println(name.toString() + " - " +tabmap.get(name).toString());64 }65 //System.out.println("Tables : " + visitor.getCurrentTable());66 //获取操作方法名称,依赖于表名称

67 System.out.println("Manipulation : " +visitor.getTables());68 //获取字段名称

69 System.out.println("fields : " +visitor.getColumns());70 }71

72 }73

74 }

java mysql 语句解析器_几种基于Java的SQL解析工具的比较与调用相关推荐

  1. java 解析数据包_一种基于Java语言的网络通讯数据包解析方法与流程

    本发明涉及网络通讯领域,特别涉及一种基于Java语言的网络通讯数据包解析方法. 背景技术: 计算机系统和网络的大量普及使用使全球跨入了信息化时代.但是,正由于现代社会中几乎一切都在"计算机化 ...

  2. java监听微信_一种基于java后台应用监控微信小程序的用户访问量的方法与流程...

    本发明涉及java应用与微信小程序应用开发技术领域,具体涉及一种基于java后台应用监控微信小程序的用户访问量的方法. 背景技术: 微信小程序,简称小程序,是一种不需要下载安装即可使用的应用,它实现了 ...

  3. java 下载加速_一种基于Java的大文件下载加速方法与流程

    本发明涉及java/多线程技术领域,涉及一种加速文件下载装置,具体提供一种基于java的大文件下载加速方法. 背景技术: 现有的常用下载方式是基于浏览器的单线程下载.这种单线程下载的方式,是通过htt ...

  4. java头像交互式差分演变_一种基于交互式差分进化计算的用户知识需求获取方法与流程...

    本发明属于知识服务领域,具体涉及一种基于交互式差分进化计算的用户知识需求获取方法. 背景技术: 在多数企业拥有庞大的知识数量和优质的知识资源的情况下,如何利用推送系统将知识主动推送给设计人员以提高企业 ...

  5. java 上下文加载器_【深入理解Java虚拟机 】线程的上下文类加载器

    线程上下文类加载器 线程上下文类加载器( Thread Context ClassLoader) 是从JDK1.2 引入的,类Thread 的getContextClassLoader() 与 set ...

  6. java while语句打印三角形_小猿圈Java循环嵌套语法的使用介绍

    Java是一直被程序员使用的程序之一,而且应用也是最广泛的一个,很多应用中都会用得到,小猿圈java讲师就为你介绍一下Java循环嵌套语法的使用介绍,希望对你有所帮助. 嵌套循环是指在一个循环语句的循 ...

  7. java 解析器_高性能Java解析器实现过程详解

    如果你没有指定数据或语言标准的或开源的Java解析器, 可能经常要用Java实现你自己的数据或语言解析器.或者,可能有很多解析器可选,但是要么太慢,要么太耗内存,或者没有你需要的特定功能.或者开源解析 ...

  8. ebnf范式_使用Scala基于词法单元的解析器定制EBNF范式文法解析

    前言 近期在做Oracle迁移到Spark平台的项目上遇到了一些平台公式翻译为SparkSQL(on Hive)的需求,而Spark采用亲妈语言Scala进行开发.下面是个意外,被论文查重了,移步至我 ...

  9. java调试生命周期,一种基于JAVA的智能合约生命周期的管理方法与流程

    本发明涉及区块链技术,尤其涉及一种基于JAVA的智能合约生命周期的管理方法. 背景技术: 区块链技术,区块链是一种新型去中心化协议,能安全地存储数字货币交易或其他数据,信息不可伪造和篡改,区块链上的交 ...

最新文章

  1. Spring Cloud(五)断路器监控(Hystrix Dashboard)
  2. 水很深,我还是下去了
  3. AngularJS进阶学习
  4. jQuery的each()方法
  5. 如何提升微服务的幸福感?
  6. qt for 3520a
  7. iReport 5.添加修改删除jdbc
  8. 天津大学考研计算机专业课的教材,天津大学(专业学位)计算机技术研究生考试科目和考研参考书目...
  9. Java后端学习路线(校招前准备)
  10. 《Linux编程》上机作业 ·003【Shell编程】
  11. AI独角兽商汤科技的内部服务容器化历程
  12. python—pickle模块的dump与load函数
  13. top 显示按照内存、CPU排序
  14. 解决问题:vscode中文乱码(亲测有效)
  15. java初级程序员学习思路
  16. word里如何设置目录页码
  17. 我为什么从外包公司离职了?
  18. 四年级计算机教学目的,四年级计算机教学计划
  19. 键盘计算机的区别吗,机械键盘如何选购? 它和普通键盘有什么区别?
  20. 大数据采集方法有哪些

热门文章

  1. 质量体系审核中的10大常见场景,你遇到了几个?
  2. java枚举怎么编译不行的_java枚举类型
  3. rocketmq 订阅组_必须先理解的RocketMQ入门手册,才能再次深入解读
  4. pandaboard 安装_linux fb设备(pandaboard) | 学步园
  5. 【自定义组件】如何引用自定义组件
  6. 给你的博客换个装-园子换装指南
  7. 控制元素的div属性
  8. vue笔记(二)Vue-class与style、事件、计算属性、数据监听、指令+自定义指令、过滤器
  9. git提交代码时报错:nothing added to commit but untracked files present
  10. 轻轻松松看懂Spring AOP源码