spring
JdbcTemplate
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 classeNamedParameterJdbcTemplate
wrapping di un oggettoJdbcTemplate
e delega alJdbcTemplate
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);