java mysql 语句解析器_几种基于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进行监控统计
我们用到的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解析工具的比较与调用相关推荐
- java 解析数据包_一种基于Java语言的网络通讯数据包解析方法与流程
本发明涉及网络通讯领域,特别涉及一种基于Java语言的网络通讯数据包解析方法. 背景技术: 计算机系统和网络的大量普及使用使全球跨入了信息化时代.但是,正由于现代社会中几乎一切都在"计算机化 ...
- java监听微信_一种基于java后台应用监控微信小程序的用户访问量的方法与流程...
本发明涉及java应用与微信小程序应用开发技术领域,具体涉及一种基于java后台应用监控微信小程序的用户访问量的方法. 背景技术: 微信小程序,简称小程序,是一种不需要下载安装即可使用的应用,它实现了 ...
- java 下载加速_一种基于Java的大文件下载加速方法与流程
本发明涉及java/多线程技术领域,涉及一种加速文件下载装置,具体提供一种基于java的大文件下载加速方法. 背景技术: 现有的常用下载方式是基于浏览器的单线程下载.这种单线程下载的方式,是通过htt ...
- java头像交互式差分演变_一种基于交互式差分进化计算的用户知识需求获取方法与流程...
本发明属于知识服务领域,具体涉及一种基于交互式差分进化计算的用户知识需求获取方法. 背景技术: 在多数企业拥有庞大的知识数量和优质的知识资源的情况下,如何利用推送系统将知识主动推送给设计人员以提高企业 ...
- java 上下文加载器_【深入理解Java虚拟机 】线程的上下文类加载器
线程上下文类加载器 线程上下文类加载器( Thread Context ClassLoader) 是从JDK1.2 引入的,类Thread 的getContextClassLoader() 与 set ...
- java while语句打印三角形_小猿圈Java循环嵌套语法的使用介绍
Java是一直被程序员使用的程序之一,而且应用也是最广泛的一个,很多应用中都会用得到,小猿圈java讲师就为你介绍一下Java循环嵌套语法的使用介绍,希望对你有所帮助. 嵌套循环是指在一个循环语句的循 ...
- java 解析器_高性能Java解析器实现过程详解
如果你没有指定数据或语言标准的或开源的Java解析器, 可能经常要用Java实现你自己的数据或语言解析器.或者,可能有很多解析器可选,但是要么太慢,要么太耗内存,或者没有你需要的特定功能.或者开源解析 ...
- ebnf范式_使用Scala基于词法单元的解析器定制EBNF范式文法解析
前言 近期在做Oracle迁移到Spark平台的项目上遇到了一些平台公式翻译为SparkSQL(on Hive)的需求,而Spark采用亲妈语言Scala进行开发.下面是个意外,被论文查重了,移步至我 ...
- java调试生命周期,一种基于JAVA的智能合约生命周期的管理方法与流程
本发明涉及区块链技术,尤其涉及一种基于JAVA的智能合约生命周期的管理方法. 背景技术: 区块链技术,区块链是一种新型去中心化协议,能安全地存储数字货币交易或其他数据,信息不可伪造和篡改,区块链上的交 ...
最新文章
- Spring Cloud(五)断路器监控(Hystrix Dashboard)
- 水很深,我还是下去了
- AngularJS进阶学习
- jQuery的each()方法
- 如何提升微服务的幸福感?
- qt for 3520a
- iReport 5.添加修改删除jdbc
- 天津大学考研计算机专业课的教材,天津大学(专业学位)计算机技术研究生考试科目和考研参考书目...
- Java后端学习路线(校招前准备)
- 《Linux编程》上机作业 ·003【Shell编程】
- AI独角兽商汤科技的内部服务容器化历程
- python—pickle模块的dump与load函数
- top 显示按照内存、CPU排序
- 解决问题:vscode中文乱码(亲测有效)
- java初级程序员学习思路
- word里如何设置目录页码
- 我为什么从外包公司离职了?
- 四年级计算机教学目的,四年级计算机教学计划
- 键盘计算机的区别吗,机械键盘如何选购? 它和普通键盘有什么区别?
- 大数据采集方法有哪些
热门文章
- 质量体系审核中的10大常见场景,你遇到了几个?
- java枚举怎么编译不行的_java枚举类型
- rocketmq 订阅组_必须先理解的RocketMQ入门手册,才能再次深入解读
- pandaboard 安装_linux fb设备(pandaboard) | 学步园
- 【自定义组件】如何引用自定义组件
- 给你的博客换个装-园子换装指南
- 控制元素的div属性
- vue笔记(二)Vue-class与style、事件、计算属性、数据监听、指令+自定义指令、过滤器
- git提交代码时报错:nothing added to commit but untracked files present
- 轻轻松松看懂Spring AOP源码