Noch ein Spring 2.0 Feature: SimpleJdbcTemplateNachdem das Java Magazin
hier einen Link auf meinen Blog hatte (danke!), hier noch ein neues Feature aus Spring 2.0: Das SimpleJdbcTemplate.
Die JdbcTemplates aus Spring sind ein wichtiges Feature von Spring, da die Fehlerquellen in Bezug auf das Schließen der verschiedenen JDBC-Ressourcen damit eliminiert werden und die API auch wesentlich einfacher ist als die pure JDBC API. Sie sind ohne den Rest von Spring nutzbar, so dass man sie auf jeden Fall verwenden sollte, wenn man JDBC Code schreiben will. Das SimpleJdbcTemplate verwendet nun JDK 1.5 Features, um das Leben noch einfacher zu machen. Hier ein Code-Beispiel:
getSimpleJdbcTemplate().update(
"INSERT INTO KUNDE(VORNAME,NAME,KONTOSTAND) "+
" VALUES(?,?,?)",
kunde.getVorname(), kunde.getName(),
kunde.getKontostand());
Dabei muss die Klasse von SimpleJdbcDaoSupport erben, damit man mit getSimpleJdbcTemplate() auch ein SimpleJdbcTemplate bekommt (alternativ kann man selber eines unter Angaben einer DataSource oder eines JdbcTemplates erzeugen).
Was hier nun auffällt ist, dass man bei Kontostand nicht mehr double in Double umwandeln muss (Autoboxing) und man kann die Parameter einfach so übergeben, da JDK 1.5 Methoden mit einer variablen Anzahl Parameter erlaubt. Beim JdbcTemplate musste man noch ein Object-Array verwenden. Im Prinzip ist der Umgang recht natürlich: Man gibt eben die SQL-Anfrage an und die Parameter - das war's.
Für Queries kann man nach wie vor queryForInt oder queryForLong verwenden, falls man einen primitiven Typ als Rückgabe erwartet. Neu ist, dass bei dem generischen queryForObject aus dem übergebenen erwarteten Typ vom Compiler Typ-Informationen abgeleitet werden, so dass der Typ-Cast entfällt:
Date d=
simpleJdbcTemplate.queryForObject(
"SELECT date from DBLOG where id=?", Date.class, id);
Hier ist keine Umwandlung in ein Date mehr nötig.
Wenn man nun ein fachliches Objekt erzeugen will, kann man die Daten aus dem SQL-Statement auch mit einem RowMapper in ein solches Objekt umwandeln. Auch hier sorgt das bessere Typ-System von JDK 1.5 dafür, dass einiges eleganter wird:
public class KundeDAO extends SimpleJdbcDaoSupport {
private static final class KundeResultSetRowMapper implements
ParameterizedRowMapper {
public Kunde mapRow(ResultSet rs, int rowNum) throws SQLException {
Kunde kunde = new Kunde(rs.getString(1), rs.getString(2), rs
.getDouble(4));
kunde.setId(rs.getInt(3));
return kunde;
}
}
public List getAll() {
return getSimpleJdbcTemplate().query(
"SELECT VORNAME, NAME, ID, KONTOSTAND FROM KUNDE",
new KundeResultSetRowMapper());
}
public Kunde getByID(int id) {
return getSimpleJdbcTemplate()
.queryForObject(
"SELECT K.VORNAME, K.NAME, K.ID, K.KONTOSTAND FROM KUNDE K WHERE K.ID=?",
new KundeResultSetRowMapper(), id);
}
}
Wie man sieht, gibt es nun den ParameterizedRowMapper. Dadurch wird es hier möglich, anzugeben, dass dieser als Ergebnis einen Kunden zurück gibt. Dadurch kann dann die getAll()-Methode ohne weiter Typ-Umwandlungen als Ergebnis ein List
zurückgeben. Und bei getById() wird der Rückgabetyp Kunde ebenfalls automatisch abgeleitet.
Ingesamt empfinde ich diese Möglichkeiten als extrem elegant. Sie zeigen auch sehr deutlich die praktische Relevanz der JDK 1.5 Features. Von daher ist dies auf jeden Fall ein guter Tipp für Leute, die JDBC direkt nutzen wollen.