Spring JdbcTemplate Query Beispiele
Spring bietet mit Hilfe des JdbcTemplates verschiedene Möglichkeiten, Daten aus der Datenbank zu lesen. Im Nachfolgenden sollen hierzu verschiedene Wege anhand einiger Beispiele aufgeführt werden.
Da ich an dieser Stelle nicht im Detail darauf eingehen möchte wie ein JdbcTemplate erstellt wird, hilft allen Unwissenden das Tutorial Spring MySQL (JDBC) Tutorial weiter. Als Datenbank wird sakila verwendet. Was sakila ist, woher es kommt und wie sie importiert wird, zeigt der Blogbeitrag MySQL Server installieren unter dem Punkt Testdatenbank Sakila installieren.
Sollen Daten nicht nur abgerufen, sondern auch in die Datenbank gepusht werden, geschieht dies in der Regel mit dem JdbcInsert. Anwendungsbespiele gibt es im Artikel Spring JdbcInsert Beispiele.
Single Value Abfragen
Count Abfrage
Die queryForInt() Abfrage kann beispielsweise gut dafür genutzt werden, um die Anzahl von Ergebnissen aus einer Gruppe abzurufen.
Die verwendete COUNT() Abfrage liefert natürlich immer ein Ergebnis, auch dann wenn die Suchabfrage kein Ergebnis liefert ; – )
String searchName = "Simon";
DataSource dataSource = ... //
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
String sql = "SELECT COUNT(*) FROM customer WHERE first_Name LIKE '%?%'";
int resCount = jdbcTemplate.queryForInt(sql, searchName);
System.out.println("Anzahl gefundener Datensätze: " + resCount);
Single Row Query
Einzelne Werte bestimmter Datentypen können mit Hilfe von queryForObject() abgerufen werden. Wichtig bei dieser Abfrage ist, dass das Ergebnis genau einen Wert zurück gibt:
String
Der zweite Parameter String.class der queryForObject() Methode gibt den Rückgabetypen an.
int customerId = 1; DataSource dataSource = ... // JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); String sql = "SELECT first_Name FROM customer WHERE customer_id = ?"; String firstName = jdbcTemplate.queryForObject(sql, String.class, customerId); System.out.println(firstName);
Integer
Analog zu der String Abfrage, klappt dies natürlich auch für Integer Werte.
int customerId = 1; DataSource dataSource = ... // JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); String sql = "SELECT store_id FROM customer WHERE customer_id = ?"; int storeId = jdbcTemplate.queryForObject(sql, Integer.class, customerId);
Bei Integer Rrückgabetypen gibt es noch die Alternative queryForInt():
String sql = "SELECT store_id FROM customer WHERE customer_id = ?"; int storeId = jdbcTemplate.queryForInt(sql, customerId);
Date
Auch die Abfrage nach einem Datum ist möglich:
int customerId = 1; DataSource dataSource = ... // JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); String sql = "SELECT create_date FROM customer WHERE customer_id = ?"; int storeId = jdbcTemplate.queryForObject(sql, java.util.Date.class, customerId);
Single Map Query
Die Single Map Abfrage erwartet ebenfalls genau ein Ergebnis. Der Key der Map entspricht dem Spaltennamen der Tabelle.
int customerId = 1;
DataSource dataSource = ... //
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
String sql = "SELECT * FROM customer WHERE customer_id = ?";
Map<String, Object> singleMap = jdbcTemplate.queryForMap(sql, customerId);
for(Entry<String, Object> entry : singleMap.entrySet())
{
System.out.println(entry.getKey() + " / " + entry.getValue());
}
List Querys
Wenn bereits vor der Abfrage klar ist, dass die Ergebnismenge größer eins sein kann, hilft die Methode queryForList() weiter.
String List
int storeId = 1; DataSource dataSource = ... // JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); String sql = "SELECT first_Name FROM customer WHERE store_id = ?"; List<String> firstNameList = jdbcTemplate.queryForList(sql, String.class, storeId); System.out.println(firstNameList.size());
Integer List, Long List, Date List
Analog zu der String List, kann queryForList() natürlich auch für andere Datentypen genutzt werden.
List of Maps Query
Ein Beispiel wie eine Tabelle mit allen Tabellenspalten ausgelesen werden kann.
int storeId = 1;
DataSource dataSource = ... //
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
String sql = "SELECT * FROM customer WHERE store_id = ?";
List<Map<String, Object>> mapList = jdbcTemplate.queryForList(sql, storeId);
for(Map<String, Object> entryMap : mapList)
{
for(Entry<String, Object> entry : entryMap.entrySet())
{
// Spaltenname = Key; Spalteninhalt = Value
System.out.println(entry.getKey() + " / " + entry.getValue());
}
System.out.println("---");
}
SqlRowSet
Der Rückgabetyp RowSet ist natürlich auch möglich:
DataSource dataSource = ... //
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
String sql = "SELECT * FROM customer";
SqlRowSet rowSet = jdbcTemplate.queryForRowSet(sql);
while(rowSet.next())
{
String firstName = rowSet.getString("first_name");
String lastName = rowSet.getString("last_name");
System.out.println("Vorname: " + firstName);
System.out.println("Nachname: " + lastName);
System.out.println("---”);
}
RowMapper
Datenbankabfragen sollen meist in Java Objekte umgewandelt werden. Um nicht bei jeder Abfrage das Ergebnis des SQL-Statements erneut einlesen zu müssen, verschaffen die RowMapper Abhilfe.
Ausgelagerte Rowmapper
Die Klasse muss das Interface RowMapper
import java.sql.ResultSet;
import java.sql.SQLException;
import org.springframework.jdbc.core.RowMapper;
public class CustomerRowMapper implements RowMapper<Customer>
{
@Override
public Customer mapRow(ResultSet rs, int rowNum) throws SQLException
{
Customer customer = new Customer();
customer.setFirstName(rs.getString("first_Name"));
customer.setLastName(rs.getString("first_Name"));
customer.setEmail(rs.getString("email"));
return customer;
}
}
RowMapper Query
DataSource dataSource = ... // JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); String sql = "SELECT * FROM customer"; List<Customer> customerList = jdbcTemplate.query(sql, new CustomerRowMapper());
Alternative kann der RowMapper natürlich auch als anonyme innere Klasse implementiert werden.
String sql = "SELECT * FROM customer";
List<Customer> customerList = jdbcTemplate.query(sql, new RowMapper<Customer>(){
@Override
public Customer mapRow(ResultSet rs, int rowNum) throws SQLException
{
Customer customer = new Customer();
customer.setFirstName(rs.getString("first_Name"));
customer.setLastName(rs.getString("first_Name"));
customer.setEmail(rs.getString("email"));
return customer;
}
});
Das war’s. Viel Spaß beim Abfragen.




Hallo Simon,
mal wieder ein schön kurz und verständlicher Beitrag!
Gut, dass du zwischenzeitlich noch bei deinen RowMappern auf Set-Methoden zurückgegriffen hast.
Dadurch passt auch noch folgende Ergänzung:
Neben vielen schon existierenden RowMappern kann dein Beispiel schon durch einen mitgelieferten, für diese Klasse von Anwendungsfällen (Mappen von BeansProperties) implementierten, RowMapper erledigt werden.
Die API zum BeanPropertyRowMapper ist hier zu finden: http://static.springsource.org/spring/docs/3.0.x/api/org/springframework/jdbc/core/BeanPropertyRowMapper.html
Es gibt auch noch einige Weitere die von RowMapper ableiten und interessant sein könnten:
http://static.springsource.org/spring/docs/3.0.x/api/org/springframework/jdbc/core/RowMapper.html
Viele Grüße an dich Simon und viel Spaß allen interessierten Lesern beim Vertiefen ihrer spring-orm Kenntnisse!
Markus