Buscar..


Introducción

La clase JdbcTemplate ejecuta consultas SQL, sentencias de actualización y llamadas a procedimientos almacenados, realiza iteraciones sobre ResultSets y extracción de valores de parámetros devueltos. También captura las excepciones de JDBC y las traduce a la jerarquía de excepciones genérica, más informativa, definida en el paquete org.springframework.dao.

Las instancias de la clase JdbcTemplate son seguras para subprocesos una vez configuradas para que pueda inyectar de forma segura esta referencia compartida en varios DAO.

Métodos básicos de consulta

Algunos de los métodos queryFor * disponibles en JdbcTemplate son útiles para sentencias de SQL simples que realizan operaciones CRUD.

Pidiendo fecha

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

Consultar por entero

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

Consultar por Cadena

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

Consultar por lista

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

Consulta de lista de mapas

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

});

Operaciones por lotes

JdbcTemplate también proporciona métodos convenientes para ejecutar operaciones por lotes.

Insertar por lotes

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

Actualización por lotes

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

Hay otros métodos batchUpdate que aceptan Lista de matriz de objetos como parámetros de entrada. Estos métodos utilizan internamente BatchPreparedStatementSetter para establecer los valores de la lista de matrices en la declaración de SQL.

NamedParameterJdbcTemplate extensión de JdbcTemplate

La clase NamedParameterJdbcTemplate agrega soporte para la programación de sentencias JDBC utilizando parámetros nombrados, a diferencia de la programación de sentencias JDBC utilizando solo argumentos clásicos de marcador de posición ('?'). La clase NamedParameterJdbcTemplate envuelve un JdbcTemplate , y delega a la envuelta JdbcTemplate para hacer gran parte de su trabajo.

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
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow