code: private int getTotalCount(String sql, Connection conn, MappedStatement ms, BoundSql boundSql) throws SQLException {
      int start = sql.indexOf("from");
      if (start == -1) {
        throw new RuntimeException("statement has no 'from' keyword");
      }
      int stop = sql.indexOf("order by");
      if (stop == -1) {
        stop = sql.length();
      }
  
      String countSql = "select count(0) " + sql.substring(start, stop);
      BoundSql countBoundSql = new BoundSql(ms.getConfiguration(), countSql, boundSql.getParameterMappings(), boundSql.getParameterObject());
      ParameterHandler parameterHandler = new DefaultParameterHandler(ms, boundSql.getParameterObject(), countBoundSql);
      PreparedStatement stmt = null;
      ResultSet rs = null;
      int count = 0;
      try {
        stmt = conn.prepareStatement(countSql);
        // 通过parameterHandler给PreparedStatement对象设置参数
        parameterHandler.setParameters(stmt);
        rs = stmt.executeQuery();
        if (rs.next()) {
          count = rs.getInt(1);
        }
      } finally {
        CloseableUtil.closeQuietly(rs);
        CloseableUtil.closeQuietly(stmt);
      }
      return count;
    }
docs: 获取总记录数
  
  @param sql      原始sql语句
  @param conn
  @param ms
  @param boundSql
  @return
  @throws SQLException