原文地址 http://www.cnblogs.com/zcftech/archive/2013/06/10/3131286.html
第一步:先对sql语句进行预处理;
对于用户,我们应该接受各种形式的查询语句书写,单行或者多行,语句中单个空格或者多个空格的间隔等等。但是我们要解析sql语句,就首先要让对它们做标准化,这样才能进行我们下一步处理。系统中的处理要求:
1)消除SQL语句前后的空白,将其中的连续空白字符(包括空格,TAB和回车换行)替换成单个空格;
2)将sql语句全变成小写形式(或大写形式);
3)在SQL语句的尾后加上结束符号“ENDOFSQL”(原因后面解释)
例如:用户输入:“select c1,c2,c3 from t1,t2, t3 where condi1=5 and condi6=6 or condi7=7 order
by g1,g2”
通过预处理应该为:“select c1,c2,c3 from t1,t2,t3 where condi1=5 and condi6=6 or condi7=7 order by g1,g2”
第二步:将查询语句切分为语句块;
以查询语句为例(本文中主要是以查询语句作为例子讲解,其它删除,插入等语句原理于此类似,因为查询语句相对复杂,所以用来i讲解),正如上面我们 标准化后的语句一样,我们要进行下一步的,对表中数据的处理,首先要知道是对那些表处理,要满足那些条件,输出那些属性,以什么顺序输出等。所以查询语句 就可以分割为以下几个块:
1)select c1,c2,c3 from:属性输出块;块头(start)select,块尾(end)from,这个块我们关心的信息(body):c1,c2,c3;以下块类似分析
2)from....where; 涉及数据表块。
3)where.....order by; 查询条件块。
4)order by.....ENDOFSQL; 属性输出顺序。这里也就看出了我们为什么要在查询语句末尾加上结束符,是为了最后一个块的限定需要。
知道了如何分块,接下来要做的就是在我们已经标准化的sql语句上进行块的切割,这里我们用到了正则表达式,以第二个块from....where的查询为例,我们做个分析
"(from)(.+)( where | on | having | group by | order by | ENDOFSQL)“
以上就是第二个块的正则匹配式(其它块的匹配式下面也会给出),可以看出,在一个sql查询语句中,from块中跟from搭配出现的不只是where,还可以是on,having,group by等,那么通过这个正则式我们可以得到如下的块:
from .... where
from .... on
from .... having
from .... group by
from .... order by
from .... ENDOFSQL
这里我们要注意一点,就是在通过正则式对sql语句进行匹配时,我们不能对整个sql语句进行一次匹配操作,因为正则匹配是贪心匹配,它总是尽可能 的向后查找,匹配到最大的语句段。就拿上述语句为例,如果通过对整个sql语句进行一次匹配,得到的就不是from....where这个语句段而是from .... where .... order by。显然这不是我们想要的。所以我们只能牺牲效率,通过对整个sql语句进行逐次递增的查询方式来查找相应的语句块。给出一个查询过程,加强理解,以上述sql语句为例,对第一个语句块的查找过程是
s
se
sel
sele
selec
select
select
select c
select c1
select c1,
select c1,c
select c1,c2
select c1,c2,
select c1,c2,c
select c1,c2,c3
select c1,c2,c3
select c1,c2,c3 f
select c1,c2,c3 fr
select c1,c2,c3 fro
select c1,c2,c3 from
这样就找到第一个块,以此类推,找第二个块时候又从头逐次递增查找。
第三步:找到了各个块,我们还要把我们最关心的信息提取出来,就是夹在语句块头和尾之间的body部分,这个就好实现了,一般的sql语句中都会用逗号来做分割,我们提取出各个块的body信息。
相关推荐
Java的SQL解析器JSQLPaser是一个强大的开源库,专门设计用于处理SQL语句的解析工作。这个库允许开发者分析SQL语句的结构,提取出其中的关键元素,如列名、表名、别名以及查询条件,从而在Java应用程序中实现对SQL的...
在Java编程环境中,处理SQL语句时,我们经常会遇到需要解析SQL的需求,比如为了验证语法、提取查询条件或者自定义SQL执行逻辑等。Apache提供了一个强大的工具包——JSqlParser,它是一个开源的Java库,专门用于解析...
项目中已使用的一个比较简单的SQL语句查询字段解析工具类
JSqlParser是一个用Java编写的开源SQL解析库,它可以解析SQL语句并生成抽象语法树(AST),也可以根据AST生成SQL语句。这意味着你可以利用它来分析、修改甚至生成SQL查询。 以下是一些JSqlParser的主要应用场景: ...
《深入理解Java SQL解析器:JSQLParser》 在Java编程领域,处理SQL语句时,我们常常需要对SQL进行解析,以便理解其结构、验证语法或者转换为其他形式。JSQLParser就是一个强大的开源库,专门用于解析和操作SQL语句...
在Java中,ANTLR常被用来解析SQL语句,生成抽象语法树(AST),从而可以进行语法检查。`antlr-2.7.6rc1.jar`是ANTLR的一个版本,包含了必要的类库,可以生成解析SQL语法所需的解析器。 `commons-lang.jar`是Apache ...
JAVA源码SQL解析类库SQLJEPJAVA源码SQL解析类库SQLJEP
java资源SQL解析类库 SQLJEPjava资源SQL解析类库 SQLJEP提取方式是百度网盘分享地址
基于java的开发源码-SQL解析类库 SQLJEP.zip 基于java的开发源码-SQL解析类库 SQLJEP.zip 基于java的开发源码-SQL解析类库 SQLJEP.zip 基于java的开发源码-SQL解析类库 SQLJEP.zip 基于java的开发源码-SQL解析类库 ...
描述中提到的“支持SQL解析DSL”意味着该工具包包含了一个SQL解析器,能够将SQL查询语句转换为Domain Specific Language (DSL)。DSL是专为特定领域设计的语言,这里指的就是Elasticsearch的查询DSL。这种方式使得...
在IT行业中,数据库管理和数据...总结来说,"通过解析SQL语句获取表血缘关系项目"是一个关键的数据管理实践,它依赖于对SQL的深入理解和合适的工具,以揭示数据库中的数据流动路径,从而支持更高效、更合规的数据操作。
"基于Java的SQL解析类库 SQLJEP.zip" 提供了一个解决方案,帮助Java开发者更有效地处理SQL相关任务。 SQLJEP(SQL Java Expression Parser)是一个开源项目,它允许Java程序员将SQL表达式集成到Java程序中,进行...
### Java读取SQL Server Image字段知识点详解 #### 一、背景与目的 在数据库应用开发过程中,经常会遇到需要存储图片等二进制数据的情况。SQL Server 提供了`IMAGE`类型来存储大容量的二进制数据。然而,如何有效地...
**JsonSQL: SQL语句解析JSON文件** 在大数据处理和Web应用中,JSON(JavaScript Object Notation)格式已经成为数据交换的常见格式。然而,对于习惯使用SQL查询关系型数据库的人来说,处理JSON数据可能会觉得不太...
SQLJEP是一个基于Java的SQL解析库,专为处理和解析SQL语句而设计。它提供了将SQL表达式转化为抽象语法树(AST)的能力,进而可以进行进一步的分析、操作或转换。在Java应用程序中,当需要对用户输入的SQL进行验证、...
在提供的压缩包文件"gsp_demo_java-master"中,包含了该工具的Java源代码示例,用户可以通过阅读和学习这些代码,了解如何利用GSP库进行SQL解析,并结合自己的需求进行集成或扩展。这不仅是一个工具,也是一个学习和...
在Java编程中,读取数据库表中的内容并将其转换为SQL文件,然后解析并执行这个文件,是一项常见的数据处理任务。这项操作可能涉及到数据库连接、数据查询、文件操作以及SQL语句的构建与执行。以下将详细介绍这个过程...
《SQL解析器在Java 7环境中的应用与实践》 SQL(Structured Query Language)作为一种用于管理关系数据库的标准语言,其解析器在数据处理领域扮演着至关重要的角色。尤其是在Java 7这样的开发环境中,一个高效的SQL...
// 具有子查询的sql String hql = "select id,name from (select id from table_1 where id={p0}) t1 inner join (select name --this is name\n from table_2) t2"; // 获取id字段的血缘 LineageNode idNode = ...