spring
JdbcTemplate
Recherche…
Introduction
La classe JdbcTemplate exécute des requêtes SQL, des instructions de mise à jour et des appels de procédures stockées, effectue une itération sur ResultSets et extrait les valeurs de paramètre renvoyées. Il intercepte également les exceptions JDBC et les traduit en une hiérarchie d'exceptions générique, plus informative, définie dans le package org.springframework.dao.
Les instances de la classe JdbcTemplate sont threadsafe une fois configurées pour pouvoir injecter en toute sécurité cette référence partagée dans plusieurs DAO.
Méthodes de requête de base
Certaines des méthodes queryFor * disponibles dans JdbcTemplate sont utiles pour les instructions SQL simples exécutant des opérations CRUD.
Demander la date
String sql = "SELECT create_date FROM customer WHERE customer_id = ?";
int storeId = jdbcTemplate.queryForObject(sql, java.util.Date.class, customerId);
Interroger pour un entier
String sql = "SELECT store_id FROM customer WHERE customer_id = ?";
int storeId = jdbcTemplate.queryForObject(sql, Integer.class, customerId);
OU
String sql = "SELECT store_id FROM customer WHERE customer_id = ?";
int storeId = jdbcTemplate.queryForInt(sql, customerId); //Deprecated in spring-jdbc 4
Requête pour String
String sql = "SELECT first_Name FROM customer WHERE customer_id = ?";
String firstName = jdbcTemplate.queryForObject(sql, String.class, customerId);
Requête pour la liste
String sql = "SELECT first_Name FROM customer WHERE store_id = ?";
List<String> firstNameList = jdbcTemplate.queryForList(sql, String.class, storeId);
Requête pour la liste de cartes
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())
{
System.out.println(entry.getKey() + " / " + entry.getValue());
}
System.out.println("---");
}
SQLRowSet
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("---”);
}
OU
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;
}
});
Opérations par lots
JdbcTemplate fournit également des méthodes pratiques pour exécuter des opérations par lots.
Insert de lot
final ArrayList<Student> list = // Get list of students to insert..
String sql = "insert into student (id, f_name, l_name, age, address) VALUES (?, ?, ?, ?, ?)"
jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter(){
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
Student s = l.get(i);
ps.setString(1, s.getId());
ps.setString(2, s.getF_name());
ps.setString(3, s.getL_name());
ps.setInt(4, s.getAge());
ps.setString(5, s.getAddress());
}
@Override
public int getBatchSize() {
return l.size();
}
});
Mise à jour par lot
final ArrayList<Student> list = // Get list of students to update..
String sql = "update student set f_name = ?, l_name = ?, age = ?, address = ? where id = ?"
jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter(){
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
Student s = l.get(i);
ps.setString(1, s.getF_name());
ps.setString(2, s.getL_name());
ps.setInt(3, s.getAge());
ps.setString(4, s.getAddress());
ps.setString(5, s.getId());
}
@Override
public int getBatchSize() {
return l.size();
}
});
Il existe d'autres méthodes batchUpdate qui acceptent List of object array comme paramètres d'entrée. Ces méthodes utilisent en interne BatchPreparedStatementSetter pour définir les valeurs de la liste des tableaux dans une instruction sql.
Extension NamedParameterJdbcTemplate de JdbcTemplate
La classe
NamedParameterJdbcTemplate
ajoute la prise en charge de la programmation d'instructions JDBC à l'aide de paramètres nommés, par opposition à la programmation d'instructions JDBC en utilisant uniquement des arguments classiques ('?'). La classeNamedParameterJdbcTemplate
JdbcTemplate
unJdbcTemplate
et délègue auJdbcTemplate
une grande partie de son travail.
DataSource dataSource = ... //
NamedParameterJdbcTemplate jdbcTemplate = new NamedParameterJdbcTemplate(dataSource);
String sql = "SELECT count(*) FROM customer WHERE city_name=:cityName";
Map<String, String> params = Collections.singletonMap("cityName", cityName);
int count = jdbcTemplate.queryForObject(sql, params, Integer.class);