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 implementieren und die Methode mapRow überschreiben.

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.