基本說明
sharding-jdbc絕對沒有破壞mybatis的工作片习,相反是和其相輔相成的
建議先看下mybatis的核心流程和原理.也可以參考我的另一篇博客
http://www.reibang.com/p/1e26ed5464e3
mybatis最終也是生成sql,使用jdbc連接進行訪問痪宰,分庫分表最好的時刻就是在jdbc進行訪問前拿到sql進行表和庫的替換行疏,sharding-jdbc也是這么來弄的匆光,所以我們才會一開始從datasouce就進行替換。
我們使用ShardingDataSource來創(chuàng)建DataSouce
sharding-jdbc核心流程
SQL 解析 => 執(zhí)行器優(yōu)化 => SQL 路由 => SQL 改寫 => SQL 執(zhí)行 => 結(jié)果歸并酿联。
sharding-jdbc和mybatis的接入點
接入點涉及核心方法
org.apache.ibatis.executor.SimpleExecutor#prepareStatement
可以看下下面相關(guān)注釋(自己加的)
private Statement prepareStatement(StatementHandler handler, Log statementLog) throws SQLException {
Statement stmt;
// 根據(jù)數(shù)據(jù)源類型為SpringShardingDataSource獲取到ShardingConnection
Connection connection = getConnection(statementLog);
// 根據(jù)ShardingConnection獲取到ShardingPreparedStatement
stmt = handler.prepare(connection, transaction.getTimeout());
handler.parameterize(stmt);
return stmt;
}
源碼分析
具體的分析過程可以參考一位大佬的文章
http://www.reibang.com/p/8697f62837a2
基本執(zhí)行流程
- 1终息、從dataSource中獲取Connection對象夺巩,dataSource是SpringShardingDataSource對象。
- 2周崭、通過connection準(zhǔn)備PreparedStatement對象劲够。(ShardingPreparedStatement)
- 3、設(shè)置preparedStatement的參數(shù)休傍。
- 4、執(zhí)行preparedStatement的executeUpdate蹲姐。
- 5磨取、處理ResultSet對象。
下面是源碼斷點調(diào)試圖
sharding-jdbc-v2.gif