Ricerca…


introduzione

La classe JdbcTemplate esegue query SQL, istruzioni di aggiornamento e chiamate stored procedure, esegue l'iterazione su ResultSet e l'estrazione dei valori dei parametri restituiti. Rileva anche le eccezioni JDBC e le traduce nella gerarchia di eccezioni generica, più informativa, definita nel pacchetto org.springframework.dao.

Le istanze della classe JdbcTemplate sono threadsafe una volta configurate in modo che possa essere tranquillamente iniettata questo riferimento condiviso in più DAO.

Metodi di query di base

Alcuni dei metodi queryFor * disponibili in JdbcTemplate sono utili per semplici istruzioni SQL che eseguono operazioni CRUD.

Interrogazione per data

String sql = "SELECT create_date FROM customer WHERE customer_id = ?";
int storeId = jdbcTemplate.queryForObject(sql, java.util.Date.class, customerId);

Interrogazione per intero

String sql = "SELECT store_id FROM customer WHERE customer_id = ?";
int storeId = jdbcTemplate.queryForObject(sql, Integer.class, customerId);    

O

String sql = "SELECT store_id FROM customer WHERE customer_id = ?";
int storeId = jdbcTemplate.queryForInt(sql, customerId);                 //Deprecated in spring-jdbc 4

Interrogazione per stringa

String sql = "SELECT first_Name FROM customer WHERE customer_id = ?";
String firstName = jdbcTemplate.queryForObject(sql, String.class, customerId);

Interrogare per la lista

String sql = "SELECT first_Name FROM customer WHERE store_id =  ?";
List<String> firstNameList = jdbcTemplate.queryForList(sql, String.class, storeId);

Query per Elenco di mappe

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("---”);
}

O

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;
  }

});

Operazioni batch

JdbcTemplate fornisce anche metodi convenienti per eseguire operazioni batch.

Inserto batch

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();
    }
});

Aggiornamento batch

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();
    }
});

Esistono ulteriori metodi di batchUpdate che accettano List of object array come parametri di input. Questi metodi utilizzano internamente BatchPreparedStatementSetter per impostare i valori dall'elenco di array nell'istruzione sql.

NamedParameterJdbcTemplate estensione di JdbcTemplate

La classe NamedParameterJdbcTemplate aggiunge il supporto per la programmazione delle istruzioni JDBC utilizzando i parametri denominati, anziché la programmazione delle istruzioni JDBC utilizzando solo gli argomenti classici segnaposto ('?'). La classe NamedParameterJdbcTemplate wrapping di un oggetto JdbcTemplate e delega al JdbcTemplate spostato per svolgere gran parte del proprio lavoro.

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
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow