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 classe NamedParameterJdbcTemplate JdbcTemplate un JdbcTemplate et délègue au JdbcTemplate 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);


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow