阿飞Javaer,转载请注明原创出处,谢谢!!
核心源码就在sharding-jdbc-core
模块的com.dangdang.ddframe.rdb.sharding.rewrite
目录下,包含两个文件SQLBuilder和SQLRewriteEngine;测试用例入口为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