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了。