domingo, 22 de julio de 2007

JDBC Parte 2

Quedamos entonces por empezar con el manejo de consultas con parametros. Normalmente para esto y en la práctica no se utiliza la clase Statement sino la clase PreparedStatement. Vamos a ver como funciona para cosas simples.


PreparedStatement ps = c.prepareStatement("SELECT * FROM tabla");
ResultSet rs = ps.executeQuery();
//Podemos usar ps.executeUpdate();
//para DDL o SQL de actualización y este devuelve un entero con lo que paso


Lo divertido de un PS no es realmente esto, sino las consultas parametrizadas.


try {
PreparedStatement ps = c.prepareStatement("SELECT * FROM tabla WHERE id=?");
ps.setInt(1, 9);
//Igualmente puede utilizarse setString, etc
ResultSet rs = ps.executeQuery();
} catch(Exception e) {
System.out.println("Error en la consulta");
}


Las consultas parametrizadas deberían utilizarse siempre que se actualizan datos a una base de datos para evitar SQLInjection y otros problemas como carácteres extraños y cosas por el estilo.

La clase CallableStatement nos permite tener acceso a procedimientos almacenados en la base de datos que se hayan definido anteriormente. Por ejemplo:


try {
CallableStatement cs = c.prepareCall("{call getDailyTotal (?, ?)}");
cs.setInt(1, 7);
cs.getString(2, "Hola");
} catch(Exception e) {
System.out.println("Error de DB");
}


Sin mayores detalles así funciona. Vamos ahora a terminar con JDBC hablando de las transacciones. Estas se utilizan para crear acciones atómicas sobre la base de datos.


try {
c.setAutoCommit(false);
c.prepareStatement("SQL 1").executeUpdate();
c.prepareStatement("SQL 2").executeUpdate();
c.prepareStatement("SQL 3").executeUpdate();

c.commit();
} catch(Exception e) {
try {
c.rollback();
} catch (Exception exc) { ; }
System.out.println("Error de DB");
}