7 Star 74 Fork 29

JustryDeng / notebook

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
[11]sql打印的时机.md 2.25 KB
一键复制 编辑 原始数据 按行查看 历史
JustryDeng 提交于 2023-05-29 12:35 . sql打印的时机

sql打印的时机

以SimpleExecutor执行器示例说明

声明:本人这里为简单说明,如果需要更进一步的验证的话,可以运行程序时dump对应Mapper接口的代理实现类,直接查看代码实现类里面的代码逻辑

源码位置:org.apache.ibatis.executor.SimpleExecutor#doQuery

  @Override
  public <E> List<E> doQuery(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException {
    Statement stmt = null;
    try {
      Configuration configuration = ms.getConfiguration();
      StatementHandler handler = configuration.newStatementHandler(wrapper, ms, parameter, rowBounds, resultHandler, boundSql);
      stmt = prepareStatement(handler, ms.getStatementLog()); // 将prepare语句发给数据库. 此代码执行完毕后,还未实际查询数据库表数据
      return handler.query(stmt, resultHandler); // 将prepare语句的参数发送给数据库,执行并返回结果。此代码执行完毕后,已完成实际查询数据库表数据
    } finally {
      closeStatement(stmt);
    }
  }

结论:

数据库这里以mysql为例

  • 第一步:应用获取mysql连接

  • 第二步:prepareStatement(handler, ms.getStatementLog()),应用打印prepare语句并发送prepare语句到mysql

  • 第三步:handler.query(stmt, resultHandler)

    注:这里的小步骤的顺序,是本人通过查询一个500w条数据表观察出来的

    2023-05-29 12:22:19.584 DEBUG 21764 [main] com.demo.idea.mapper.TmpMapper.selectCount:137 ==>  Preparing: SELECT COUNT(*) FROM `tmp_t`
    2023-05-29 12:22:19.619 DEBUG 21764 [main] com.demo.idea.mapper.TmpMapper.selectCount:137 ==>  Parameters: 
    2023-05-29 12:24:35.580 DEBUG 21764 [main] com.demo.idea.mapper.TmpMapper.selectCount:137 <==  Total: 1
    1. 第一小步:应用打印prepare的参数
    2. 第二小步:应用将prepare的参数发送到mysql
    3. 第三小步:mysql将prepare的参数和prepare语句组合成完整的sql,查询数据库数据并返回给应用
    4. 第四小步:应用打印受影响行数total
1
https://gitee.com/JustryDeng/notebook.git
git@gitee.com:JustryDeng/notebook.git
JustryDeng
notebook
notebook
master

搜索帮助