docs: private Object executeBatch(StatementRuntime... runtimes) {
          int[] updatedArray = new int[runtimes.length];
          Map<String, List<StatementRuntime>> batchs = new HashMap<String, List<StatementRuntime>>();
          for (int i = 0; i < runtimes.length; i++) {
              StatementRuntime runtime = runtimes[i];
              List<StatementRuntime> batch = batchs.get(runtime.getSQL());
              if (batch == null) {
                  batch = new ArrayList<StatementRuntime>(runtimes.length);
                  batchs.put(runtime.getSQL(), batch);
              }
              runtime.setAttribute("_index_at_batch_", i); // 该runtime在batch中的位置
              batch.add(runtime);
          }
          // TODO: 多个真正的batch可以考虑并行执行(而非顺序执行)~待定
          for (Map.Entry<String, List<StatementRuntime>> batch : batchs.entrySet()) {
              String sql = batch.getKey();
              List<StatementRuntime> batchRuntimes = batch.getValue();
              StatementRuntime runtime = batchRuntimes.get(0);
              DataAccess dataAccess = dataAccessFactory.getDataAccess(//
                  runtime.getMetaData(), runtime.getAttributes());
              List<Object[]> argsList = new ArrayList<Object[]>(batchRuntimes.size());
              for (StatementRuntime batchRuntime : batchRuntimes) {
                  argsList.add(batchRuntime.getArgs());
              }
              int[] batchResult = dataAccess.batchUpdate(sql, argsList);
              if (batchs.size() == 1) {
                  updatedArray = batchResult;
              } else {
                  int index_at_sub_batch = 0;
                  for (StatementRuntime batchRuntime : batchRuntimes) {
                      Integer _index_at_batch_ = batchRuntime.getAttribute("_index_at_batch_");
                      updatedArray[_index_at_batch_] = batchResult[index_at_sub_batch++];
                  }
              }
          }
          if (returnType == void.class) {
              return null;
          }
          if (returnType == int[].class) {
              return updatedArray;
          }
          if (returnType == Integer.class || returnType == Boolean.class) {
              int updated = 0;
              for (int value : updatedArray) {
                  updated += value;
              }
              return returnType == Boolean.class ? updated > 0 : updated;
          }
          throw new InvalidDataAccessApiUsageException(
              "bad return type for batch update: " + runtimes[0].getMetaData().getMethod());
      }