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函数解析SQLSelectStatement 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文本!
 中国 天津

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity导出的webgl包在浏览器下报错:Unable to parse Build/导出的项目名称.framework.js.gz

先根据链接Unity WebGL项目打包后本地打开报错问题解决方法_unity 打包webgl报错:webassembly.instantiate()-CSDN博客文档操作一番后,在360极速里面兼容模式——黑屏如图: 极速模式:进度条走不满,在谷歌浏览器里面的红色报错文字不出现。 然后打开谷歌浏览器,报如下错:…

LLM实战:LLM微调加速神器-Unsloth + LLama3

1. 背景 五一结束后&#xff0c;本qiang~又投入了LLM的技术海洋中&#xff0c;本期将给大家带来LLM微调神器&#xff1a;Unsloth。 正如Unsloth官方的对外宣贯&#xff1a;Easily finetune & train LLMs; Get faster with unsloth。微调训练LLM&#xff0c;可以显著提升速…

【Linux操作系统】:文件操作

目录 前言 一、C语言中文件IO操作 1.文件的打开方式 2.fopen&#xff1a;打开文件 3.fread&#xff1a;读文件 4.fwrite:写文件 二、系统文件I/O 1.系统调用open、read、write 2.文件描述符fd 3.文件描述符的分配规则 4.重定向 5.缓冲区 6.理解文件系统 磁盘 磁盘…

BGP—边界网关协议

BGP 动态路由协议可以按照工作范围分为IGP以及EGP。IGP工作在同一个AS内&#xff0c;主要用来发现和计算路由&#xff0c;为AS内提供路由信息的交换&#xff1b;而EGP工作在AS与AS之间&#xff0c;在AS间提供无环路的路由信息交换&#xff0c;BGP则是EGP的一种。 BGP是一…

【命名空间】(中北大学-程序设计基础(2))

目录 题目 源码 结果示例 题目 学校的人事部门保存了有关学生的部分数据&#xff08;学号、姓名、年龄、住址&#xff09;&#xff0c;教务部门也保存了学生的另外一些部分数据&#xff08;学号、姓名、性别、成绩&#xff09;&#xff0c;两个部门分别编写了本部门的数据管…

制造业精益生产KPI和智慧供应链管理方案和实践案例分享

随着工业4.0的推进和国家对制造业高质量发展的重视&#xff0c;工业数据已跃升为生产经营活动中不可或缺的核心要素&#xff0c;同时&#xff0c;工业数据也是形成新质生产力的优质生产要素&#xff0c;助力企业实现高效精益生产。 工业数据在制造业中的作用不可忽视&#xff…

【数据分析面试】42.用户流失预测模型搭建(资料数据分享)

题目 保持高的客户留存率可以稳定和提到企业的收入。因此&#xff0c;预测和防止客户流失是在业务中常见的一项数据分析任务。这次分享的数据集包括了电信行业、银行、人力资源和电商行业&#xff0c;涵盖了不同业务背景下的流失预测数据。 后台回复暗号&#xff08;在本文末…

向银行家应用程序添加日期

● 首先我们将下面图片上的时间更换成现在的时间 const now new Date(); const day now.getDate(); const month now.getMonth() 1; const year now.getFullYear(); const hour now.getHours(); const min now.getMinutes();labelDate.textContent ${day}/${month}/$…

【Unity从零开始学习制作手机游戏】第01节:控制3D胶囊体运动

1. 新建Project L01 使用3D Mobile模板。 2. 建立一个平面&#xff0c;用来承载物体 3. 导入Unity库内的胶囊体 下载 StandardAssets https://download.unitychina.cn/download_unity/e80cc3114ac1/WindowsStandardAssetsInstaller/UnityStandardAssetsSetup-5.6.7f1.exe …

在excel的内置瀑布图模板中,能在数据标签里同时显示数值和百分比吗?

瀑布图是由麦肯锡顾问公司所创的图表类型&#xff0c;因为形似瀑布流水而称之为瀑布图( Waterfall Plot)。这种图表常用于表达数个特定数值之间的数量增减变化关系。 在Excel中&#xff0c;瀑布图是可以通过簇状柱形图来完成创建。从excel2016版起&#xff0c;excel添加了内置…

幻兽帕鲁(公益入库)教程

先安装“SteamtoolsSetup”&#xff0c; 安装好桌面会出来个steam图标的。然后打开“幻兽帕鲁文件夹” 把那2个脚本拖进去那个steam图标。只要显示“已编译了1个Lua脚本”“已更新了1个清单文件”将在Steam重启后生效。然后退出steam&#xff0c;然后重启steam就可以了&#xf…

有哪些网络兼职适合大学生参与?揭秘几个简单又实用的兼职机会

有哪些网络兼职适合大学生参与&#xff1f;揭秘几个简单又实用的兼职机会 对于大学生而言&#xff0c;除了专注于学业&#xff0c;利用空余时间参与一些网络兼职&#xff0c;不仅能锻炼个人技能&#xff0c;还能为未来的职业生涯积累宝贵的经验。想象一下&#xff0c;步入社会…