文档详情

Sharding-JDBC 源码分析 —— SQL 解析(三)之查询SQL.docx

发布:2018-05-11约2.43万字共38页下载文档
文本预览下载声明
由于每个数据库在遵守 SQL 语法规范的同时,又有各自独特的语法。因此,在 Sharding-JDBC 里每个数据库都有自己的 SELECT 语句的解析器实现方式,当然绝大部分逻辑是相同的。本文主要分享笔者最常用的 MySQL 查询。查询 SQL 解析主流程如下:// AbstractSelectParser.javapublicfinal SelectStatement parse(){ query(); parseOrderBy(); customizedSelect(); appendDerivedColumns(); appendDerivedOrderBy();return selectStatement;}#parseOrderBy()?:对于 MySQL 查询语句解析器无效果,因为已经在?#query()?方法里面已经调用?#parseOrderBy(),因此图中省略该方法。#customizedSelect()?:Oracle、SQLServer 查询语句解析器重写了该方法,对于 MySQL 查询解析器是个空方法,进行省略。有兴趣的同学可以单独去研究研究。Sharding-JDBC 正在收集使用公司名单:传送门。传送门Sharding-JDBC 也会因此,能够覆盖更多的业务场景。传送门登记吧,骚年!传送门最灵活也是最复杂的,希望大家有耐心看完本文。理解查询语句解析,另外三种语句理解起来简直是 SO EASY。骗人是小狗(芋道源码)留言,我会逐条认真耐心回复。骗人是小猪OK,不废话啦,开始我们这段痛并快乐的旅途。2. SelectStatement?本节只介绍这些类,方便本文下节分析源码实现大家能知道认识它们?SelectStatement,查询语句解析结果对象。// SelectStatement.javapublicfinalclassSelectStatementextendsAbstractSQLStatement{/** * 是否行 DISTINCT / DISTINCTROW / UNION */privateboolean distinct;/** * 是否查询所有字段,即 SELECT * */privateboolean containStar;/** * 最后一个查询项下一个 Token 的开始位置 * * @see #items */privateint selectListLastPosition;/** * 最后一个分组项下一个 Token 的开始位置 */privateint groupByLastPosition;/** * 查询项 */privatefinal ListSelectItem items = new LinkedList();/** * 分组项 */privatefinal ListOrderItem groupByItems = new LinkedList();/** * 排序项 */privatefinal ListOrderItem orderByItems = new LinkedList();/** * 分页 */private Limit limit;}我们对属性按照类型进行归类:特殊distinct查询字段containStaritemsselectListLastPosition分组条件groupByItemsgroupByLastPosition排序条件orderByItems分页条件limit2.1 AbstractSQLStatement增删改查解析结果对象的抽象父类。publicabstractclassAbstractSQLStatementimplementsSQLStatement{/** * SQL 类型 */privatefinal SQLType type;/** * 表 */privatefinal Tables tables = new Tables();/** * 过滤条件。 * 只有对路由结果有影响的条件,才添加进数组 */privatefinal Conditions conditions = new Conditions();/** * SQL标记对象 */privatefinal ListSQLToken sqlTokens = new LinkedList();}2.2 SQLTokenSQLToken,SQL标记对象接口,SQL 改写时使用到。下面都是它的实现类:类说明Genera
显示全部
相似文档