sharding-jdbc学习(二) ---SQL解析

SQL解析

作用:主要是把逻辑sql语句(Mapper.xml中的sql语句)装在到sharding-jdbc的数据模型中,为后期的sql路由处理做基础工作。

public void query() {
     if (getSqlParser().equalAny(DefaultKeyword.SELECT)) {
         getSqlParser().getLexer().nextToken();
         parseDistinct();
         getSqlParser().skipAll(MySQLKeyword.HIGH_PRIORITY, DefaultKeyword.STRAIGHT_JOIN, MySQLKeyword.SQL_SMALL_RESULT, MySQLKeyword.SQL_BIG_RESULT, MySQLKeyword.SQL_BUFFER_RESULT,
                 MySQLKeyword.SQL_CACHE, MySQLKeyword.SQL_NO_CACHE, MySQLKeyword.SQL_CALC_FOUND_ROWS);
         parseSelectList(); // 解析 查询字段
         skipToFrom(); // 跳到 FROM 处
     }
     parseFrom();// 解析 表(JOIN ON / FROM 单&多表)
     parseWhere(); // 解析 WHERE 条件
     parseGroupBy(); // 解析 Group By 和 Having(目前不支持)条件
     parseOrderBy(); // 解析 Order By 条件
     parseLimit(); // 解析 分页 Limit 条件
     // [PROCEDURE] 暂不支持
     if (getSqlParser().equalAny(DefaultKeyword.PROCEDURE)) {
         throw new SQLParsingUnsupportedException(getSqlParser().getLexer().getCurrentToken().getType());
     }
     queryRest();
  }

​ sql解析大体干了什么事大家都清楚,但是由于sql语句的灵活,场景很多,使得解析的工作很繁琐。

举例

当逻辑sql为:SELCET * from user_info where user_id = 5548;

那么解析之后该sql语句被分隔成三个部分:【SELCET * from】【user_info】【where user_id = ?】,为后续步骤做准备。

值得注意的是sql语句的标识符:“=”、“ in”、“between”,这些是sharding-jdbc支持的

有些sql的语句是不支持的如下:

  
  SELECT DISTINCT * FROM tbl_name WHERE column1 = value1 /*DISTINCT关键字*/
  ​
  SELECT COUNT(col1) as count_alias FROM tbl_name GROUP BY col1 HAVING count_alias > val1 /* '>'、'<'号 */
  ​
  SELECT * FROM tbl_name1 UNION SELECT * FROM tbl_name2 /* UNION */
  ​
  SELECT * FROM tbl_name1 UNION ALL SELECT * FROM tbl_name2
  

总结

SQL解析部分,个人觉得了解了解就ok了。

猜你喜欢

转载自blog.csdn.net/qq_40259907/article/details/86523328