2010-02-27 4 views
2

J'ai quelques questions liées à l'insertion par lots au printemps.insertion de lot de printemps en utilisant hibernateTemplate, JdbcTemplate

Quand je fais quelque chose comme ça:

public void save(Car car) { 
    String sql1 = "insert into Car values (1, 'toyota')"; 
    String sql2 = "insert into Car values (2, 'chrysler')"; 
    String sql3 = "insert into Car values (3, 'infinity')"; 

    String[] tab = new String[2]; 
    tab[0] = sql1; 
    tab[1] = sql2; 
    tab[2] = sql3; 

    getJdbcTemplate().update(sql1); 
    getJdbcTemplate().update(sql2); 
    getJdbcTemplate().update(sql3); 

    // getJdbcTemplate().batchUpdate(tab); 
} 

dans le fichier journal mysql je vois:

1 Query  insert into Car values (1, 'toyota') 
2 Query  insert into Car values (2, 'chrysler') 
3 Query  insert into Car values (3, 'infinity') 

Nous avons donc 3 instructions d'insertion (et 3 appels réseau).

Lorsque j'utilise getJdbcTemplate().batchUpdate(tab) dans le fichier journal que je peux voir:

1094 [principale] DEBUG org.springframework.jdbc.core.JdbcTemplate - Exécution mise à jour batch SQL de 3 déclarations 1110 [principale] org DEBUG. springframework.jdbc.datasource.DataSourceUtils - Récupération de la connexion JDBC à partir de DataSource 1110 [main] DEBUG org.springframework.jdbc.datasource.DriverManagerDataSource - Création d'une nouvelle connexion JDBC DriverManager vers [jdbc: mysql: // localhost: 3306/test? useServerPrepStmts = vrai] 1610 [principal] DEBUG org.springframework.jdbc.support.JdbcUtils - Le pilote JDBC prend en charge les mises à jour par lots

et mysql journal:

1 Query  insert into Car values (1, 'toyota') 
1 Query  insert into Car values (2, 'chrysler') 
1 Query  insert into Car values (3, 'infinity') 

Je comprends que dans la méthode de addBatch de fond est invoqué sur l'objet de déclaration et toutes ces opérations sont réalisées simultanément. Un avantage supplémentaire est la réduction des appels réseau. Est-ce que mon raisonnement est correct?

Je cherche quelque chose de similaire dans HibernateTemplate. Je peux le faire de cette façon:

getHibernateTemplate().saveOrUpdateAll(Arrays.asList(new Car(4, "infinity"), new Car(5, "ford"))); 

Dans ce cas, dans le fichier journal que je peux voir:

3 Prepare  select car_.id, car_.name as name0_ from Car car_ where car_.id=? 
3 Prepare  select car_.id, car_.name as name0_ from Car car_ where car_.id=? 
3 Prepare  insert into Car (name, id) values (?, ?) 

Il semble donc que tout est fait en un seul coup comme il a été fait pour getJdbcTemplate() .updateBatch (...)

Veuillez me corriger si je me trompe.

Répondre

3

Pour produire un résultat similaire à Hibernate (avec un état préparé), vous devez utiliser JdbcTemplate.batchUpdate(String, BatchPreparedStatementSetter). Quelque chose comme ceci:

final List<Car> cars = Arrays.asList(...); 

getJdbcTemplate().batchUpdate("insert into Car (name, id) values (?, ?);", 
    new BatchPreparedStatementSetter() { 
     private int i = 0; 
     public int getBatchSize() { return cars.size(); } 
     public void setValues(PreparedStatement ps) { 
      ps.setString(1, cars.get(i).getName()); 
      ps.setInt(2, cars.get(i).getId()); 
      i++; 
     } 
    }); 
Questions connexes