工具集

工具集

1.Guava

Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库,例如:集合 [collections] 、缓存 [caching] 、 原生类型支持 [primitives support] 、并发库 [concurrency libraries]、通用注解 [common annotations] 、 字符串处理 [string processing] 、I/O 等等。 所有这些工具每天都在被Google的工程师应用在产品服务中。

2.hutool

不多说,最常用的工具集。 官网:https://hutool.cn/

  • hutool-aop:JDK 动态代理封装,提供非 IOC 下的切面支持
  • hutool-bloomFilter:布隆过滤,提供一些 Hash 算法的布隆过滤
  • hutool-cache:简单缓存实现
  • hutool-core:核心,包括 Bean 操作、日期、各种 Util 等
  • hutool-cron:定时任务模块,提供类 Crontab 表达式的定时任务
  • hutool-crypto:加密解密模块,提供对称、非对称和摘要算法封装
  • hutool-db:JDBC 封装后的数据操作,基于 ActiveRecord 思想
  • hutool-dfa:基于 DFA 模型的多关键字查找
  • hutool-extra:扩展模块,对第三方封装(模板引擎、邮件、Servlet、二维码、Emoji、FTP、分词等)
  • hutool-http:基于 HttpUrlConnection 的 Http 客户端封装
  • hutool-log:自动识别日志实现的日志门面
  • hutool-script:脚本执行封装,例如 Javascript
  • hutool-setting:功能更强大的 Setting 配置文件和 Properties 封装
  • hutool-system:系统参数调用封装(JVM 信息等)
  • hutool-json:JSON 实现
  • hutool-captcha:图片验证码实现
  • hutool-poi:针对 POI 中 Excel 和 Word 的封装
  • hutool-socket:基于 Java 的 NIO 和 AIO 的 Socket 封装
  • hutool-jwt:JSON Web Token (JWT) 封装实现

3.jodd

官网:https://jodd.org/

  • Jodd集合了Apache的Commons工具包(Lang,IO,BeanUtils,Codec,Email)中的核心功能
  • MVC、IOC/DI、ORM统统使用自有解决方案(想想Spring)
  • 加上简化而优雅的Http处理类(流式调用,媲美基于HttpClient的HCFluent)
  • 类似JQuery般操作HTML的Jerry,媲美Joda的JDataTime,
  • 定义了自己的Prop类用于管理属性

总之,Jodd = tools + ioc + mvc + db + aop + tx + json + html < 1.7 Mb

富文本编辑器

目前绝大部分富文本编辑器都是纯前端组件。FCKEditor是少数几个前后端结合的富文本编辑器

1.FCKEditor

FCKEditor 现在已经重新开发,并改名为 CKEditor。

FCKeditor是一个专门使用在网页上属于开放源代码的所见即所得文字编辑器。它志于轻量化,不需要太复杂的安装步骤即可使用。 它可和PHP、JavaScript、ASP、ASP.NET、ColdFusion、Java、以及ABAP等不同的编程语言相结合。 FCKeditor 是这个编辑器的作者的名字Frederico Caldeira Knabben的缩写。

FCKeditor 相容于绝大部分的网页浏览器,像是 : Internet Explorer 5.5+(Windows)、Mozilla Firefox 1.0+、Mozilla 1.3+ 、Netscape 7+以及Opera浏览器。

FCKeditor的安装非常容易!最新版本可以在这里下载!所见即所得编辑器是很容易使用的工具!

CKEditor 是新一代的 FCKeditor,是一个重新开发的版本。CKEditor是全球最优秀的网页在线文字编辑器之一,因其惊人的性能与可扩展性而广泛的被运用于各大网站。

图表

1.jFreeChart

java后端图表工具。 官网;http://www.jfree.org/

表达式引擎

1.数学计算公式表达式

  • Aviator。Google开源的轻量级的Java表达式求值引擎。支持支持算术运算、逻辑运算、正则表达式、函数调用
  • Jep:比较老的工具包,主要用于数学计算,最后一次更新是在2005年,但是常见的数据计算都是没有问题的
  • Fast EL:
    • Fel是轻量级的高效的表达式计算引擎(国产的工具)。
    • Fel在源自于企业项目,设计目标是为了满足不断变化的功能需求和性能需求。
    • Fel是开放的,引擎执行中的多个模块都可以扩展或替换。Fel的执行主要是通过函数实现,运算符(+、-等都是Fel函数),所有这些函数都是可以替换的,扩展函数也非常简单。
    • Fel有双引擎,同时支持解释执行和编译执行。可以根据性能要求选择执行方式。编译执行就是将表达式编译成字节码(生成java代码和编译模块都是可以扩展和替换的)
    • Fel基于Java1.5开发,适用于Java1.5及以上版本。
    • 项目地址:http://code.google.com/p/fast-el/(推荐看这个)
    • 下 载:http://fast-el.googlecode.com/files/fel-all-0.7.jar
    • 性能测试:http://code.google.com/p/fast-el/wiki/Performance
  • jeval:官网:http://www.oschina.net/p/jeval
  • ik-expression(国产): https://code.google.com/p/ik-expression/
  • ExpressionJ:http://sourceforge.net/projects/expressionj/
  • expression-analyzer(国产):http://www.oschina.net/p/expression-analyzer
  • BeanShell: http://www.beanshell.org/download.html
  • Spads(国产):此人看样子比较牛,在CSDN、OSChina、ITeye上均有发布,支持乘方^和阶乘!运算,很实用。使用教程:http://blog.csdn.net/shanelooli/article/details/8142726
  • JDK:从JDK1.6开始,默认加入了javax.script包,如果不想引入第三方包,也可以使用这个。

2.OGNL

表达式引擎–OGNL

OGNL (Object Graph Navigation Language 对象-图形导航语言) 是一个开源的表达式引擎,可以通过表达式存取Java对象树中的任意属性和调用Java对象树的方法等。

OGNL中有三个个重要的概念:

  1. 表达式:具体的执行逻辑,支持对象属性的读写、简单的数学运算、调用对象方法、调用Java静态类方法等操作。
  2. root:在整个ognl中位于栈顶的对象。直接使用字段名称获得字段值。通常作为被读写的对象,
  3. context:上下文对象,map类型,需要使用 "#"获得其中的字段。通常存储变量,用来操作root对象。
@Test
public void test01() throws OgnlException {
    // 从Root对象中进行表达式计算并获取结果
    Object name = Ognl.getValue(Ognl.parseExpression("name"), user);
    System.out.println(name.toString());
}

@Test
public void test02() throws OgnlException {
    // 从上下文环境中进行表达式计算并获取结果
    Object contextValue = Ognl.getValue(Ognl.parseExpression("#introduction"), context, user);
    System.out.println(contextValue);
}

安全性:著名的Struts的远程执行漏洞,就是利用了OGNL表达式实现的,所以使用必须慎重。

2.EL表达式

EL表达式(Expression Language)是一种用于在Java Web应用中访问和操作数据的简化表达式语言。它最初是为JSP(JavaServer Pages)开发的,但后来也被广泛应用于其他基于Java的Web框架。

主要作用包括:

  • 获取数据:EL表达式可以从各种类型的web域中检索Java对象、获取数据。它定义了一些隐式对象,使得web开发人员可以轻松地获取对web常用对象的引用,从而获得这些对象中的数据。
  • 访问对象的属性值:假设有一个名为user的JavaBean,其中包含一个属性name,我们可以使用EL表达式${user.name}来获取user对象的name属性的值。
  • 调用Java方法:EL表达式允许用户开发自定义EL函数,以在JSP页面中通过EL表达式调用Java类的方法。
  • 执行算术运算:EL表达式支持常见的算术运算,如加法、减法、乘法和除法。
  • 对集合进行操作:例如,可以使用jsp标签与EL表达式结合,对集合进行迭代操作。

语法:使用${}包裹,其中${}内部可以是一个表达式或者变量名。例如,${user.name}表示取得名为"user"对象的"name"属性的值。

3.SpEL表达式

SpEL(Spring Expression Language)是Spring框架提供的功能强大的表达式语言,支持在运行时查询和操作对象图。本质就是EL表达式。

二维码

拼音

  • 官网:http://pinyin4j.sourceforge.net/

图片处理

Java中进行图像I/O(即读图片和写图片,不涉及到复杂图像处理)有三个方法:

  1. Java Image I/O API,支持常见图片,从Java 2 version 1.4.0开始就内置了。
    • 主页:http://java.sun.com/javase/6/docs/technotes/guides/imageio/index.html
  2. JAI 中的 Image I/O Tools,支持更多图片类型,例如JPEG-LS, JPEG2000, 和 TIFF。是Oracle提供的一个Java扩展。
    • JAI 是一个关于图像处理的框架,很庞大,其中仅仅jai-imageio是关于图像I/O的,其他的可以不看。
    • 从2016年就不维护了,不建议使用
  3. JAI的com.sun.media.jai.codec 也有一定的图像解码能力
    • 当然,还有众多的java开源工具包可以读写图像,例如JIMI, JMagic等,但JDK目前本身能
    • 够读写图片,就用JDK的,开发和部署方便,不需要额外下载jar包。
    • 如果你仅仅想读取常见格式的图片,不需要用JAI这么高级这么庞大的东西,用Java Image I/O API即可。
  4. Thumbnailator:https://www.cnblogs.com/tangjiang-code/p/7911527.html
    • Thumbnailator 是一个优秀的图片处理的Google开源Java类库。处理效果远比Java API的好。
    • 从API提供现有的图像文件和图像对象的类中简化了处理过程,两三行代码就能够从现有图片生成处理后的图片,且允许微调图片的生成方式,同时保持了需要写入的最低限度的代码量。
    • 还支持对一个目录的所有图片进行批量处理操作。
  5. ImageMagick: http://www.imagemagick.org/script/download.php
    • ImageMagick是一个免费的创建、编辑、合成图片的软件,可以实现图片切割、颜色替换、图片缩略图、图片水印等各种效果。
    • ImageMagick是免费开源软件,支持大多数操作系统,包括Linux、Windows操作系统。
    • ImageMagick的大多数功能的使用都来源于命令行工具。
  6. SimpleImage:SimpleImage是阿里巴巴的一个Java图片处理的类库,可以实现图片缩略、水印等处理。https://github.com/alibaba/simpleimage

压缩工具

1.GZIP

ZIP最早由Jean-loup Gailly和Mark Adler创建,用于UNⅨ系统的文件压缩。我们在Linux中经常会用到后缀为.gz的文件,它们就是GZIP格式的。 现今已经成为Internet上使用非常普遍的一种数据压缩格式,或者说一种文件格式。HTTP协议上的GZIP编码是一种用来改进WEB应用程序性能的技术。 大流量的WEB站点常常使用GZIP压缩技术来让用户感受更快的速度。这一般是指WWW服务器中安装的一个功能,当有人来访问这个服务器中的网站时, 服务器中的这个功能就将网页内容压缩后传输到来访的电脑浏览器中显示出来。

一般对纯文本内容可压缩到原大小的40%.这样传输就快了,效果就是你点击网址后会很快的显示出来。当然这也会增加服务器的负载。一般服务器中都安装有这个功能模块的。

GZIP常常用在linxu环境下,是一种非常简单的压缩算法。在Java实现API中,它仅仅包含两个实现类: GZIPInputStream和GZIPOutputStream。

  • GZIPOutputStream类用于压缩:先说压缩实现,GZIPOutputStream只有一个方法用于压缩,就是带定长的write方法。最后调用finish方法和flush方法
  • GZIPInputStream类用于解压缩:GZIPInputStream也对应GZIPOutputStream提供了一个带定长的read方法

2.Zip

jdk提供基础工具。ZipInputStream和ZipOutputStream。

运维工具

1.JCraft

JCraft是一个基于Java的SSH API库,它提供了丰富的SSH协议支持和实现。通过使用JCraft,我们可以很方便地实现SSH连接和数据传输。 具体而言,我们可以通过JCraft实现基于密码和公钥的SSH连接,实现SSH会话和通道的建立和关闭,以及进行文件传输和命令执行等操作。

// 通过Maven引入JCraft
<dependency>
    <groupId>com.jcraft</groupId>
    <artifactId>jsch</artifactId>
    <version>0.1.55</version>
</dependency>

优点和不足

  • JCraft是一个非常优秀的Java SSH库,它提供了丰富的SSH协议实现和支持。通过JCraft,我们可以很方便地实现基于密码和基于公钥的SSH连接和数据传输,以及支持文件传输和命令执行等操作。
  • 然而,JCraft也存在一些不足之处。首先,JCraft的开发、文档和调试都比较困难,需要具备一定的Java开发和SSH协议实现方面的知识。 其次,JCraft在某些情况下会出现一些奇怪的问题,需要进行工具和日志的分析和调试。因此,对于未经验过JCraft的开发者而言,可能需要一些时间和精力进行学习和实践。

2.useful-scripts

平时有用的手动操作做成脚本,以便捷地使用,让开发的日常生活更轻松些。https://github.com/oldratlee/useful-scripts

中文文档

  • show-busy-java-threads:用于快速排查Java的CPU性能问题(top us值过高),自动查出运行的Java进程中消耗CPU多的线程,并打印出其线程栈,从而确定导致性能问题的方法调用。

3.nmap4j

nmap4j 是一个用于 Java 语言的 Nmap 端口扫描器的包装库,它允许 Java 开发者在自己的项目中方便地调用 Nmap 的功能进行网络扫描和探测。

GitHub地址: https://github.com/narkisr/nmap4j

在运行这个代码之前,我们是需要下载 nmap 的可执行文件,地址为:https://nmap.org/download.html#windows

参数说明

  1. 目标选择参数
    • -iL: 从文件中读取扫描目标列表。例如,nmap -iL targets.txt,会从targets.txt文件中读取每行一个的 IP 地址或域名作为扫描目标。
    • -iR: 随机选择指定数量的主机进行扫描。如nmap -iR 100,会随机选取 100 个主机进行扫描。
    • –exclude <host1[,host2,…]>: 排除指定的主机或网络不进行扫描。例如,nmap 192.168.1.0/24
    • –exclude 192.168.1.100,192.168.1.200,将扫描192.168.1.0/24网段,但排除192.168.1.100和192.168.1.200这两台主机。
    • –excludefile : 从文件中读取要排除的主机或网络列表。
    • 扫描类型参数
    • -sS: TCP SYN 扫描,也称为半开放扫描。它发送 SYN 包到目标端口,如果收到 SYN/ACK 响应,就表示端口开放;如果收到 RST 响应,则表示端口关闭。这种扫描方式速度快,且不容易被目标系统记录,相对隐蔽,例如nmap -sS 192.168.1.100。
    • -sT: TCP 连接扫描,通过完整的 TCP 三次握手来确定端口是否开放。这种扫描方式最准确,但也最容易被检测到,如nmap -sT 192.168.1.100。
    • -sU: UDP 扫描,用于检测目标主机上的 UDP 端口是否开放。因为 UDP 是无连接协议,所以判断端口状态相对复杂,nmap -sU 192.168.1.100可对指定主机进行 UDP 扫描。
    • -sF、-sX、-sN: 分别是 FIN 扫描、XMAS 扫描和 NULL 扫描。这些扫描方式通过发送特殊标志位的 TCP 包来判断端口状态,常用于绕过一些简单的防火墙检测。
  2. 端口指定参数
    • -p: 指定要扫描的端口范围。可以是单个端口,如-p 80;也可以是多个端口,如-p 80,443,8080;还可以是端口范围,如-p 1-1000表示扫描 1 到 1000 号端口。
    • –top-ports: 扫描最常用的指定数量的端口。例如,nmap –top-ports 100 192.168.1.100会扫描目标主机上最常用的 100 个端口。
    • -F: 快速扫描模式,只扫描一些常见的端口,相当于-p 1-1024加上一些其他常用端口。
  3. 服务探测参数
    • -sV: 启用服务版本探测,尝试确定目标主机上运行的服务及其版本信息。例如,nmap -sV 192.168.1.100可以扫描出目标主机开放端口上运行的服务名称和版本号。
    • –version-intensity: 设置服务版本探测的强度,级别越高,探测越全面,但耗时也越长,取值范围是 0 到 9。
  4. 操作系统探测参数
    • -O: 启用操作系统探测,尝试识别目标主机的操作系统类型和版本。如nmap -O 192.168.1.100。
    • –osscan-limit: 限制操作系统探测只对可能的目标进行,这样可以加快扫描速度,但可能会降低准确性。
    • –osscan-guess: 更积极地猜测操作系统类型,当 Nmap 不确定时会给出更宽泛的猜测结果。
  5. 输出参数
    • -oN: 将扫描结果以正常格式保存到指定文件。例如,nmap -oN scan_results.txt 192.168.1.100会把扫描结果保存到scan_results.txt文件中。
    • -oX: 将扫描结果以 XML 格式保存到指定文件,方便后续使用脚本或其他工具进行解析和处理。
    • -oG: 将扫描结果以 Grep 格式保存,这种格式便于使用文本处理工具进行分析。
    • -oA: 以多种格式(包括正常、XML 和 Grep 格式)保存扫描结果,文件名为指定的基本名称加上相应的扩展名。
    • -v: 详细输出模式,显示更多的扫描过程信息,如发送的数据包、收到的响应等。使用多个v可以增加详细程度,如-vv、-vvv。

api文档

swagger 系列的文档,支持开关配置(测试环境可用,生产环境禁用)、支持安全认证、接口调试、多版本控制等。

1.swagger-api

  • 官方:https://swagger.io/tools/swagger-ui/download/
  • 常用注解

一般与springboot项目集成,通过注解的方式,动态生成API文档,帮助开发人员联调测试。

OpenAPI 始于 Swagger 规范,Swagger 规范已于2015 年捐赠给 Linux 基金会后改名为 OpenAPI,并定义最新的规范为 OpenAPI 3.0。 本质上你可以理解为前者是规范,后者则是实现规范的工具

  • OpenAPI = 规范
  • Swagger = 实现规范的工具。可以查看文档、调试接口、生成客户端代码。

2.Swagger2Markup生成静态

Swagger2Markup是Github上的一个开源项目。该项目主要用来将Swagger自动生成的文档转换成几种流行的格式以便于静态部署和使用,比如:AsciiDoc、Markdown、Confluence。

项目主页:https://github.com/Swagger2Markup/swagger2markup

3.Knife4j【推荐】

官网https://doc.xiaominfo.com/

国内对swagger的优化封装,需要剔除swagger的依赖。对swagger进行了非常好的优化。

同时提供了微服务聚合组件Knife4jAggregation,独立部署,聚合OpenAPI文档。 Aggregation微服务聚合中间件

4.YApi

开源的可视化接口管理平台,非常好用。官网https://yapi.ylzpay.com/

5.SpringDoc

用于解决swagger的配置繁琐等问题。也是通过注解的方式简化API文档的编写。https://mp.weixin.qq.com/s/auS6DgsE26s7yaPaPzFuDA

6.api调用工具。

  1. Apifox = Postman + Swagger + Mock + JMeter。支持通过http api的方式,将swagger生成的api文档上传到apiFox中,方便团队协作。 开放apihttps://apifox-openapi.apifox.cn/
  2. hoppscotch。原名postwoman。用于替换postman。https://github.com/hoppscotch/hoppscotch

地图【gis】

GIS(地理信息系统)是一种将地理空间数据与属性数据相结合的技术,用于收集、存储、处理、分析和展示地理空间信息的系统。GIS可以帮助我们更好地理解和管理地球上的自然和人文环境。 GIS系统可以用于许多不同的应用,例如城市规划、土地利用管理、环境保护、资源管理、交通规划和紧急响应等。通过使用GIS,我们可以更好地理解地球上的各种现象和问题,并制定更有效的解决方案。

地图产品如下:

  • 高德地图。民用免费GIS
  • 百度地图。民用免费GIS
  • Google地图。民用免费GIS
  • 北京超图地理信息技术有限公司的 Super MapGIS 系列
  • 武汉中地信息工程有限公司的 MapGIS系列
  • uDig。开源web gis。
  • QGIS。开源web gis。
  • OpenLayers。开源web gis。
  • leaflet。开源web gis。
  • 天地图:是国家测绘地理信息局建设的地理信息综合服务网站,相比高德、百度等地图,天地图在乡村、偏远地图的地图最为全面,图层更细腻,更加清晰
  • 瑞图:是瑞图万方,提供空间资源动态监测软硬件与地图数据平台等能力,提供的导航数据最全。主要用于车载导航,农业、林业、测绘、环保、能源等领域的监测等。对指定地区的灾害风险评级、周边风险隐患、风险热区黑点

对比:

  • 专业领域GIS:
    • 主要面向企业级用户,提供高端的地图定制、空间分析、空间建模和数据管理等功能。
    • 支持多种数据格式,包括矢量数据、栅格数据、遥感数据等。
    • 使用场景:气象预报、地形勘探、科研等
    • 区别:大多是基于卫星产生遥感数据,地图图层会非常清晰,用于计算距离、面积时会比较精确。
  • 民用GIS:
    • 使用场景:面向普通用户的手机应用,提供导航、定位、实时路况等服务。
    • 提供web端和移动端的应用。
    • 提供流量更大的商业版应用。功能参考:https://lbs.amap.com/upgrade#quota
    • 区别:地图图层不够清晰和精准,主要用于大概位置的定位和导航。

2.GeoLite2

官网地址: https://www.maxmind.com/en/home

通过ip地址获取经纬度以及该ip地址所属地区,提供免费的基础数据库。 下载解压之后,可以看到 geolite2-city.mmdb 就是我们需要的数据库文件了。

文档: https://dev.maxmind.com/geoip/geolocate-an-ip/databases?lang=en

官方使用maven。

<dependency>
  <groupId>com.maxmind.geoip2</groupId>
  <artifactId>geoip2</artifactId>
  <version>2.15.0</version>
</dependency>

官方代码

File database = new File("/path/to/maxmind-database.mmdb")

// This reader object should be reused across lookups as creation of it is
// expensive.
DatabaseReader reader = new DatabaseReader.Builder(database).build();

// If you want to use caching at the cost of a small (~2MB) memory overhead:
// new DatabaseReader.Builder(file).withCache(new CHMCache()).build();

InetAddress ipAddress = InetAddress.getByName("128.101.101.101");

CityResponse response = reader.city(ipAddress);

Country country = response.getCountry();
System.out.println(country.getIsoCode());

抽象出工具类

    /**
     * 
     * @description: 获得国家 
     * @param reader GeoLite2 数据库
     * @param ip ip地址
     * @return
     * @throws Exception
     */
    public static String getCountry(DatabaseReader reader, String ip) throws Exception {
        return reader.city(InetAddress.getByName(ip)).getCountry().getNames().get("zh-CN");
    }

    /**
     * 
     * @description: 获得省份 
     * @param reader GeoLite2 数据库
     * @param ip ip地址
     * @return
     * @throws Exception
     */
    public static String getProvince(DatabaseReader reader, String ip) throws Exception {
        return reader.city(InetAddress.getByName(ip)).getMostSpecificSubdivision().getNames().get("zh-CN");
    }

    /**
     * 
     * @description: 获得城市 
     * @param reader GeoLite2 数据库
     * @param ip ip地址
     * @return
     * @throws Exception
     */
    public static String getCity(DatabaseReader reader, String ip) throws Exception {
        return reader.city(InetAddress.getByName(ip)).getCity().getNames().get("zh-CN");
    }
    
    /**
     * 
     * @description: 获得经度 
     * @param reader GeoLite2 数据库
     * @param ip ip地址
     * @return
     * @throws Exception
     */
    public static Double getLongitude(DatabaseReader reader, String ip) throws Exception {
        return reader.city(InetAddress.getByName(ip)).getLocation().getLongitude();
    }
    
    /**
     * 
     * @description: 获得纬度
     * @param reader GeoLite2 数据库
     * @param ip ip地址
     * @return
     * @throws Exception
     */
    public static Double getLatitude(DatabaseReader reader, String ip) throws Exception {
        return reader.city(InetAddress.getByName(ip)).getLocation().getLatitude();
    }
    
    public static void main(String[] args) throws Exception {
    	// String path = req.getSession().getServletContext().getRealPath("/WEB-INF/classes/GeoLite2-City.mmdb");
    	String path = "D:/CSDN/GeoLite2-City.mmdb";
    	// 创建 GeoLite2 数据库
    	File database = new File(path);
    	// 读取数据库内容
    	DatabaseReader reader = new DatabaseReader.Builder(database).build();
    	// 访问IP
    	String ip = "222.222.226.212";
    	String site = "国家:"+GetAddress.getCountry(reader, ip) + "\n省份:" + GetAddress.getProvince(reader, ip) + "\n城市:" + GetAddress.getCity(reader, ip)+ "\n经度:" + GetAddress.getLongitude(reader, ip)+ "\n维度:" + GetAddress.getLatitude(reader, ip);
    	System.out.println(site);
    }

SQL Parser

Java 生态中较为流行的 SQL Parser 有以下几种: https://blog.csdn.net/OWMBL/article/details/130677565

  • fdb-sql-parser 是 FoundationDB 在被 Apple 收购前开源的 SQL Parser(不支持很复杂的SQL),目前已无人维护。
  • JSqlParser 是基于 JavaCC 的开源 SQL Parser,是 General SQL Parser 的 Java 实现版本。
  • Apache calcite 是一款开源的动态数据管理框架,它具备 SQL 解析、SQL 校验、查询优化、SQL 生成以及数据连接查询等功能,常用于为大数据工具提供 SQL 能力,例如 Hive、Flink 等。calcite 对标准 SQL 支持良好,但是对传统的关系型数据方言支持度较差。
  • alibaba druid 是阿里巴巴开源的一款 JDBC 数据库连接池,但其为监控而生的理念让其天然具有了 SQL Parser 的能力。其自带的 Wall Filer、StatFiler 等都是基于 SQL Parser 解析的 AST。并且支持多种数据库方言。

性能对比:druid>JSqlParser>fdbparser


文章信息

张雪随笔
master
Homepage
Issues
Download

This Software is under the terms of The Unlicense.