1.解析包整体介绍
1.5.0M1版本以后采用的是自研的解析引擎,支持join、aggregation、order by、group by、limit、or;目前不支持union、部分子查询、函数内分片等不太应在分片场景中出现的SQL解析。
ORM采用的是mybatis
我们可以知道mybatis执行的流程
获取 prepareStatement
private Statement prepareStatement(StatementHandler handler, Log statementLog) throws SQLException {
Statement stmt;
Connection connection = getConnection(statementLog);
stmt = handler.prepare(connection, transaction.getTimeout());
handler.parameterize(stmt);
return stmt;
}
我们可以看到这个获取的方法中,首先我们是需要获取数据库连接
Connection的,connection = dataSource.getConnection();
这里其实就是通过dataSource获取的,在上一篇文章使用中我们知道,这里的dataSource是 ShardingDataSource
所以这里connection其实是 ShardingConnection
@Override
public ShardingConnection getConnection() throws SQLException {
return new ShardingConnection(shardingContext);
}
然后我们根据ShardingConnection 获取到 PreparedStatement 为ShardingPreparedStatement
@Override
public PreparedStatement prepareStatement(final String sql, final String[] columnNames) throws SQLException {
return new ShardingPreparedStatement(this, sql, Statement.RETURN_GENERATED_KEYS);
}
后续的调用就直接走到了shading-jdbc的内部方法 ShardingPreparedStatement的exeute,executeUpdate,executeQuery方法
@Override
public boolean execute() throws SQLException {
try {
Collection<PreparedStatementUnit> preparedStatementUnits = route();
return new PreparedStatementExecutor(
getConnection().getShardingContext().getExecutorEngine(), routeResult.getSqlStatement().getType(), preparedStatementUnits, getParameters()).execute();
} finally {
clearBatch();
}
}
下面我们主要去看