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

本文主要分析了sharding-jdbc的源码,着重探讨了表名、offset、rowCount的重写过程,以及SQLBuilder.toString()在生成最终SQL语句中的作用。通过SQLRewriteEngineTest的测试用例,展示了如何实现数据库分片后的SQL改写,包括对limit、offset和order by的处理,并解释了appendRest()方法的作用。
摘要由CSDN通过智能技术生成

阿飞Javaer,转载请注明原创出处,谢谢!!

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

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

@Test
public void assertRewriteForLimit() {
    selectStatement.setLimit(new Limit(true));
    // offset的值就是limit offset,rowCount中offset的值
    selectStatement.getLimit().setOffset(new LimitValue(2, -1));
    // rowCount的值就是limit offset,rowCount中rowCount的值
    selectStatement.getLimit().setRowCount(new LimitValue(2, -1));
    // TableToken的值表示表名table_x在原始SQL语句的偏移量是17的位置
    selectStatement.getSqlTokens().add(new TableToken(17, "table_x"));
    // OffsetToken的值表示offset在原始SQL语句的偏移量是33的位置(2就是offset的值)
    selectStatement.getSqlTokens().add(new OffsetToken(33, 2));
    // RowCountToken的值表示rowCount在原始SQL语句的偏移量是36的位置(2就是rowCount的值)
    selectStatement.getSqlTokens().add(new RowCountToken(36, 2));
    // selectStatement值模拟过程,实际上是SQL解释过程(SQL解释会单独分析)
    SQLRewriteEngine rewriteEngine = new SQLRewriteEngine(shardingRule, "SELECT x.id FROM table_x x LIMIT 2, 2", selectStatement);
    // 重写的核心就是这里了:rewriteEngine.rewrite(true)
    assertThat(rewriteEngine.rewrite(true).toSQL(tableTokens), is("SELECT x.id FROM table_1 x LIMIT
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值