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语句之二的更多相关文章

  1. sql语法值ORACLE简单介绍

    版权声明:本文为[博主](https://zhangkn.github.io)原创文章,未经博主同意不得转载.https://creativecommons.org/licenses/by-nc-sa ...

  2. sql 语法树 常量

    SELECT id,'|',url,'|',update_time FROM tab LIMIT 10;SELECT COUNT(1) AS parent,(SELECT COUNT(1) FROM ...

  3. 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 ...

  4. [Java]手动构建表达式二叉树,求值,求后序表达式

    Inlet类,这颗二叉树是”人力运维“的: package com.hy; public class Inlet { public static void main(String[] args) th ...

  5. SQL抽象语法树及改写场景应用

    1 背景 我们平时会写各种各样或简单或复杂的sql语句,提交后就会得到我们想要的结果集.比如sql语句,"select * from t_user where user_id > 10 ...

  6. NoSQL 数据库概览及其与 SQL 语法的比较

    NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用的难题. 本文对NoSQL数据库的定义.分类.特征.当前比较流行的NoSQL数据库系统等进行了简单的介绍,并对N ...

  7. NoSQL数据库概览及其与SQL语法的比較

    [文章摘要] HBase是一个高可靠性.高性能.面向列.可伸缩的分布式存储系统.同一时候也是知名的NoSQL数据库之中的一个.NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤 ...

  8. [数据库] SQL 语法之基础篇

    一.什么是 SQL ? SQL 是 Structured Query Language(结构化查询语言)的缩写,是一种专门用来与数据库沟通的语言.与其他语言(如英语或 C.C++.Java 这样的编程 ...

  9. mysql中SQL执行过程详解与用于预处理语句的SQL语法

    mysql中SQL执行过程详解 客户端发送一条查询给服务器: 服务器先检查查询缓存,如果命中了缓存,则立刻返回存储在缓存中的结果.否则进入下一阶段. 服务器段进行SQL解析.预处理,在优化器生成对应的 ...

随机推荐

  1. celery:强大的定时任务模块

    什么是celery 还是一个老生常谈的话题,假设用户注册,首先注册信息入库,然后要调用验证码服务接口,然后根据手机号发送验证码,最后再返回响应给浏览器.但显然调用接口.发送验证码之后成功再给浏览器响应 ...

  2. 修改tomcat 端口

    假设tomcat所在目录为/usr/local/apache-tomcat/ 1.打开tomcat配置文件#vi /usr/local/apache-tomcat/conf/server.xml 2. ...

  3. git生成公钥public key并添加SSH key。git乌龟gerrit下推送git【server sent :publickey】

    一.key 码云链接:http://git.mydoc.io/?t=180845#text_180845 博客链接: 方式一:https://blog.csdn.net/xb12369/article ...

  4. sysbench运行autogen.sh报错

    ./autogen.sh: 4: autoreconf: not found是在不同版本的 tslib 下执行 autogen.sh 产生.它们产生的原因一样,是因为没有安装automake 工具, ...

  5. Vue 页面 前进刷新 后退不刷新(keepAlive)

    前言 遇到这一个个问题  需要是这样的 Vue里面的不刷新问题 页面分为: A 主页  B列表页  C 详情页 A  beforeRouteLeave 时设置 to.meta.keepAlive = ...

  6. AOP初步

    一刀切的AOP基础 软件开发的目的,最终是为了解决各种需求,包括业务和系统的,使用OOP可以对业务需求等普通关注点进行很好的抽象和封装,并且使之模块化. 但OOP却无法解决类似于日志.安全.事务等系统 ...

  7. 《深入理解java虚拟机》——读后笔记(一)(内存部分)

    一.内存区域的划分(运行时数据区域) ①程序计数器:程序计数器是一块较小的内存区域,字节码解释器通过改变此计数器的值来选取下一条要执行的字节码指令,可以看成是当前线程执行字节码的行号指示器.线程执行时 ...

  8. 导出excel 各 cvs 的方法

    public function orderExcelExport($data,$filename='simple.xls'){ ini_set('max_execution_time', '0'); ...

  9. 小程序开发之后台mybatis逆向工程(二)

    上一节搭建好了SSM后台框架,这一节将根据表结构创建实体及映射文件以及mapper接口.如果表过多,会很麻烦,所以mybatis提供了逆向工程来解决这个问题. 上一节 SSM搭建后台管理系统 逆向工程 ...

  10. ueditor编辑器+粘贴word

    最近公司做项目需要实现一个功能,在网页富文本编辑器中实现粘贴Word图文的功能. 我们在网站中使用的Web编辑器比较多,都是根据用户需求来选择的.目前还没有固定哪一个编辑器 有时候用的是UEditor ...