code: public <I, O> List<O> groupExecute(
          final Collection<ShardingExecuteGroup<I>> inputGroups, final ShardingGroupExecuteCallback<I, O> firstCallback, final ShardingGroupExecuteCallback<I, O> callback, final boolean serial)
          throws SQLException {
          if (inputGroups.isEmpty()) {
              return Collections.emptyList();
          }
          return serial ? serialExecute(inputGroups, firstCallback, callback) : parallelExecute(inputGroups, firstCallback, callback);
      }
docs: Execute for group.
  
  @param inputGroups input groups
  @param firstCallback first sharding execute callback
  @param callback sharding execute callback
  @param serial whether using multi thread execute or not
  @param <I> type of input value
  @param <O> type of return value
  @return execute result
  @throws SQLException throw if execute failure