spring
Plantilla Jdbc
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 claseNamedParameterJdbcTemplate
envuelve unJdbcTemplate
, y delega a la envueltaJdbcTemplate
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);