public SQLStatement parse(boolean useCache) {
//ShardingSphere将使用PreparedStatement的SQL解析的语法树放入缓存。 因此建议采用PreparedStatement这种SQL预编译的方式提升性能。
Optional<SQLStatement> cachedSQLStatement = this.getSQLStatementFromCache(useCache);
if (cachedSQLStatement.isPresent()) {
return (SQLStatement)cachedSQLStatement.get();
} else {
//词法解析
LexerEngine lexerEngine = LexerEngineFactory.newInstance(this.dbType, this.sql);
//语法解析
SQLStatement result = SQLParserFactory.newInstance(this.dbType, this.shardingRule, lexerEngine, this.shardingTableMetaData, this.sql).parse();
if (useCache) {
ParsingResultCache.getInstance().put(this.sql, result);
return result;
SQLStatement对象是个超类,具体实现类有很多。按照不同的语句,解析成不同的SQLStatement。

SQLStatement api:

不同的语句,ddl,dml,tcl等,有不同的语法解析器SQLParser去解析,与词法分析器一样使用工厂模式,词法分析器Lexer在解析Sql的时候,第一个分词就是SQL的具体类型(select,update),所以在执行sql的时候,首先调用词法分析器解析第一个分词,再按照不同类型的SQL选择不同的语法解析器。根据数据库类型,DB类型分词解析器获取语法解析器。