简介
在上两篇文中,我们探索了SQLToken和真实SQL的生成的想关代码,本文继续来探索最开始的一个LogicSQL的生成,补全这一块拼图
源码探索
继续上面两篇的探索:
其中生成真实的SQL有两个要素:
- 逻辑表名到真实表名的映射:这个在SQLToken生成的
- 拼接SQL语句时,对应的index位置,这个目前看来是在LogicSQL中就生成好了的
目前就还差index生成的东西,我们接下来就看看LogicSQL的相关代码:
寻找切入点
下面是LogicSQL的生成部分:
private ExecutionContext createExecutionContext() {
LogicSQL logicSQL = createLogicSQL();
SQLCheckEngine.check(logicSQL.getSqlStatementContext().getSqlStatement(), logicSQL.getParameters(),
metaDataContexts.getMetaData(connection.getSchemaName()).getRuleMetaData().getRules(), connection.getSchemaName(), metaDataContexts.getMetaDataMap(), null);
ExecutionContext result = kernelProcessor.generateExecutionContext(logicSQL, metaDataContexts.getMetaData(connection.getSchemaName()), metaDataContexts.getProps());
findGeneratedKey(result).ifPresent(generatedKey -> generatedValues.addAll(generatedKey.getGeneratedValues()));
return result;
}
private LogicSQL createLogicSQL() {
List<Object> parameters = new ArrayList<>(getParameters());
SQLStatementContext<?> sqlStatementContext = SQLStatementContextFactory.newInstance(metaDataContexts.getMetaDataMap(), parameters, sqlStatement, connection.getSchemaName());
return new LogicSQL(sqlStatementContext, sql, parameters);
}
但通过debug看到相关的东西其实之前就生成好了:

其中的preparedStatement就有了相关的index信息,看来是在某一步就初始化好了的,我们找到对应的初始化语句,如下:
# ShardingSpherePreparedStatement.java
private ShardingSpherePreparedStatement(final ShardingSphereConnection connection, final String sql,
final int resultSetType, final int resultSetConcurrency, final

本文详细探讨了ShardingSphere LogicSQL的生成过程,从源码角度出发,揭示了从逻辑SQL到真实SQL转换的关键步骤。通过分析SQLToken的生成和SQL语句的构造,特别指出在OrderRepositoryImpl.java中触发的解析过程,以及在MySQLStatementParser.java中的复杂解析逻辑,包括插入语句的处理。虽然解析规则复杂,但解析结果为构建真实的SQL提供了必要的元数据和索引信息。
最低0.47元/天 解锁文章
1342

被折叠的 条评论
为什么被折叠?



