欢迎光临
我们一直在努力

sharding-jdbc源码分析之重写


15. sharding-jdbc源码之EventBus-轻量级进程内事件分发组件

核心源码就在sharding-jdbc-core模块的com.dangdang.ddframe.rdb.sharding.rewrite目录下,包含两个文件SQLBuilderSQLRewriteEngine;测试用例入口为SQLRewriteEngineTest,下面从SQLRewriteEngineTest中debug源码分析sharding-jdbc的重写是如何实现的:

SQLRewriteEngineTest中某个测试用例如下–主要包括表名,offset,limit(rowCount)的重写:

16. sharding-jdbc源码分析之重写

 

重写方法核心源码:

从这段源码可知,sql重写主要包括对表名,limit offset, rowNum以及order by的重写(ItemsToken值对select col1, col2 from… 即查询结果列的重写–指那些由于ordre by或者group by需要增加的结果列);

16. sharding-jdbc源码分析之重写

 

16. sharding-jdbc源码分析之重写

 

表名重写分析

16. sharding-jdbc源码分析之重写

 

offset重写分析

16. sharding-jdbc源码分析之重写

 

rowCount重写分析

16. sharding-jdbc源码分析之重写

 

appendRest分析

private void appendRest(final SQLBuilder sqlBuilder, final int count, final List<SQLToken> sqlTokens, final int beginPosition) {
 // 如果SQL解析后只有一个token,那么结束位置(endPosition)就是sql末尾;否则结束位置就是到下一个token的起始位置
 int endPosition = sqlTokens.size() - 1 == count ? originalSQL.length() : sqlTokens.get(count + 1).getBeginPosition();
 sqlBuilder.appendLiterals(originalSQL.substring(beginPosition, endPosition));
}

所有重写最后都会调用appendRest(),即附加上余下部分内容,这个余下部分内容是指从当前处理的token到下一个token之间的内容,例如SQL为SELECT x.id FROM table_x x LIMIT 5, 10,当遍历到table_x,即处理完TableToken后,由于下一个token为OffsetToken,即5,所以appendRest就是append这一段内容:" x LIMIT "–从table_x到5之间的内容;

SQLBuilder.toString()分析

重写完后,调用SQLBuilder的toString()方法生成重写后最终的SQL语句;

16. sharding-jdbc源码分析之重写

 

 

 收藏 (0) 打赏

您可以选择一种方式赞助本站

支付宝扫一扫赞助

微信钱包扫描赞助

未经允许不得转载:英协网 » sharding-jdbc源码分析之重写

分享到: 生成海报
avatar

热门文章

  • 评论 抢沙发

    • QQ号
    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址

    登录

    忘记密码 ?

    切换登录

    注册

    我们将发送一封验证邮件至你的邮箱, 请正确填写以完成账号注册和激活