Sharding-Jdbc源码学习(五):sharding-jdbc如何进行sql路由(sql路由之sql解析)

本文深入探讨Sharding-Jdbc的SQL路由机制,从创建SQL解析引擎开始,解析SQL的过程,以及如何根据where条件匹配分库规则,揭示了SQL解析、分片规则匹配与数据库类型之间的关系。
摘要由CSDN通过智能技术生成

一,SQL解析之创建SQL解析引擎

SQL路由的前题是需要先解析SQL,那么接上一篇博文继续看分片-JDBC是如何进行SQL解析的,也就是看ParsingSQLRouter中是如何实现Sql解析的(关注红色字体),且看源码。

io.shardingjdbc.core.routing.router.ParsingSQLRouter中代码片段

//ParsingSQLRouter构造器
public ParsingSQLRouter(final ShardingContext shardingContext) {
    shardingRule = shardingContext.getShardingRule();   --分片规则
    databaseType = shardingContext.getDatabaseType();   --数据库类型
    showSQL = shardingContext.isShowSQL();
    generatedKeys = new LinkedList<>();
}

@Override
public SQLStatement parse(final String logicSQL, final int parametersSize) {
    SQLParsingEngine parsingEngine = new SQLParsingEngine(databaseType, logicSQL, shardingRule);
    SQLStatement result = parsingEngine.parse();
    if (result instanceof InsertStatement) {
        ((InsertStatement) result).appendGenerateKeyToken(shardingRule, parametersSize);
    }
    return result;
}

总结:1,代码片段中可以看出创建SQL解析器时已经传入了分片上下文ShardingContext,上下文中携带分片规则,数据库类型等信息,为SQL路由做数据准备0.2,SQL解析任务又由SQL解析器完美的交给了SQL解析引擎SQLParsingEngine,那么继续深挖SQL解析引擎是如何进行SQL解析的,且看SQL解析引擎源码如下。

二,SQL解析引擎如何解析SQL

io.shardingjdbc.core.parsing.SQLParsingEngine.parse()
public final class SQLParsingEngine {
    
    private final DatabaseType dbType;
    
    private final String sql;
    
    private final ShardingRule shardingRule;
    
    /**
     * Parse SQL.
     * 
     * @return parsed SQL statement
     */
    public SQLStatement parse() {
        LexerEngine lexerEngine = LexerEngineFactory.newInstance(dbType, sql);
        lexerEngine.nextToken();
        retur
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值