SQL Builder 1.04
解析效果:
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的更多相关文章
- xorm的sql builder
最近在使用xorm,并使用了sql builder来构建sql查询没想到升级后原来可以使用的代码居然报错了. 0x00 代码 sql, args, _ := builder.Select(" ...
- SQL Server 基础 04 函数与分组查询数据
函数与分组查询数据 系统函数分 聚合函数.数据类型转换函数.日期函数.数学函数 . . . 1. 聚合函数 主要是对一组值进行计算,然后返回一个值. 聚合函数包括 sum(求和).avg(求平均值). ...
- 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 ...
- 10046事件跟踪会话sql
背景知识: 10046 事件按照收集信息内容,可以分成4个级别: Level 1: 等同于SQL_TRACE 的功能 Level 4: 在Level 1的基础上增加收集绑定变量的信息 Level 8: ...
- MyBatis(3.2.3) - Dynamic SQL
Sometimes, static SQL queries may not be sufficient for application requirements. We may have to bui ...
- 【开源.NET】轻量级内容管理框架Grissom.CMS(第三篇解析配置文件和数据以转换成 sql)
该篇是 Grissom.CMS 框架系列文章的第三篇, 主要介绍框架用到的核心库 EasyJsonToSql, 把标准的配置文件和数据结构解析成可执行的 sql. 该框架能实现自动化增删改查得益于 E ...
- Spring+SpringMVC+MyBatis+easyUI整合优化篇(十二)数据层优化-explain关键字及慢sql优化
本文提要 从编码角度来优化数据层的话,我首先会去查一下项目中运行的sql语句,定位到瓶颈是否出现在这里,首先去优化sql语句,而慢sql就是其中的主要优化对象,对于慢sql,顾名思义就是花费较多执行时 ...
- Go sql语句引号问题
使用Go进行Mysql开发时,会遇到引号问题(实际上,与语言无关,只要使用sql就会遇到这些类似问题). 本文举例说明如何解决这些问题. Example1 第一例子演示格式字符是否要加引号. 代码如下 ...
- PetaPoco源代码学习--3.Sql类
PetaPoco对数据库的操作直接使用SQL语句,在代码中进行调用既可以直接传递SQL语句,也可以使用提供的SQL类来获取到SQL语句进行操作,直接传递SQL语句在内部实现中也是封装成Sql类传递到底 ...
随机推荐
- spring boot项目集成zuul网关
1 zuul简介 Zuul 的官方介绍是 “Zuul is the front door for all requests from devices and web sites to the back ...
- Docker 启动 Nginx
Docker 启动 Nginx 拉取镜像 docker pull nginx:1.17.9 启动步骤 # 创建 nginx 目录 mkdir -p /usr/local/nginx && ...
- AlgorithmMan,一套免费的算法演示神器
概述 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/971 访问. 文章末尾附带GitHub开源下载地址. 0.概述 ...
- golang 总结库
前言 这个是用来进行总结学习的,相当于自学笔记 记录的东西,是随时更新的, 有些东西,可能就是记录下,并不一定代表他一定能解决问题 不要做纯粹的文字的搬运工,要多做灵感整理 我看文章会看好多,所以常常 ...
- 离线人脸识别门禁考勤——Android设备端APK及源码免费下载
适用场景:门禁场景的应用,适合安装在Android系统的门口机.闸机头.Pad等设备上. 主要功能:人员注册.人脸识别开门.考勤打卡.门禁权限管理.识别记录查询等. 预览效果: PC端 设备端1 设备 ...
- 使用部分函数时并未include其所在头文件,但是能编译成功且能运行,为什么?
最近在看APUE,试了上面的一些例子,其中有个例子是使用getpid函数获取进程id,但是在我写demo时,并未引入其所在的头文件unistd.h,结果也能编译成功,也能运行,于是就琢磨下为啥. En ...
- .Net MVC5(.Net Framework 4.0+)多语言解决方案
最近项目需要做多语言,原先是2种语言(中文/英文),现在又要加一种语言,成了3种.那么原来的方式肯定不适用了,只能升级解决方案. 原来的写法,使用三目表达式,按照当前全局变量的语言类型,返回不同的语言 ...
- unity探索者之微信分享所有流程,非第三方插件
版权声明:本文为原创文章,转载请声明http://www.cnblogs.com/unityExplorer/p/7560575.html 很久没有写新博客了,前段时间有些忙,这几天趟了几个微信分享的 ...
- 上手了RabbitMQ?再来看看它的交换机(Exchange)吧
人生终将是场单人旅途,孤独之前是迷茫,孤独过后是成长. 楔子 本篇是消息队列RabbitMQ的第三弹. RabbitMQ的入门和RabbitMQ+SpringBoot的整合可以点此链接进去回顾,今天要 ...
- Spring配置文件中bean标签中init-method和destroy-method和用注解方式配置
Person类: public class Person { private int i = 0; public Person(){ System.o ...