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ß.



