SQLStringInFo SQL 数据库操作语句的解析器!!!

SQLStringInFo

开源技术栏

SQLStringInFo是一个专注于sql命令语句解析的sql命令解析库,在库中提供了有关SQL命令语法的解析器,通过该库,可以实现快速准确的SQL语句分析处理。

image

介绍

SQLStringInFo是一个专注于sql命令语句解析的sql命令解析库,在库中提供了有关SQL命令语法的解析器,通过该库,可以实现快速准确的SQL语句分析处理。

  • MAVEN依赖坐标

    现在已经支持使用MAVEN将该解析库添加到您的项目中了,当然,您也可以使用gradle连接该maven坐标!

<dependency>
    <groupId>io.github.BeardedManZhao</groupId>
    <artifactId>SQLStringInFo</artifactId>
    <version>1.1</version>
</dependency>

框架中的解析器

解析器是针对SQL语句数据处理的实现,其中存储的有关SQL解析的具体逻辑,在库中,所有的解析器都实现了strInfo.parser.SQLParser接口,接口中有最基本的获取数据的函数,下面是有关库中当前所有解析器的信息。

解析器类型解析器名称加入版本解析器作用
strInfo.parser.SQLParsernullv1.0统一所有解析器的接口
strInfo.parser.SelectParserselectv1.0针对Select语句进行解析
strInfo.parser.InsertParserinsertv1.0针对insert语句进行解析
strInfo.parser.CreateParsercreatev1.0针对create语句进行解析
strInfo.parser.AlterParseralterv1.0针对alter语句进行解析

框架中解析器的返回值

返回值是解析器在解析一个SQL语句之后的结果存储对象,所有的结果语句对象实现于"strInfo.result.Statement"抽象类,在结果对象可以通过解析词获取到所有借此词对应的数据,解析器本身也会提供一些函数供人使用。

语句结果类型加入版本支持的解析词功能
strInfo.result.Statementv1.0null
strInfo.result.SelectStatementv1.0select from where group order limit
strInfo.result.InsertStatementv1.0insert table value values
strInfo.result.CreateStatementv1.0create table field option like as
strInfo.result.AlterStatementv1.0alter mod addINFO table add drop rename change index primary unique field
strInfo.result.SelectStatement 的解析词

该类是针对 select 语句的解析结果进行存储的类,在类中有诸多解析词可以使用,下面就是有关该类解析词的所有解释与说明。

解析词加入版本作用
selectv1.0用于获取到select子句的字符串
fromv1.0用于获取到查询的表名称
wherev1.0用于获取到where或者on子句的数据
groupv1.0用于获取到SQL中的分组语句条件
orderv1.0用于获取到所有需要排序的列名称
limitv1.0用于获取到本次查询中有关分页的信息
  • 使用示例
package strInfo;

import strInfo.parser.SelectParser;
import strInfo.result.SelectStatement;

import java.util.ArrayList;
import java.util.Arrays;

/**
 * 测试用例类
 *
 * @author zhao
 */
public class MAIN {
    public static void main(String[] args) {
        // 构建一个SQL语句
        String sql = "select name, avg(achievement) as a from student right join achievement inner join (select * from sub_zhao;) left join (select * from sub_zhao123;) WHERE student.id = achievement.id and true group by name order by a desc limit 1;";
        // 通过单例设计获取到SQL语句的解析器,并调用parserSQL函数解析SQL
        SelectStatement selectStatement = SelectParser.getInstance().parseSql(sql);
        // 通过返回的结果对象,获取到解析出来的结果数据
        System.out.println("查询的表\t:" + selectStatement.getTableName());
        System.out.println("查询的字段\t:" + Arrays.toString(selectStatement.getFieldNames()));
        System.out.println("select 子句\t:" + selectStatement.getStatementStrByWord("select"));
        System.out.println("group 子句\t:" + selectStatement.getStatementStrByWord("group"));
        System.out.println("order 子句\t:" + selectStatement.getStatementStrByWord("order"));
        System.out.println("是否以正序排序\t:" + selectStatement.isAsc());
        System.out.println("查询的表(数组)\t:" + Arrays.toString(selectStatement.getStatementArrayByWord("from")));
        System.out.println("where中的条件(数组)\t:" + Arrays.toString(selectStatement.getStatementArrayByWord("where")));
        System.out.println("被group的字段(数组)\t:" + Arrays.toString(selectStatement.getStatementArrayByWord("group")));
        System.out.println("被order的字段(数组)\t:" + Arrays.toString(selectStatement.getStatementArrayByWord("order")));
        System.out.println("被解析的整个sql语句\t:" + selectStatement.getSqlStr());
        // 获取到所有的子查询语句
        ArrayList<SelectStatement> subQueryList = selectStatement.getSubQueryList();
        for (SelectStatement statement : subQueryList) {
            System.out.println("子查询表:" + statement.getTableName() + "\t子查询语句:" + statement.getSqlStr());
        }
    }
}
  • 运行结果
查询的表	: student right join achievement inner join , sub_zhao, sub_zhao123
查询的字段	:[name, avg(achievement) as a]
select 子句	:name, avg(achievement) as a
group 子句	:name
order 子句	:a 
是否以正序排序	:-1
查询的表(数组)	:[student, achievement, sub_zhao, sub_zhao123]
where中的条件(数组)	:[ student.id = achievement.id, and,  student.id = achievement.id]
被group的字段(数组)	:[name]
被order的字段(数组)	:[a ]
被解析的整个sql语句	:select name, avg(achievement) as a from student right join achievement inner join (select * from sub_zhao;) left join (select * from sub_zhao123;) WHERE student.id = achievement.id and true group by name order by a desc limit 1;
子查询表: sub_zhao	子查询语句:(select * from sub_zhao;)
子查询表: sub_zhao123	子查询语句:(select * from sub_zhao123;)
strInfo.parser.InsertParser 的解析词

该类是针对 insert 语句的解析结果进行存储的类,在类中有诸多解析词可以使用,下面就是有关该类解析词的所有解释与说明。

解析词加入版本作用
insertv1.0获取到插入的所有数据对应的字段
tablev1.0获取到插入语句的作用表
valuev1.0获取到被插入的数据
valuesv1.0获取到被插入的数据,与value效果一样
  • 使用示例
package strInfo;

import strInfo.parser.InsertParser;
import strInfo.result.InsertStatement;

import java.util.Arrays;

/**
 * 测试用例类
 *
 * @author zhao
 */
public class MAIN {
    public static void main(String[] args) {
        String insertSql = "insert into zhao (name, age) values (\"zhao\", 18), (\"tangYuan\", 19);";
        InsertStatement insertStatement = InsertParser.getInstance().parseSql(insertSql);
        System.out.println("插入数据的目标数据表\t:" + insertStatement.getTableName());
        System.out.println("插入数据的目标字段\t:" + Arrays.toString(insertStatement.getFieldNames()));
        System.out.println("插入的所有字段数据\t:" + insertStatement.getStatementStrByWord("value"));
        System.out.println("插入的所有目标字段(数组)\t:" + Arrays.toString(insertStatement.getStatementArrayByWord("insert")));
        System.out.println("插入的所有字段数据(数组)\t:" + Arrays.toString(insertStatement.getStatementArrayByWord("values")));
    }
}
  • 运行结果
插入数据的目标数据表	:zhao 
插入数据的目标字段	:[name, age]
插入的所有字段数据	:("zhao", 18), ("tangYuan", 19)
插入的所有目标字段(数组)	:[name, age]
插入的所有字段数据(数组)	:["zhao", 18, "tangYuan", 19]
strInfo.parser.CreateParser 的解析词

该类是针对 create 语句的解析结果进行存储的类,在类中有诸多解析词可以使用,下面就是有关该类解析词的所有解释与说明。

解析词加入版本作用
createv1.0获取到create语句的子句
tablev1.0获取到create创建的表
fieldv1.0获取到创建表中的字段
optionv1.0获取到表创建时候的其它选项,例如存储引擎等。
likev1.0获取到表创建时候的其它引用表,如果使用了其它表的情况下。
asv1.0获取到表创建时候的子查询语句,如果使用了子查询创建表的情况下。
  • 使用示例
package strInfo;

import strInfo.parser.CreateParser;
import strInfo.result.CreateStatement;
import strInfo.result.SelectStatement;

import java.util.Arrays;

/**
 * 测试用例类
 *
 * @author zhao
 */
public class MAIN {
    public static void main(String[] args) {
        String createSQL = """
                create temporary table zhao (
                    name varchar(20),
                    age int
                ) ENGINE=MyISAM DEFAULT CHARSET=utf8;""";

        CreateStatement createStatement = CreateParser.getInstance().parseSql(createSQL);
        System.out.println("创建的表\t:" + createStatement.getTableName());
        System.out.println("是否是临时表\t:" + createStatement.isTemporary());
        System.out.println("表中的字段\t:" + Arrays.toString(createStatement.getFieldNames()));
        System.out.println("创建表时的create子句\t:" + createStatement.getStatementStrByWord("create"));
        System.out.println("创建表时的表名称\t:" + createStatement.getStatementStrByWord("table"));
        System.out.println("创建表时指定的字段\t:" + createStatement.getStatementStrByWord("field"));
        System.out.println("创建表时指定的选项\t:" + createStatement.getStatementStrByWord("option"));
        System.out.println("创建表时指定的选项(数组)\t:" + Arrays.toString(createStatement.getStatementArrayByWord("option")));
        System.out.println("创建表时的like表\t:" + createStatement.getStatementStrByWord("like"));
        System.out.println("sql语句数据:" + createStatement.getSqlStr());
    }
}
  • 运行结果
创建的表	        :zhao
是否是临时表	:true
表中的字段	:[name varchar(20), age int]
创建表时的create子句 :temporary table zhao 
创建表时的表名称     :zhao
创建表时指定的字段 :
    name varchar(20),
    age int

创建表时指定的选项	:ENGINE=MyISAM DEFAULT CHARSET=utf8
创建表时指定的选项(数组)	:[ENGINE=MyISAM, DEFAULT, CHARSET=utf8]
创建表时的like表	:null
sql语句数据 :create temporary table zhao (
    name varchar(20),
    age int
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
插入数据的目标数据表	:zhao 
插入数据的目标字段	:[name, age]
插入的所有字段数据	:("zhao", 18), ("tangYuan", 19)
插入的所有目标字段(数组)	:[name, age]
插入的所有字段数据(数组)	:["zhao", 18, "tangYuan", 19]
strInfo.parser.AlterParser 的解析词

该类是针对 alter 语句的解析结果进行存储的类,在类中有诸多解析词可以使用,下面就是有关该类解析词的所有解释与说明。

解析词加入版本作用
alterv1.0获取到alter语句中alter子句的数据
modv1.0获取到alter语句中的修改模式
addINFOv1.0如果修改模式为add,这里是代表添加的模式
tablev1.0获取到发生变化的表名称
addv1.0获取到add的子句
dropv1.0如果修改模式drop,这里是获取到被删除的表
renamev1.0如果修改模式为rename,这里获取的是被重命名之后的新表名
changev1.0如果修改模式为change,这里获取的是被重命名之后的新列名
indexv1.0如果增加模式为index,这里获取的是被添加的索引名称
primaryv1.0如果增加模式为 primary key,这里获取的是被设置为主键的列名
uniquev1.0如果增加模式为 unique,这里获取的是被设置唯一约束的列名
fieldv1.0这里是获取到所有被修改的列名称
  • 使用示例
package strInfo;

import strInfo.parser.AlterParser;
import strInfo.result.AlterStatement;

import java.util.Arrays;

/**
 * 测试用例类
 *
 * @author zhao
 */
public class MAIN {
    public static void main(String[] args) {
        String sql5 = "alter table zhao add index indexName (name, age1);";
/*     TODO 这里是其它的alter,sql语句,同样可以被库解析
        String sql1 = "alter table zhao1 add test varchar(20);";
        String sql2 = "alter table zhao1 drop test;";
        String sql3 = " alter table zhao1 change age age1 int;";
        String sql4 = "alter table zhao1 rename zhao;";    
        String sql6 = "alter table zhao add primary key (name);";
        String sql7 = "alter table zhao add unique (name);";
*/
        AlterParser instance = AlterParser.getInstance();
        AlterStatement alterStatement1 = instance.parseSql(sql5);
        System.out.println("alter的语句子句:" + alterStatement1.getStatementStrByWord("alter"));
        System.out.println("alter作用的表名 :" + alterStatement1.getStatementStrByWord("table"));
        System.out.println("alter增加的子句 :" + alterStatement1.getStatementStrByWord("add"));
        System.out.println("alter删除的表名 :" + alterStatement1.getStatementStrByWord("drop"));
        System.out.println("alter增加的索引 :" + alterStatement1.getStatementStrByWord("index"));
        System.out.println("发生变化的列名称 :" + alterStatement1.getStatementStrByWord("field"));
        System.out.println("alter更新后的表 :" + alterStatement1.getStatementStrByWord("rename"));
        System.out.println("alter更新后的列 :" + alterStatement1.getStatementStrByWord("change"));
        System.out.println("alter的修改模式 :" + alterStatement1.getStatementStrByWord("mod"));
        System.out.println("alter的增加模式 :" + alterStatement1.getStatementStrByWord("addINFO"));
        System.out.println(alterStatement1.getSqlStr());
        // 也可以获取到数组形式的数据
        System.out.println("发生变化的列名称 :" + Arrays.toString(alterStatement1.getStatementArrayByWord("field")));
    }
}
  • 运行结果
alter的语句子句: table zhao add
alter作用的表名 :zhao
alter增加的子句 :add index  add index indexName (name, age1);
alter删除的表名 :null
alter增加的索引 :indexName
发生变化的列名称 :name, age1
alter更新后的表 :null
alter更新后的列 :null
alter的修改模式 :add
alter的增加模式 :index
alter table zhao add index indexName (name, age1);
发生变化的列名称 :[name, age1]

  • 切换到 English Document
  • date : 2022-12-31

操作记录
作者:root
操作时间:2024-05-07 10:07:31 星期二
事件描述备注:保存/发布
 中国 天津


操作记录
操作人员:root
操作时间:2024-05-13 19:08:39 星期一
事件描述备注:复制了源文章对应的markdown文本!
 中国 天津

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/621586.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

形位公差Overview of GDT

零件公差产生于十九世纪后期&#xff0c;其初衷是为了保证零件的互换性。起初只有尺寸公差。由于 当时的设计部门和制造部门通常都在一起或就在隔壁&#xff0c;因此交流起来非常方便。在当时&#xff0c;给 定的公差一般都很大&#xff0c;因此当时的设备刀具的能力对于保证产…

1.基本概念,半导体基础

1.电压降&#xff1a; 指电流通过阻抗负载时的电位降的大小。&#xff08;线段或部件两端的电压&#xff09;。 2.数量较多的载流子称为多子 3.二极管和稳压管 4.习题

合专家模型 (MoE) 详解

本文转载自&#xff1a;混合专家模型 (MoE) 详解 https://huggingface.co/blog/zh/moe 英文版&#xff1a;https://huggingface.co/blog/moe 文章目录 一、简短总结二、什么是混合专家模型&#xff1f;三、混合专家模型简史四、什么是稀疏性?五、混合专家模型中令牌的负载均衡…

2024中国(重庆)航空航天暨无人机低空经济展览会

2024中国&#xff08;重庆&#xff09;航空航天暨无人机低空经济展览会 邀请函 组织机构 主办单位: 中国航空学会 重庆市南岸区人民政府 招商执行单位&#xff1a; 重庆港华展览有限公司 展会概括∶ 2024中国航空航天暨无人机低空经济展览会将于2024年8月23-25日在重庆…

基于C#开发web网页模板流程-登录界面

前言&#xff0c;首先介绍一下本项目将要实现的功能 &#xff08;一&#xff09;登录界面 实现一个不算特别美观的登录窗口&#xff0c;当然这一步跟开发者本身的设计美学相关&#xff0c;像蒟蒻博主就没啥艺术细胞&#xff0c;勉强能用能看就行…… &#xff08;二&#xff09…

2024期从、证从、基从、银从备考资料及互助交流群

快进&#xff0c;2024年 金融考证备考资料及互助交流备考群&#xff0c;考啥进啥 5.12 &#xff08;基从&#xff09;基金从业资格考试 5.18&#xff08;期从&#xff09;期货从业资格考试 6.1 &#xff08;证从&#xff09;证券从业资格考试 6.1&#xff5e;6.2&#xff08;银…

AVL树的完全指南:平衡与性能

文章目录 AVL树简介AVL的操作建立一个AVL树插入操作删除操作 书写代码1.构造函数和析构函数2.获取最大值和最小值3.树的高度和节点个数3.前序中序和后序遍历4.判断树是否为空树5.四个旋转操作6.获取平衡因子7.插入操作8.删除操作9.搜索节点.h文件中的定义 总结 AVL树简介 AVL树…

Linux---vim编辑器(续写)

5. vim正常模式命令集 插入模式 按「i」切换进入插入模式「insert mode」&#xff0c; 按“i”进入插入模式后是从光标当前位置开始输入文件&#xff1b; 按「a」进入插入模式后&#xff0c;是从目前光标所在位置的下一个位置开始输入文字&#xff1b; 按「o」进入插入模式…

未来相遇过去:博物馆藏品管理平台的科技革新之旅

引言&#xff1a; 尊重历史&#xff0c;意味着保护其实体的载体。在博物馆这个时间的容器中&#xff0c;每一件藏品都承载着人类文明的印记&#xff0c;它们是历史的低语&#xff0c;是过去对现在的细语。在这篇文章中&#xff0c;我将带您走进博物馆的幕后&#xff0c;探究藏品…

基于SSM的“图书仓储管理系统”的设计与实现(源码+数据库+文档)

基于SSM的“图书仓储管理系统”的设计与实现&#xff08;源码数据库文档) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SSM 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 系统登录页面 人员管理信息页面 添加人员信息页…

全球静态住宅IP:网络时代的稳定之锚

在数字化浪潮席卷全球的今天&#xff0c;网络已经成为人们生活和工作中不可或缺的一部分。而在网络世界中&#xff0c;IP地址作为设备的重要身份标识&#xff0c;其稳定性和安全性显得尤为重要。全球静态住宅IP&#xff0c;以其独特的稳定性和安全性&#xff0c;为广大用户提供…

EdgeOne 免费证书快速实现网站 HTTPS 访问

在当今互联网环境下&#xff0c;HTTPS访问已经成为现代网站的必备功能。HTTPS 访问不仅能够更有效地保障用户在访问到网站时的数据安全传输&#xff0c;防止信息泄露、消息劫持等问题&#xff0c;在搜索引擎中&#xff0c;未实现 HTTPS 还会被浏览器提示为不安全网站&#xff0…

文件操作IO网络编程网络原理

​ 文件操作—IO 文件在计算机中可以代表很多东西 在操作系统中, 文件主要是指硬盘文件 硬盘主要分为机械硬盘和固态硬盘。机械硬盘通过磁头在旋转的磁盘上读取数据&#xff0c;适合顺序读取。而固态硬盘则使用闪存芯片来存储数据&#xff0c;没有机械部件&#xff0c;因此读…

怎么通过微信小程序实现远程控制8路控制器/断路器

怎么通过微信小程序实现远程控制8路控制器/断路器呢&#xff1f; 本文描述了使用微信小程序调用HTTP接口&#xff0c;实现控制8路控制器/断路器&#xff0c;支持8路输出&#xff0c;均可独立控制&#xff0c;可接入各种电器。 可选用产品&#xff1a;可根据实际场景需求&#…

GStreamer中如何自定义配置线程优先级

1.引言 如果看了gstreamer官方教程配置多线程出现编译不过的问题了&#xff0c;不妨进来看看这篇文章或许能解决一些编译问题。 GStreamer 本质上是多线程的&#xff0c;并且是完全线程安全的。大多数线程内部对应用程序是隐藏的&#xff0c;这应该使应用程序开发更容易。但是&…

R语言:肿瘤突变负荷分析

> merge_maf <- function(metadata, path){ #通过合并path,还有sample sheet前两列得到每一个文件的完整路径 filenames <- file.path(path, metadata$file_id, metadata$file_name, fsep .Platform$file.sep) message (##############…

RabbitMQ的用途

RabbitMQ主要有四个用途&#xff0c;分别是应用解耦、异步提速、削峰填谷、消息分发。详情讲解如下&#xff1a; RabbitMQ介绍、解耦、提速、削峰、分发 详解、RabbitMQ安装 可视化界面讲解 1.应用解耦&#xff1a;提高系统容错性和可维护性 2.异步提速&#xff1a;提升用户体验…

【JVM基础篇】打破双亲委派机制

文章目录 打破双亲委派机制自定义类加载器双亲委派机制核心代码打破双亲委派机制自定义类加载器父类怎么是AppClassLoader呢&#xff1f;两个自定义类加载器加载相同限定名的类&#xff0c;不会冲突吗&#xff1f;拓展类加载器功能 线程上下文类加载器JDBC案例那么问题来了&…

打造本地GPT专业领域知识库AnythingLLM+Ollama

如果你觉得openai的gpt没有隐私&#xff0c;或者需要离线使用gpt&#xff0c;还是打造专业领域知识&#xff0c;可以借用AnythingLLMOllama轻松实现本地GPT. AnythingLLMOllama 实现本地GPT步聚&#xff1a; 1 下载 AnythingLLM软件 AnythingLLM官网地址&#xff1a; Anythi…

C++17新特性 结构化绑定

一、Python中的相似功能 熟悉python的应该对下面的代码很熟悉 def return_multiple_values():return 11, 7x, y return_multiple_values()函数返回一个元组&#xff0c;元组自动分配给了x和y。 二、C11中的元组 c11中就存在类似python元组的概念了&#xff1a; std::tupl…