2013-07-02 5 views
13

Neu bei Spring, ich versuche, eine List<Map<String, Object>> in eine Tabelle einzufügen. Bis jetzt habe ich die SqlParameterSource für Batch-Update verwendet, die gut funktioniert, wenn eine Java-Bean an sie geliefert wird. Etwas wie folgt aus:Wie führe ich eine Batch-Aktualisierung im Frühling mit einer Liste von Karten durch?

@Autowired 
    private NamedParameterJDBCTemplate v2_template; 

    public int[] bulkInsertIntoSiteTable(List<SiteBean> list){ 
      SqlParameterSource[] batch = SqlParameterSourceUtils 
        .createBatch(list.toArray()); 
      int[] updateCounts = v2_template 
        .batchUpdate(
          "insert into sitestatus (website, status, createdby) values (:website, :status, :username)", 
          batch); 

      return updateCounts; 

     } 

Allerdings habe ich die gleiche Technik mit einer Liste von Karten anstelle einer Bean versucht, es scheiterte (zu Recht).

public int[] bulkInsertIntoSiteTable(List<Map<String, Object>> list){ 
     SqlParameterSource[] batch = SqlParameterSourceUtils 
       .createBatch(list.toArray()); 
     int[] updateCounts = v2_template 
       .batchUpdate(
         "insert into sitestatus (website, status, createdby) values (:website, :status, :username)", 
         batch); 

     return updateCounts; 

    } 

Der obige Code ist fehlgeschlagen mit folgenden Ausnahme:

Exception in thread "main" org.springframework.dao.InvalidDataAccessApiUsageException: No value supplied for the SQL parameter 'website': Invalid property 'website' of bean class [org.springframework.util.LinkedCaseInsensitiveMap]: Bean property 'website' is not readable or has an invalid getter method: Does the return type of the getter match the parameter type of the setter? 
    at org.springframework.jdbc.core.namedparam.NamedParameterUtils.buildValueArray(NamedParameterUtils.java:322) 
    at org.springframework.jdbc.core.namedparam.NamedParameterBatchUpdateUtils$1.setValues(NamedParameterBatchUpdateUtils.java:45) 
    at org.springframework.jdbc.core.JdbcTemplate$4.doInPreparedStatement(JdbcTemplate.java:893) 
    at org.springframework.jdbc.core.JdbcTemplate$4.doInPreparedStatement(JdbcTemplate.java:1) 
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:587) 
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:615) 
    at org.springframework.jdbc.core.JdbcTemplate.batchUpdate(JdbcTemplate.java:884) 
    at org.springframework.jdbc.core.namedparam.NamedParameterBatchUpdateUtils.executeBatchUpdateWithNamedParameters(NamedParameterBatchUpdateUtils.java:40) 
    at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.batchUpdate(NamedParameterJdbcTemplate.java:303) 
    at tester.utitlies.dao.VersionTwoDao.bulkInsertIntoSites(VersionTwoDao.java:21) 
    at tester.utitlies.runner.Main.main(Main.java:28) 

Es schlägt fehl, da es die Liste hält ein Stapel von Bohnen zu sein, glaube ich. Ich kann keinen Weg finden, eine Stapelaktualisierung im Frühling mit eine Liste der Karten durchzuführen und NamedParameterJDBCTemplate zu verwenden. Bitte um Rat.

Antwort

6

Wie im Dokument NamedParameterJDBCTemplate docs, gefunden here, kann diese Methode für die Stapelaktualisierung mit Karten verwendet werden.

int[] batchUpdate(String sql, Map<String,?>[] batchValues)

Die wirkliche Herausforderung zu A war ein Array von Map<String, Object> erhalten aus einem List<Map<String, Object>> entspricht. Ich habe den folgenden Code verwendet, um das Array abzurufen und die Stapelaktualisierung durchzuführen.

public static Map<String, Object>[] getArrayData(List<Map<String, Object>> list){ 
     @SuppressWarnings("unchecked") 
     Map<String, Object>[] maps = new HashMap[list.size()]; 

     Iterator<Map<String, Object>> iterator = list.iterator(); 
     int i = 0; 
     while (iterator.hasNext()) { 
      Map<java.lang.String, java.lang.Object> map = (Map<java.lang.String, java.lang.Object>) iterator 
        .next(); 
      maps[i++] = map; 
     } 

     return maps; 
    } 
+0

Warum haben sie 'Karte [] batchValues' und nicht die Karte [] batchValues? – fastcodejava

+3

Hatte Erfolg auf diese Weise: Karte [] BatchValues ​​= list.toArray (neue HashMap [0]); namedParameterJdbcTemplate.batchUpdate ("...", BatchValues); –

Verwandte Themen