[Java]手动构建SQL语法树(sql简单无嵌套)并输出与之对应的SQL语句之二
Entry入口 main中自顶向下手动创建了sql语法树
package com.hy;
// 构建SQL语法树
public class Entry {
public static void main(String[] args) throws Exception {
Node query=new SetNode(" ");
query.addChild(new KeywordNode("Select"));
Node fields=new SetNode(",");
fields.addChild(new ValueNode("name"));
fields.addChild(new ValueNode("ismale"));
query.addChild(fields);
query.addChild(new KeywordNode("From"));
Node tables=new SetNode(",");
tables.addChild(new ValueNode("userinfo"));
query.addChild(tables);
query.addChild(new KeywordNode("Where"));
Node condistions=new SetNode(" and ");
Node ageCompare=new CompareNode(">=");
ageCompare.addChild(new ValueNode("age"));
ageCompare.addChild(new ValueNode("41"));
condistions.addChild(ageCompare);
Node levelCompare=new CompareNode("<");
levelCompare.addChild(new ValueNode("level"));
levelCompare.addChild(new ValueNode("9"));
condistions.addChild(levelCompare);
Node likeCompare=new CompareNode(" like ");
likeCompare.addChild(new ValueNode("name"));
likeCompare.addChild(new ValueNode("'王%'"));
condistions.addChild(likeCompare);
query.addChild(condistions);
query.addChild(new KeywordNode("order by"));
Node orders=new SetNode(",");
orders.addChild(new ValueNode("sn asc"));
orders.addChild(new ValueNode("level desc"));
query.addChild(orders);
System.out.println(query.getSql());
}
}
先把输出秀一下:
Select name,ismale From userinfo Where age>=41 and level<9 and name like '王%' order by sn asc,level desc
再看诸节点类写法:
Node类:
package com.hy;
import java.util.ArrayList;
import java.util.List;
// 节点抽象类,作为各种节点的基类
public abstract class Node {
// 此节点的子节点
protected List<Node> children;
// 表示此节点的文字
protected String text="";
public Node() {
children=new ArrayList<Node>();
}
// 添加一个子节点
public Node addChild(Node n) {
children.add(n);
return this;
}
// 取得节点在sql中该有的文字
public String getSql() throws Exception{
String retval=this.text+"";
for(int i=0;i<children.size();i++) {
Node child=children.get(i);
retval+=child.getSql();
}
return retval;
}
}
KeywordNode类:
package com.hy;
// 关键字节点,比如用来表示SQL中select,from,where,order by等关键字的节点
// 此类节点下面没有子节点
public class KeywordNode extends Node {
public KeywordNode(String keyword) {
this.text=keyword;
}
}
ValueNode类:
package com.hy;
// 值节点,比如用来表示字段,表,条件,数值等节点
// 此类节点下面如果存在查询也可能存在多个子节点
public class ValueNode extends Node {
public ValueNode(String value) {
this.text=value;
}
}
SetNode类:
package com.hy;
import java.util.ArrayList;
import java.util.List;
// 集合节点,比如用来表示SQL中字段组,表组,条件组,and组等容纳多个子节点的的节点,整条SQL也是这个节点
// 此类节点下面一般有多个子节点,如查询多个字段,从多个表查询,包含多个条件,按多种情况排序等
public class SetNode extends Node {
// 子节点之间的分隔符
protected String seperator;
public SetNode() {
seperator="";
}
public SetNode(String seperator) {
this.seperator=seperator;
}
public String getSql() throws Exception{
String retval=this.text+"";
List<String> ls=new ArrayList<String>();
for(int i=0;i<children.size();i++) {
Node child=children.get(i);
ls.add(child.getSql());
}
retval+=String.join(seperator, ls);
return retval;
}
}
CompareNode类:
package com.hy;
// 比较节点,用来表示条件比较的节点,如age>41,level>9
// 此类节点下面理论上存在左右两个节点,如果存在查询也可能存在多个子节点
public class CompareNode extends Node {
public CompareNode(String value) {
this.text=value;
}
public String getSql() throws Exception{
Node left=getLeftChild();
Node right=getRightChild();
String retval=left.getSql()+this.text+right.getSql()+"";
return retval;
}
private Node getLeftChild() throws Exception {
try {
return children.get(0);
}catch(Exception e) {
throw new Exception("No found left node under node'"+this.text+"' ");
}
}
private Node getRightChild() throws Exception {
try {
return children.get(1);
}catch(Exception e) {
throw new Exception("No found Right node under node'"+this.text+"' ");
}
}
}
与前作相比加了异常,这在一定程度上能爆出构建时错误。
--END--2019年9月6日18点46分
[Java]手动构建SQL语法树(sql简单无嵌套)并输出与之对应的SQL语句之二的更多相关文章
- sql语法值ORACLE简单介绍
版权声明:本文为[博主](https://zhangkn.github.io)原创文章,未经博主同意不得转载.https://creativecommons.org/licenses/by-nc-sa ...
- sql 语法树 常量
SELECT id,'|',url,'|',update_time FROM tab LIMIT 10;SELECT COUNT(1) AS parent,(SELECT COUNT(1) FROM ...
- Sql语法树示例 select username, ismale from userinfo where age > 20 and level > 5 and 1 = 1
select username, ismale from userinfo where age > 20 and level > 5 and 1 = 1 --END-2019年9月5日17 ...
- [Java]手动构建表达式二叉树,求值,求后序表达式
Inlet类,这颗二叉树是”人力运维“的: package com.hy; public class Inlet { public static void main(String[] args) th ...
- SQL抽象语法树及改写场景应用
1 背景 我们平时会写各种各样或简单或复杂的sql语句,提交后就会得到我们想要的结果集.比如sql语句,"select * from t_user where user_id > 10 ...
- NoSQL 数据库概览及其与 SQL 语法的比较
NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用的难题. 本文对NoSQL数据库的定义.分类.特征.当前比较流行的NoSQL数据库系统等进行了简单的介绍,并对N ...
- NoSQL数据库概览及其与SQL语法的比較
[文章摘要] HBase是一个高可靠性.高性能.面向列.可伸缩的分布式存储系统.同一时候也是知名的NoSQL数据库之中的一个.NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤 ...
- [数据库] SQL 语法之基础篇
一.什么是 SQL ? SQL 是 Structured Query Language(结构化查询语言)的缩写,是一种专门用来与数据库沟通的语言.与其他语言(如英语或 C.C++.Java 这样的编程 ...
- mysql中SQL执行过程详解与用于预处理语句的SQL语法
mysql中SQL执行过程详解 客户端发送一条查询给服务器: 服务器先检查查询缓存,如果命中了缓存,则立刻返回存储在缓存中的结果.否则进入下一阶段. 服务器段进行SQL解析.预处理,在优化器生成对应的 ...
随机推荐
- hadoop-hive的内表和外表
--创建内表create table if not exists employee(id int comment 'empoyeeid',dateincompany string comment 'd ...
- python之字典一
字典的定义: 前面我们说过列表,它适合于将值组织到一个结构中并且通过编号对其进行引用.字典则是通过名字来引用值的数据结构,并且把这种数据结构称为映射,字典中的值没有特殊的顺序,都存储在一个特定的键(k ...
- Qt设置按钮为圆形
通过Qt 的样式表实现圆形按钮,其也可以实现圆角按钮,当然也可以使用其他的方式,比如说,通过派生按钮类使用绘图事件,进行一个图形的绘制,或者是通过自定义一个类,通过信号与槽的机制与绘图事件的配合也能实 ...
- JavaMaven【六、生命周期】
Maven有三个独立的生命周期,每个生命周期都不会出发别的生命周期的操作 若直接执行生命周期后面的操作,maven会默认执行前面的操作 如项目创建好后,直接执行mvn install,会默认依次执行c ...
- java指定运行jar包中的其中一个main方法
java -cp jar包 类名 java -cp ******.jar com.******.EsEtl
- 内置对象-Math
1.随机数 Math.random() 1)获得0-1之间的随机数 2)0到100:Math.round(Math.random()*100) 2.max:求最大值 ,,,) console.log( ...
- 小程序生成海报 canvas
前言 微信小程序需要生成海报进行朋友圈分享,但是不同的手机会有问题, 然后首先是图片的问题 图片 在模拟器上没有报错,可是真机测试却什么也没画出来. canvas.drawImage 是不支持网络图片 ...
- php类知识----特别用法
spl_autoload_register注册 <?php #spl_autoload_register-----这个例子是用来打印实例化类的类名 function thereisagameof ...
- 9种纯CSS3人物信息卡片动态展示效果
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...
- Error from server (NotFound): the server could not find the requested resource (get services http:heapster:)
kubectl top pod --all-namespaces Error from server (NotFound): the server could not find the request ...