解析效果:

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. Vue组件注册

    全局注册方法 Vue.component('my-component-name', { // ... 选项 ... }) Vue.component('component-a', { /* ... * ...

  2. XCTF-WEB-高手进阶区-PHP2-笔记

    鬼才作者...特么卡了我那么长时间,这知识点我真不知道 o(╥﹏╥)o 拿Dirserach扫只能扫出来index.php和index.php/login 一度让我怀疑是有我不会的姿势去解这道题 最后 ...

  3. Java中的File类,递归是什么?

    一.IO概述 当需要把内存中的数据存储到持久化设备上这个动作称为输出(写)Output操作. 当把持久设备上的数据读取到内存中的这个动作称为输入(读)Input操作. 因此我们把这种输入和输出动作称为 ...

  4. golang 设计模式

    前言 不做文字的搬运工,多做灵感性记录 这是平时学习总结的地方,用做知识库 平时看到其他文章的相关知识,也会增加到这里 随着学习深入,会进行知识拆分和汇总,所以文章会随时更新 参考的文章过多.很杂很乱 ...

  5. 使用MSF通过MS17-010获取系统权限

    ---恢复内容开始--- Step1:开启postgresql数据库: /etc/init.d/postgresql start Step2:进入MSF中,搜索cve17-010相关的exp: sea ...

  6. Jmeter 常用函数(29)- 详解 __eval

    如果你想查看更多 Jmeter 常用函数可以在这篇文章找找哦 https://www.cnblogs.com/poloyy/p/13291704.html 作用 和 __V 的作用基本一致,执行变量名 ...

  7. parallel stream-不能随便使用

    前言 java8除了新增stream,还提供了parallel stream-多线程版的stream,parallel stream的优势是:充分利用多线程,提高程序运行效率,但是正确的使用并不简单, ...

  8. Training spiking neural networks for reinforcement learning

    郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! 原文链接:https://arxiv.org/pdf/2005.05941.pdf Contents: Abstract Introduc ...

  9. pandas 数据表中的字符与日期数据的处理

    前面我们有学习过有关字符串的处理和正在表达式,但那都是基于单个字符串或字符串列表的操作.下面将学习如何基于数据框操作字符型变量. 同时介绍一下如何从日期型变量中取出年份,月份,星期几等,如何计算两个日 ...

  10. Python | 多线程死锁问题的巧妙解决方法

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Python专题的第25篇文章,我们一起来聊聊多线程开发当中死锁的问题. 死锁 死锁的原理非常简单,用一句话就可以描述完.就是当多线程 ...