欢迎来到天天文库
浏览记录
ID:12913377
大小:332.10 KB
页数:38页
时间:2018-07-19
《sharding-jdbc 源码分析 —— sql 解析(三)之查询sql》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、由于每个数据库在遵守SQL语法规范的同时,又有各自独特的语法。因此,在Sharding-JDBC里每个数据库都有自己的SELECT语句的解析器实现方式,当然绝大部分逻辑是相同的。本文主要分享笔者最常用的MySQL查询。查询SQL解析主流程如下://AbstractSelectParser.javapublicfinalSelectStatementparse(){query();parseOrderBy();customizedSelect();appendDerivedColumns();appendDerivedOrderBy()
2、;returnselectStatement;}·#parseOrderBy() :对于MySQL查询语句解析器无效果,因为已经在 #query() 方法里面已经调用 #parseOrderBy(),因此图中省略该方法。·#customizedSelect() :Oracle、SQLServer查询语句解析器重写了该方法,对于MySQL查询解析器是个空方法,进行省略。有兴趣的同学可以单独去研究研究。Sharding-JDBC正在收集使用公司名单:传送门。传送门Sharding-JDBC也会因此,能够覆盖更多的业务场景。传送门登记吧,骚
3、年!传送门最灵活也是最复杂的,希望大家有耐心看完本文。理解查询语句解析,另外三种语句理解起来简直是SOEASY。骗人是小狗(芋道源码)留言,我会逐条认真耐心回复。骗人是小猪OK,不废话啦,开始我们这段痛并快乐的旅途。2.SelectStatement 本节只介绍这些类,方便本文下节分析源码实现大家能知道认识它们 SelectStatement,查询语句解析结果对象。//SelectStatement.javapublicfinalclassSelectStatementextendsAbstractSQLStatement{/***是
4、否行DISTINCT/DISTINCTROW/UNION*/privatebooleandistinct;/***是否查询所有字段,即SELECT**/privatebooleancontainStar;/***最后一个查询项下一个Token的开始位置**@see#items*/privateintselectListLastPosition;/***最后一个分组项下一个Token的开始位置*/privateintgroupByLastPosition;/***查询项*/privatefinalListitem
5、s=newLinkedList<>();/***分组项*/privatefinalListgroupByItems=newLinkedList<>();/***排序项*/privatefinalListorderByItems=newLinkedList<>();/***分页*/privateLimitlimit;}我们对属性按照类型进行归类:·特殊·distinct·查询字段·containStar·items·selectListLastPosition·分组条件·groupByItem
6、s·groupByLastPosition·排序条件·orderByItems·分页条件·limit2.1AbstractSQLStatement增删改查解析结果对象的抽象父类。publicabstractclassAbstractSQLStatementimplementsSQLStatement{/***SQL类型*/privatefinalSQLTypetype;/***表*/privatefinalTablestables=newTables();/***过滤条件。*只有对路由结果有影响的条件,才添加进数组*/privatef
7、inalConditionsconditions=newConditions();/***SQL标记对象*/privatefinalListsqlTokens=newLinkedList<>();}2.2SQLTokenSQLToken,SQL标记对象接口,SQL改写时使用到。下面都是它的实现类:类说明GeneratedKeyToken自增主键标记对象TableToken表标记对象ItemsToken选择项标记对象OffsetToken分页偏移量标记对象OrderByToken排序标记对象RowCountToken
8、分页长度标记对象3.#query()#query(),查询SQL解析。MySQLSELECTSyntax://https://dev.mysql.com/doc/refman/5.7/en/select.htmlSELE
此文档下载收益归作者所有