Spring JdbcInsert Beispiele

In dem Artikel Spring JdbcTemplate Query Beispiele wurden bereits die verschiedenen Query Möglichkeiten von Spring mit Hilfe der JdbcTemplate Klasse gezeigt. In diesem Artikel möchte ich nun die unterschiedlichen Varianten eines INSERT SQL-Statements anhand einiger Beispielen präsentieren.
Die Klasse SimpleJdbcInsert dient hauptsächlich dem Zweck Informationen in die Datenbank zu pushen. Alternativ bietet die JdbcTemplate Klasse eine Möglichkeit INSERT SQL-Statements abzusetzen.

Auf die Generierung einer DataSource werde ich in diesem Artikel nicht näher eingehen. Weitere Informationen zu diesem Thema gibt es in dem Artikel Spring MySQL (JDBC) Tutorial .

SimpleJdbcInsert konfigurieren

Während der Initialisierung des SimpleJdbcInsert Objektes werden grundlegende Informationen wie der Tabellenname, der Primärschlüssel und die verwendeten Spaltennamen gesetzt. Die Zuweisung kann über zwei verschiedene Varianten umgesetzt werden.

Variante 1:

DataSource dataSource = … //
SimpleJdbcInsert jdbcInsert = new SimpleJdbcInsert(dataSource);
jdbcInsert.withTableName("customer");
jdbcInsert.usingGeneratedKeyColumns("customer_id");
jdbcInsert.usingColumns("first_name", "last_name", "email");

Variante 2:

DataSource dataSource = … //
SimpleJdbcInsert jdbcInsert = new SimpleJdbcInsert(dataSource)
                                      	.withTableName("customer")                              	 
                                      	.usingGeneratedKeyColumns("customer_id")
                                      	.usingColumns("first_name", "last_name", "email");

Map

Map<String, Object> parameterSource = new HashMap<String, Object>();
parameterSource.put("first_name", "Simon");
parameterSource.put("last_name", "Michel");
parameterSource.put("email", "info@itblogging.de");

int rowsEffected = simpleJdbcInsert.execute(parameterSource);
System.out.println("Anzahl betroffener Datensätze: " + rowsEffected);

MapSqlParameterSource

SqlParameterSource parameters = new MapSqlParameterSource();
parameters.addValue("first_Name", "Simon");
parameters.addValue("last_Name", "Michel");
parameters.addValue("email", "info@itblogging.de");
    
Number primaryKey = jdbcInsert.executeAndReturnKey(parameters);
System.out.println("Primärschlüssel des neuen Datensatzes: " + primaryKey);

BeanPropertySqlParameterSource

Hinweis: Die getter Methoden der Bean Klasse müssen gleichnamig zu den Tabellenspaltennamen sein, benötigen jedoch keine Unterstriche. Heißt die Tabellenspalte wie in unserem Beispiel first_name, kann die getter Methode getFirstName() heißen.

Customer customer = … //
SqlParameterSource customer = new BeanPropertySqlParameterSource(customer);
// Alternativ: executeAndReturnKeyHolder(customer) 
int rowsEffected = simpleJdbcInsert.execute(customer);

System.out.println("Anzahl betroffener Datensätze: " + rowsEffected);

Alternative JdbcTemplate

Nicht nur mit Hilfe der SimpleJdbcInsert Klasse können Informationen in der Datenbank persistiert werden, auch das JdbcTemplate bietet die Möglichkeit INSERT SQL-Statements abzusetzen.

Einfaches Update

DataSource dataSource = ... //
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
String sql = "INSERT INTO Customer(first_name, last_name, email) VALUES(?, ?, ?)";
String firstName = "Simon";
String lastName = "Michel";
String email = "info@itblogging.de";
jdbcTemplate.update(sql, firstName, lastName, email);

PreparedStatementSetter

DataSource dataSource = ... //
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);

final Customer customer =  … //
PreparedStatementSetter pss = new PreparedStatementSetter()
{
  @Override
  public void setValues(PreparedStatement ps) throws SQLException
  {
    ps.setString(1, customer.getFirstName());
    ps.setString(2, customer.getLastName());
    ps.setString(3, customer.getEmail());
  }
};
String sql = "INSERT INTO Customer(first_name, last_name, email) VALUES(?, ?, ?)";
int rowsEffected = jdbcTemplate.update(sql, pss);
System.out.println("Anzahl betroffener Datensätze: "  + rowsEffected);

PreparedStatementCreator

Bei der Verwendung des JdbcTemplates muss der Primärschlüssel (hier: customer_id) als Parameter des PreparedStatements übergeben werden. Der Key wird anschließend in dem KeyHolder gespeichert.

KeyHolder keyHolder = new GeneratedKeyHolder();
jdbcTemplate.update(new PreparedStatementCreator()
{
  @Override
  public PreparedStatement createPreparedStatement(Connection con) throws SQLException
  {
    String sql = "INSERT INTO Customer(first_name, last_name, email) VALUES(?, ?, ?)";
    // customer_id = Primärschlüssel
    PreparedStatement ps =
          con.prepareStatement(sql, new String[] {"customer_id"});
          ps.setString(1, "Simon");
          ps.setString(2, "Michel");
          ps.setString(3, "info@itblogging.de");
  	
          return ps;
  }
}, keyHolder);
System.out.println("Primärschlüssel: " + keyHolder.getKey());

Das war’s. Viel Spaß.