源码分析MyCat之SQL解析篇-----sql解析引擎druid之抽象语法树(mycat1

SQLBetweenExpr

  • 1、beginExpr,endExpr是字面值表达式,例如SQLIntegerExpr

  • 2、testExpr,SQLPropertyExpr,例如a.num(字段名)

SQLBinaryOpExpr 二维运算符表,比如 a.name = 1,这个表达式,左边是a.name(SQLPropertyExpr),右边是SQLIntegerExpr(字面量表达式),而中间是运算符,等于。

3、语句(statement)

==================

每一条SQL语句都会对应一个Statement类,比如创建数据库,创建表,删除修改表,查询,更新,删除,插入等语句,本节主要讲解常用的语句进行讲解。

图片如果不清晰,建议下载原图浏览。

SQLAlterDatabaseStatement、SQLCreateDatabaseStatement、SQLDropDatabaseStatement 创建数据库,修改数据库、创建表,创建索引,增加字段等,都会对应一个statement,在这里就不详细展开,根据类名基本就能知道改类对应什么SQL语句。

  • SQLConstraint : SQL约束

  • SQLIfStatement:IF语句,包含ElseIf,Else

  • SQLLoopStatement : sql循环语句。

  • SQLBlockStatement: SQL语句块语句

SQLCallStatement:存储过程描述, 包括存储过程名称,所有参数(包括入参、出参),出参。(SQLVariantRefExpr)。

接下来重点描述,查询语句,插入语句,更新语句,删除语句。

2.1 SQLSelectStatement


查询语句,包含两个属性,一个是SQLSelect对象,一个是List。

SQLSelect来表示一个select查询的各个部分,分为withSubQuery、查询语句主体部分(SQLSelectQuery)、排序(SQLOrderBy)和 List。

查询主体部分SQLSelectQuery包含如下实现类:SQLUnionQuery、SQLSelectQueryBlock、SQLUnionQuery的left,right属性又是一个SQLSelectQuery,不难看出,最终的查询主体部分会落到SQLSelectQueryBlock上。

查询部分(SQLSelectQueryBlock)包括如下组成部分:

  • 查询字段列表 List,如果是 select id,name 这种字段列表,则表示为SQLIdentifierExpr,如果是select a.id,a.name则表示为SQLPropertyExpr。

  • from 属性,类型为SQLTableSource,SQLTableSource有如下几个实现类,SQLExprTableSource、SQLJoinTableSource、SQLSubqueryTableSource、SQLUnionQueryTableSource。

a、SQLExprTableSource:from 后面接简单的表名,例如 select a.id,a.name from acc_user a。

b、SQLJoinTableSource : from 后面的表使用了连接操作,比如select a.id,a.name from acc_user a left join acc_account b on b.user_id=a.id and b.id=a.id, 该对象拥有 SQLTableSource left,right(典型的二叉树结构),joinType属性表明连接的类型。condition,用一个SQLExpr来表示,大家或许会想,如果有两个连怎么办,只用一个SQLExpr如何表示多个条件,其实是通过SQLBinaryOpExpr这个二元操作符来表示的,SQLBinaryOpExpr两个类型为SQLExpr的left,right属性,然后一个运算符。

c、SQLSubqueryTableSource:子查询表,例如 select * from (select a.id,a.name from acc_user a) tmp;该对象内部再持有一个SQLSelect对象。

d、SQLUnionQueryTableSource,union表,,内部持有一个SQLUnionQuery对象。

  • into 属性,类型为SQLExprTableSouce,into关键字后接一个普通的表。

  • where属性,类型为SQLExpr,这里的原理与join 的 on 条件类似,如果有多个条件,会用SQLBinaryOpExpr对象来表示(二元运算符),通过left.right组织成一颗树。

  • groupBy属性 ,SQLSelectGroupByClause,group by a.name,a.id ,首先会有多个a.name,用一个List items表示,用一个SQLExpr表示having。

  • 6)orderBy属性,SQLOrderBy,就是用List,来表示(order by a.id desc,a.create_time desc)

  • limit属性,类型SQLLimit,limit 1,5, (limitoffset,rowCount)就是两个属性,offSet, rowCount。

2.2 SQLInsertStatement


SQLInsertStatement继承自SQLInsertInfo类,MySqlInsertStatement继承SQLInsertStatement。

insert 语句的基本信息,封装在SQLInsertInfo,主要有如下属性:

  • SQLExprTableSource  tableSource,插入目的表名

  • List columns,插入字段列表

  • SQLSelect  query,select 查询语句

  • List valuesList,valeus 列表,与query二选一存在,每一个ValuesClause为一个值列表,想象一下该语句 insert into es_user(id,name) values (1,2),(3,4);

2.3 SQLUpdateStatement


对应更新SQL语句,属性介绍如下:

  • List items, set 字段列表,set a.id=1,a.name=“a”,一个SQLUpdateSetItem由一个SQLExpr column和SQLExpr value来表示。

  • SQLTableSourceTable tableSouce,更新的表名

  • SQLExpr   where,where条件

2.4 SQLDeleteStatement


删除SQL语句,主要属性如下:

  • SQLTableSource tableSource,操作的表名、

  • SQLExpr where,where 条件。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数同学面临毕业设计项目选题时,很多人都会感到无从下手,尤其是对于计算机专业的学生来说,选择一个合适的题目尤为重要。因为毕业设计不仅是我们在大学四年学习的一个总结,更是展示自己能力的重要机会。

因此收集整理了一份《2024年计算机毕业设计项目大全》,初衷也很简单,就是希望能够帮助提高效率,同时减轻大家的负担。
img
img
img

既有Java、Web、PHP、也有C、小程序、Python等项目供你选择,真正体系化!

由于项目比较多,这里只是将部分目录截图出来,每个节点里面都包含素材文档、项目源码、讲解视频

如果你觉得这些内容对你有帮助,可以添加VX:vip1024c (备注项目大全获取)
img

ava、Web、PHP、也有C、小程序、Python等项目供你选择,真正体系化!**

由于项目比较多,这里只是将部分目录截图出来,每个节点里面都包含素材文档、项目源码、讲解视频

如果你觉得这些内容对你有帮助,可以添加VX:vip1024c (备注项目大全获取)
[外链图片转存中…(img-PXITjsol-1712585065483)]

  • 21
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值