code: public static Pair<String, Object[]> buildJdbcBatchInsertPreparedSQL(String tableName, String[] cols, List<Map/*<String, Object>*/> dataList) {
          Set<String> validCols = findValidCols(cols, dataList);
          List<Object> valuesArray = new ArrayList<>();
          StringBuilder sqlSb = new StringBuilder();
          sqlSb.append("insert into ").append(tableName).append("(");
          StringBuilder colParamB = new StringBuilder();
          StringBuilder qmSb = new StringBuilder();
          Iterator<String> it = validCols.iterator();
          while (it.hasNext()) {
              String col = it.next();
              if (!it.hasNext()) {
                  colParamB.append(col);
              } else {
                  colParamB.append(col).append(",");
              }
          }
          sqlSb.append(colParamB.toString());
          sqlSb.append(") values ");
  
          for (Map map : dataList) {
              qmSb.append("(");
              for (String col : validCols) {
                  Object value = map.get(StringUtil.underlineToCamel(col));
                  valuesArray.add(toDatabaseSupportedValue(value));
                  qmSb.append("?,");
              }
              deleteLastCommaIfNecessary(qmSb);
              qmSb.append("),");
          }
          deleteLastCommaIfNecessary(qmSb);
          sqlSb.append(qmSb.toString());
          String sql = sqlSb.toString();
          return new Pair<>(sql, valuesArray.toArray());
      }
docs: build the batch insertion prepared sql for jdbc standard.
  Jdbc standard prepared sql is with "?" to represents the arguments, eg.<p>
  <code>INSERT INTO TABLE0 VALUES (?,?,?),(?,?,?)</code>
  </p>
  
  @param tableName table name
  @param cols      table columns array
  @param dataList  values for the batch insertion sql
  @return A pair with prepared sql as the first element and the prepared parameter array as the second.