antlr4 mysql_sharding-jdbc之ANTLR4 SQL解析

本文介绍了Sharding-JDBC如何利用ANTLR4解析MySQL SQL的详细流程。从解析入口开始,包括SQLParseEntry的parse方法、ShardingSQLParseEntry的getSQLParseEngine方法,再到ShardingParseRuleRegistry的初始化配置加载,然后深入SQLParseEngine的parse过程,直至最终SQLStatement的填充。解析过程中涉及到SQLParserFactory、ANTLR4解析、SQLSegmentsExtractorEngine的提取和SQLStatementFillerEngine的填充等关键步骤。
摘要由CSDN通过智能技术生成

公众号:帽爹的技术轮子

Sharding主要利用ANTLR4来解析SQL,以mysql为例,分析源码前可以先了解以下三点:

源码分析

1.解析入口ParsingSQLRouter#parse /**

* 解析sql

*

* @param logicSQL 逻辑sql

* @param useCache 是否缓存解析后的结果

* @return

*/

@Override

public SQLStatement parse(final String logicSQL, final boolean useCache) {

//解析前钩子,如:调用链etx

parsingHook.start(logicSQL);

try {

//解析SQL

SQLStatement result = new ShardingSQLParseEntry(databaseType, shardingMetaData.getTable(), parsingResultCache).parse(logicSQL, useCache);

//解析成功后钩子

parsingHook.finishSuccess(result, shardingMetaData.getTable());

return result;

// CHECKSTYLE:OFF

} catch (final Exception ex) {

// CHECKSTYLE:ON

//解析失败钩子

parsingHook.finishFailure(ex);

throw ex;

}

} public final class ShardingSQLParseEntry extends SQLParseEntry {

private final DatabaseType databaseType;

private final ShardingTableMetaData shardingTableMetaData;

public ShardingSQLParseEntry(final DatabaseType databaseType, final ShardingTableMetaData shardingTableMetaData, final ParsingResultCache parsingResultCache) {

super(parsingResultCache);

this.databaseType = databaseType;

this.shardingTableMetaData = shardingTableMetaData;

}

/**

* 根据sql获取解析引擎封装对象

*/

@Override

protected SQLParseEngine getSQLParseEngine(final String sql) {

//参数1:单例,加载statement、提取、过滤配置文件

//参数2:数据库类型

//参数3:需要解析sql

//参数4:分片表元数据

return new SQLParseEngine(ShardingParseRuleRegistry.getInstance(), databaseType, sql, shardingTableMetaData);

}

}

2.ShardingParseRuleRegistry.getInstance()->ParseRuleRegistry#initParseRuleDefinition加载statement、提取、过滤配置文件 private void initParseRuleDefinition() {

//利用JAXB加载META-INF/parsing-rule-definition/extractor-rule-definition.xml配置文件

ExtractorRuleDefinitionEntity generalExtractorRuleEntity = extractorRuleLoader.load(RuleDefinitionFileConstant.getExtractorRuleDefinitionFile());

//利用JAXB加载下META-INF/parsing-rule-definition/filler-rule-definition.xml配置文件

FillerRuleDefinitionEntity generalFillerRuleEntity = fillerRuleLoader.load(RuleDefinitionFileConstant.getFillerRuleDefinitionFile());

//加对应类型(sharding、masterslave、encrypt)配置文件

//META-INF/parsing-rule-definition/sharding/filler-rule-definition.xml

FillerRuleDefinitionEntity featureGeneralFillerRuleEntity = fillerRuleLoader.load(RuleDefinitionFileConstant.getFillerRuleDefinitionFile(getType()));

//根据数据库类型加载对应的配置文件

for (DatabaseType each : SQLParserFacto

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值