/ / Einfügen mehrerer Zeilen mit JdbcTemplate - Java, SQL, Spring, JDBC, JDBCTemplate

Einfügen mehrerer Zeilen mit JdbcTemplate - Java, SQL, Frühling, Jdbc, Jdbctemplate

Wie kann ich das folgende SQL skalierbar ausführen? JdbcTemplate läuft auf mySQL. In diesem Fall bedeutet skalierbar:

  1. Auf dem Server wird nur eine SQL-Anweisung ausgeführt
  2. Es funktioniert für eine beliebige Anzahl von Zeilen.

Hier ist die Aussage:

INSERT INTO myTable (foo, bar) VALUES ("asdf", "asdf"), ("qwer", "qwer")

Angenommen, ich habe eine Liste von POJOs mit foo und bar Felder. Mir ist klar, dass ich einfach die Liste durchlaufen und ausführen kann:

jdbcTemplate.update("INSERT INTO myTable(foo, bar) VALUES (?, ?)", paramMap)

aber das erfüllt nicht das erste Kriterium.

Ich glaube ich könnte auch ausführen:

jdbcTemplate.batchUpdate("INSERT INTO myTable(foo, bar) VALUES (?, ?)", paramMapArray)

Aber soweit ich das beurteilen kann, wird das SQL nur einmal kompiliert und mehrmals ausgeführt, wobei das erste Kriterium erneut nicht erfüllt wird.

Die letzte Möglichkeit, die beide Kriterien zu erfüllen scheint, wäre, die SQL einfach selbst mit a zu erstellen StringBuffer, aber das möchte ich vermeiden.

Antworten:

4 für die Antwort № 1

Mehrzeilige Einfügungen (unter Verwendung von "Zeilenwertkonstruktoren") sind tatsächlich Teil des SQL-92-Standards. Sehen http://en.wikipedia.org/wiki/Insert_(SQL)#Multirow_inserts.

Einige Datenbanken unterstützen diese Syntax nicht, viele jedoch. Nach meiner Erfahrung unterstützen Derby / Cloudscape, DB2, Postgresql und die neueren Versionen von Hypersonic 2. * + Dies.

Ihre Sorge, dies alsPreparedStatement ist verständlich, aber ich habe ähnliche Fälle gesehen, in denen Spring JDBC automatisch eine Sammlung von Elementen für bestimmte Abfragen verarbeitet (z. B. wo in (?)), Aber ich kann nicht für diesen Fall bürgen.

Ich habe einige möglicherweise hilfreiche Informationen unter gefunden (kann keinen zweiten Link zu diesem Beitrag hinzufügen) das könnte hilfreich sein.

Ich kann Ihnen sagen, dass es wahrscheinlich nicht möglich ist fürIhre zweite Anforderung (funktioniert für eine beliebige Anzahl von Argumenten) muss im strengsten Sinne erfüllt sein: Jede Datenbank, die ich verwendet habe, legt Einschränkungen für die Abfragelänge fest, die ins Spiel kommen würden.


28 für die Antwort № 2

Sie können verwenden BatchPreparedStatementSetter Wie unten.

public void insertListOfPojos(final List<MyPojo> myPojoList) {

String sql = "INSERT INTO "
+ "MY_TABLE "
+ "(FIELD_1,FIELD_2,FIELD_3) "
+ "VALUES " + "(?,?,?)";

getJdbcTemplate().batchUpdate(sql, new BatchPreparedStatementSetter() {

@Override
public void setValues(PreparedStatement ps, int i)
throws SQLException {

MyPojo myPojo = myPojoList.get(i);
ps.setString(1, myPojo.getField1());
ps.setString(2, myPojo.getField2());
ps.setString(3, myPojo.getField3());

}

@Override
public int getBatchSize() {
return myPojoList.size();
}
});

}

0 für die Antwort № 3

Mir scheint, dass die batchUpdate () -Methode von JdbcTemplate in diesem Fall hilfreich sein könnte (von hier kopiert) http://www.mkyong.com/spring/spring-jdbctemplate-batchupdate-example/):

//insert batch example
public void insertBatch(final List<Customer> customers){

String sql = "INSERT INTO CUSTOMER " +
"(CUST_ID, NAME, AGE) VALUES (?, ?, ?)";

getJdbcTemplate().batchUpdate(sql, new BatchPreparedStatementSetter() {

@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
Customer customer = customers.get(i);
ps.setLong(1, customer.getCustId());
ps.setString(2, customer.getName());
ps.setInt(3, customer.getAge() );
}

@Override
public int getBatchSize() {
return customers.size();
}

});
}

-1 für die Antwort № 4

Sie können es auch mit jdbcInsert.executeBatch (sqlParamSourceArray) versuchen.

   // define parameters
jdbcInsert = new SimpleJdbcInsert(jdbcTemplate);
jdbcInsert.withTableName("TABlE_NAME");
SqlParameterSource[] sqlParamSourceArray = new SqlParameterSource[apiConsumer
.getApiRoleIds().size()];
for (int i = 0; i < myCollection.size(); i++)
{
sqlParamSourceArray[i] = new MapSqlParameterSource().addValue("COL1");
......................
}
// execute insert
int[] keys = jdbcInsert.executeBatch(sqlParamSourceArray);

-4 für die Antwort № 5

Sie können dies nicht in JDBC tun, Punkt. In MySQL ist es nur syntaktischer Zucker, aber der Effekt der Anweisung ist der gleiche wie das Ausgeben mehrerer INSERT-Anweisungen. Sie können also batchUpdate verwenden und es hat den gleichen Effekt.