9. 执行StandardRoutingEngine#route获取路由结果,获取分表规则以及分库分表对应的字段列,获取分库分表对应的字段对应的具体值,
public RoutingResult route() {
TableRule tableRule = shardingRule.getTableRule(logicTableName);
Collection<String> databaseShardingColumns = shardingRule.getDatabaseShardingStrategy(tableRule).getShardingColumns();
Collection<String> tableShardingColumns = shardingRule.getTableShardingStrategy(tableRule).getShardingColumns();
Collection<DataNode> routedDataNodes = new LinkedHashSet<>();
if (HintManagerHolder.isUseShardingHint()) {
List<ShardingValue> databaseShardingValues = getDatabaseShardingValuesFromHint(databaseShardingColumns);
List<ShardingValue> tableShardingValues = getTableShardingValuesFromHint(tableShardingColumns);
Collection<DataNode> dataNodes = route(tableRule, databaseShardingValues, tableShardingValues);
for (ShardingCondition each : shardingConditions.getShardingConditions()) {
if (each instanceof InsertShardingCondition) {
((InsertShardingCondition) each).getDataNodes().addAll(dataNodes);
}
}
routedDataNodes.addAll(dataNodes);
} else {
if (shardingConditions.getShardingConditions().isEmpty()) {
routedDataNodes.addAll(route(tableRule, Collections.<ShardingValue>emptyList(), Collections.<ShardingValue>emptyList()));
} else {
for (ShardingCondition each : shardingConditions.getShardingConditions()) {
List<ShardingValue> databaseShardingValues = getShardingValues(databaseShardingColumns, each);
List<ShardingValue> tableShardingValues = getShardingValues(tableShardingColumns, each);
Collection<DataNode> dataNodes = route(tableRule, databaseShardingValues, tableShardingValues);
routedDataNodes.addAll(dataNodes);
if (each instanceof InsertShardingCondition) {
((InsertShardingCondition) each).getDataNodes().addAll(dataNodes);
}
}
}
}
return generateRoutingResult(routedDataNodes);
}
路由到对应的数据节点,获取到实际存在的数据库源和表名,再根据xml文件中配置的策略进行选择StandardShardingStrategy#doSharding,PreciseShardingAlgorithm#doSharding选择符合条件的数据节点。
private Collection<DataNode> route(final TableRule tableRule, final List<ShardingValue> databaseShardingValues, final List<ShardingValue> tableShardingValues) {
Collection<String> routedDataSources = routeDataSources(tableRule, databaseShardingValues);
Collection<DataNode> result = new LinkedList<>();
for (String each : routedDataSources) {
result.addAll(routeTables(tableRule, each, tableShardingValues));
}
return result;
}
生成最后的路由结果,保存对应的数据库原,保存逻辑表名和实际表名的对应关系。
10. 创建sql语句重写引擎SQLRewriteEngine,重写表名appendTablePlaceholder(result, (TableToken) each, count, sqlTokens);重写()字段列值appendInsertValuesToken(