基本说明
sharding-jdbc绝对没有破坏mybatis的工作,相反是和其相辅相成的
建议先看下mybatis的核心流程和原理.也可以参考我的另一篇博客
//www.greatytc.com/p/1e26ed5464e3
mybatis最终也是生成sql,使用jdbc连接进行访问,分库分表最好的时刻就是在jdbc进行访问前拿到sql进行表和库的替换,sharding-jdbc也是这么来弄的,所以我们才会一开始从datasouce就进行替换。
我们使用ShardingDataSource来创建DataSouce
sharding-jdbc核心流程
SQL 解析 => 执行器优化 => SQL 路由 => SQL 改写 => SQL 执行 => 结果归并。
sharding-jdbc和mybatis的接入点
接入点涉及核心方法
org.apache.ibatis.executor.SimpleExecutor#prepareStatement
可以看下下面相关注释(自己加的)
private Statement prepareStatement(StatementHandler handler, Log statementLog) throws SQLException {
Statement stmt;
// 根据数据源类型为SpringShardingDataSource获取到ShardingConnection
Connection connection = getConnection(statementLog);
// 根据ShardingConnection获取到ShardingPreparedStatement
stmt = handler.prepare(connection, transaction.getTimeout());
handler.parameterize(stmt);
return stmt;
}
源码分析
具体的分析过程可以参考一位大佬的文章
//www.greatytc.com/p/8697f62837a2
基本执行流程
- 1、从dataSource中获取Connection对象,dataSource是SpringShardingDataSource对象。
- 2、通过connection准备PreparedStatement对象。(ShardingPreparedStatement)
- 3、设置preparedStatement的参数。
- 4、执行preparedStatement的executeUpdate。
- 5、处理ResultSet对象。
下面是源码断点调试图
sharding-jdbc-v2.gif