解析效果:

select id,code,name,utime,src,ctime from stock where id<20 and code like '%6%' order by id,code
Index Type No Text Type Desc
------------------------------------------------------------------------------------
0 1 select KW:select
1 2 id Text
2 3 , Comma
3 2 code Text
4 3 , Comma
5 2 name Text
6 3 , Comma
7 2 utime Text
8 3 , Comma
9 2 src Text
10 3 , Comma
11 2 ctime Text
12 4 from KW:from
13 2 stock Text
14 5 where KW:where
15 2 id Text
16 16 < <
17 2 20 Text
18 6 and KW:and
19 2 code Text
20 49 like KW:like
21 2 '%6%' Text
22 9 order KW:order
23 10 by KW:by
24 2 id Text
25 3 , Comma
26 2 code Text select
id,
code,
name,
utime,
src,
ctime
from
stock
where
id<20 and
code like'%6%'
order by
id,
code Text Depth Parent Prev Next Child Cnt
------------------------------------------------------------------------------------
NULL 0 NULL NULL NULL 4
select 0 null NULL from 11
id 1 select NULL , 0
, 1 select id code 0
code 1 select , , 0
, 1 select code name 0
name 1 select , , 0
, 1 select name utime 0
utime 1 select , , 0
, 1 select utime src 0
src 1 select , , 0
, 1 select src ctime 0
ctime 1 select , NULL 0
from 0 null select where 1
stock 1 from NULL NULL 0
where 0 null from order by 3
id<20 1 where NULL and 0
and 1 where id<20 code like'%6%' 0
code like'%6%' 1 where and NULL 0
order by 0 null where NULL 4
id 1 order by NULL , 0
, 1 order by id code 0
code 1 order by , 0
1 order by code NULL 0

程序:

package com.heyang.easysql.builder04;

import java.util.List;

import com.heyang.easysql.lex.Lexer;
import com.heyang.easysql.node.Node;
import com.heyang.easysql.token.Token;
import com.heyang.easysql.util.EasySqlUtil; /**
* SQL Builder 1.04
* @author Heyang
*
*/
public class Builder {
private Node root; public Builder(List<Token> tokens) {
root=new Node(Node.TYPE_TRANSPARENT); int fromIndex=-1;
int whereIndex=-1;
int orderbyIndex=-1;
for(int i=0;i<tokens.size();i++) {
Token t=tokens.get(i);
if(t.getType()==Token.TYPE_FROM) {
fromIndex=i;
}
if(t.getType()==Token.TYPE_WHERE) {
whereIndex=i;
}
if(t.getType()==Token.TYPE_ORDER) {
int nextIndex=i+1;
if(nextIndex<tokens.size()) {
Token nextToken=tokens.get(nextIndex);
if(nextToken.getType()==Token.TYPE_BY) {
orderbyIndex=i;
}
}
}
} if(fromIndex!=-1) {
List<Token> subTokens=tokens.subList(0, fromIndex);
Node select=new Node(subTokens.get(0).getText());
root.addChild(select); for(int i=1;i<subTokens.size();i++) {
Token t=subTokens.get(i);
if(t.getType()==Token.TYPE_TEXT) {
select.addChild(new Node(t.getText()));
}else if(t.getType()==Token.TYPE_COMMA) {
select.addChild(new Node(t.getText(),Node.TYPE_JOINT));
}
}
} if(fromIndex!=-1 && whereIndex!=-1) {
List<Token> subTokens=tokens.subList(fromIndex, whereIndex);
Node from=new Node(subTokens.get(0).getText());
root.addChild(from); for(int i=1;i<subTokens.size();i++) {
Token t=subTokens.get(i);
if(t.getType()==Token.TYPE_TEXT) {
from.addChild(new Node(t.getText()));
}else if(t.getType()==Token.TYPE_COMMA) {
from.addChild(new Node(t.getText(),Node.TYPE_JOINT));
}
}
} if(whereIndex!=-1 && orderbyIndex!=-1) {
List<Token> subTokens=tokens.subList(whereIndex, orderbyIndex);
Node where=new Node(subTokens.get(0).getText());
root.addChild(where); String bundle="";
for(int i=1;i<subTokens.size();i++) {
Token t=subTokens.get(i); if(t.getType()==Token.TYPE_AND || t.getType()==Token.TYPE_OR) {
where.addChild(new Node(bundle));
bundle="";
where.addChild(new Node(t.getText(),Node.TYPE_JOINT));
}else if(t.getType()==Token.TYPE_LIKE){
bundle+=" "+t.getText();
}else {
bundle+=t.getText();
}
} where.addChild(new Node(bundle));
} if(orderbyIndex!=-1) {
List<Token> subTokens=tokens.subList(orderbyIndex, tokens.size());
Node orderby=new Node("order by");
root.addChild(orderby); String bundle="";
for(int i=1;i<subTokens.size();i++) {
Token t=subTokens.get(i); if(t.getType()==Token.TYPE_TEXT) {
orderby.addChild(new Node(t.getText()));
}else if(t.getType()==Token.TYPE_COMMA) {
orderby.addChild(new Node(t.getText(),Node.TYPE_JOINT));
}
} orderby.addChild(new Node(bundle));
}
} public void printRoot() {
System.out.println(root);
root.printHeaders();
root.printTree();
} public static void main(String[] args) throws Exception{
String sql=EasySqlUtil.removeExtraSpace(EasySqlUtil.readSqlFromFile("c:\\temp\\18.sql"));
System.out.println(sql);
Lexer l=new Lexer(sql);
List<Token> tokens=l.getTokenList();
l.printTokenList(); Builder builder=new Builder(tokens);
builder.printRoot();
}
}

--2020年5月15日--

SQL Builder 1.04的更多相关文章

  1. xorm的sql builder

    最近在使用xorm,并使用了sql builder来构建sql查询没想到升级后原来可以使用的代码居然报错了. 0x00 代码 sql, args, _ := builder.Select(" ...

  2. SQL Server 基础 04 函数与分组查询数据

    函数与分组查询数据 系统函数分 聚合函数.数据类型转换函数.日期函数.数学函数 . . . 1. 聚合函数 主要是对一组值进行计算,然后返回一个值. 聚合函数包括 sum(求和).avg(求平均值). ...

  3. using the library to generate a dynamic SELECT or DELETE statement mysqlbaits xml配置文件 与 sql构造器 对比

    https://github.com/mybatis/mybatis-dynamic-sql MyBatis Dynamic SQL     What Is This? This library is ...

  4. 10046事件跟踪会话sql

    背景知识: 10046 事件按照收集信息内容,可以分成4个级别: Level 1: 等同于SQL_TRACE 的功能 Level 4: 在Level 1的基础上增加收集绑定变量的信息 Level 8: ...

  5. MyBatis(3.2.3) - Dynamic SQL

    Sometimes, static SQL queries may not be sufficient for application requirements. We may have to bui ...

  6. 【开源.NET】轻量级内容管理框架Grissom.CMS(第三篇解析配置文件和数据以转换成 sql)

    该篇是 Grissom.CMS 框架系列文章的第三篇, 主要介绍框架用到的核心库 EasyJsonToSql, 把标准的配置文件和数据结构解析成可执行的 sql. 该框架能实现自动化增删改查得益于 E ...

  7. Spring+SpringMVC+MyBatis+easyUI整合优化篇(十二)数据层优化-explain关键字及慢sql优化

    本文提要 从编码角度来优化数据层的话,我首先会去查一下项目中运行的sql语句,定位到瓶颈是否出现在这里,首先去优化sql语句,而慢sql就是其中的主要优化对象,对于慢sql,顾名思义就是花费较多执行时 ...

  8. Go sql语句引号问题

    使用Go进行Mysql开发时,会遇到引号问题(实际上,与语言无关,只要使用sql就会遇到这些类似问题). 本文举例说明如何解决这些问题. Example1 第一例子演示格式字符是否要加引号. 代码如下 ...

  9. PetaPoco源代码学习--3.Sql类

    PetaPoco对数据库的操作直接使用SQL语句,在代码中进行调用既可以直接传递SQL语句,也可以使用提供的SQL类来获取到SQL语句进行操作,直接传递SQL语句在内部实现中也是封装成Sql类传递到底 ...

随机推荐

  1. spring boot项目集成zuul网关

    1 zuul简介 Zuul 的官方介绍是 “Zuul is the front door for all requests from devices and web sites to the back ...

  2. Docker 启动 Nginx

    Docker 启动 Nginx 拉取镜像 docker pull nginx:1.17.9 启动步骤 # 创建 nginx 目录 mkdir -p /usr/local/nginx && ...

  3. AlgorithmMan,一套免费的算法演示神器

    概述 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/971 访问.  文章末尾附带GitHub开源下载地址. 0.概述 ...

  4. golang 总结库

    前言 这个是用来进行总结学习的,相当于自学笔记 记录的东西,是随时更新的, 有些东西,可能就是记录下,并不一定代表他一定能解决问题 不要做纯粹的文字的搬运工,要多做灵感整理 我看文章会看好多,所以常常 ...

  5. 离线人脸识别门禁考勤——Android设备端APK及源码免费下载

    适用场景:门禁场景的应用,适合安装在Android系统的门口机.闸机头.Pad等设备上. 主要功能:人员注册.人脸识别开门.考勤打卡.门禁权限管理.识别记录查询等. 预览效果: PC端 设备端1 设备 ...

  6. 使用部分函数时并未include其所在头文件,但是能编译成功且能运行,为什么?

    最近在看APUE,试了上面的一些例子,其中有个例子是使用getpid函数获取进程id,但是在我写demo时,并未引入其所在的头文件unistd.h,结果也能编译成功,也能运行,于是就琢磨下为啥. En ...

  7. .Net MVC5(.Net Framework 4.0+)多语言解决方案

    最近项目需要做多语言,原先是2种语言(中文/英文),现在又要加一种语言,成了3种.那么原来的方式肯定不适用了,只能升级解决方案. 原来的写法,使用三目表达式,按照当前全局变量的语言类型,返回不同的语言 ...

  8. unity探索者之微信分享所有流程,非第三方插件

    版权声明:本文为原创文章,转载请声明http://www.cnblogs.com/unityExplorer/p/7560575.html 很久没有写新博客了,前段时间有些忙,这几天趟了几个微信分享的 ...

  9. 上手了RabbitMQ?再来看看它的交换机(Exchange)吧

    人生终将是场单人旅途,孤独之前是迷茫,孤独过后是成长. 楔子 本篇是消息队列RabbitMQ的第三弹. RabbitMQ的入门和RabbitMQ+SpringBoot的整合可以点此链接进去回顾,今天要 ...

  10. Spring配置文件中bean标签中init-method和destroy-method和用注解方式配置

    Person类: public class Person {       private int i = 0;          public Person(){           System.o ...