Ejemplo con createStatement

De ChuWiki

He metido todos los artículos de esta wiki y de http://chuidiang.org relativos a Java y JDBC en un pdf Libro JDBC Java. A través del enlace puedes comprarlo si tienes interés.

Viene de Transacciones con base de datos

Hemos visto con createStatement() que debemos componer nosotros la SQL completa en un String. Veamos como hacer las cuatro transacciones básicas: consulta, inserción, modificación y borrado.

select[editar]

Para realizar una consulta, creamos el Statement y llamamos a su método executeQuery(). El resultado de la consulta lo tendremos en una clase ResultSet

Statement s = conexion.createStatement(); 
ResultSet rs = s.executeQuery ("select * from persona");

Donde hemos supuesto que hay una tabla persona en la base de datos y queremos obtener todos sus campos. El ResultSet que obtenemos tendrá todas las filas de resultados. Debemos recorrerlo secuencialmente, llamando al método next() cada vez que queramos pasar a la siguiente fila. En cada fila, los métodos get() nos permiten obtener el valor de cada una de las columnas. Si suponemos que persona tiene 3 columnas: un entero de nombre id, un String de nombre nombre y un Date de nombre fecha_nacimiento, podemos leerlo de la siguiente forma

ResultSet rs = s.executeQuery ("select * from persona");
while (rs.next()) 
{ 
    System.out.println (
       rs.getInt ("id") + " " +
       rs.getString ("nombre")+ " " +
       rs.getDate("fecha_nacimiento"));
}
rs.close();

o bien, si no queremos usar los nombres de las columnas o no los sabemos, podemos usar el número de columna, empezando por el 1

ResultSet rs = s.executeQuery ("select * from persona");
while (rs.next()) 
{ 
    System.out.println (
       rs.getInt (1) + " " +
       rs.getString (2)+ " " +
       rs.getDate(3));
}
rs.close();
Y si no sabemos cual es el tipo de dato de cada columna, podemos directamente llamar a getObject(), pasando bien el nombre, bien el número de la columna. El Object devuelto seguirá siendo el adecuado a la columna (Integer, String, Date...), pero nosotros no tenemos necesidad de saberlo a priori
ResultSet rs = s.executeQuery ("select * from persona");
while (rs.next()) 
{ 
    System.out.println (
       rs.getObject (1) + " " +
       rs.getObject (2)+ " " +
       rs.getObject (3));
}
rs.close();
Debemos fijarnos en dos detalles más respecto al método next() del ResultSet:

Es necesario hacer un primer next() antes de intentar la primera fila. Según nos devuelve el ResultSet el método executeQuery(), está situado antes de la primera fila, cosa normal, porque si no hubiera resultados, no podría estar inicialmente en la primera fila. Por ello, antes de leer, se hace un next() en el mismo while().

next() devuelve true o false según se queda apuntando a una fila válida. Por ello si estamos ya en la última fila y hacemos un next(), devolverá false y se terminará el bucle.

Cuando hemos terminado con el ResultSet, debemos cerrarlo. La consulta no trae todos los datos de golpe a nuestro programa java, ya que pueden ser muchos. Los va trayendo de uno en uno, según llamamos a next(). Esto implica que el ResultSet tiene una conexión a base de datos abierta para ir trayendo estos datos según los pidamos. Debemos, por tanto, cerrar e indicar al ResultSet que ya no necesitamos más esa conexión.

insert, update y delete[editar]

Estas tres, como realizan modificaciones en la base de datos, deben llamarse con el método executeUpdate(). Este método devolverá el número de filas afectadas (número de filas borradas, modificadas o insertadas). Un ejemplo con las tres todo seguido

Statement s = conexion.createStatement();
// un update en la tabla contacto, columna telefono, donde el id sea 3
int filasModificadas = s.executeUpdate("UPDATE contacto SET telefono='111' WHERE id=3");

// un insert en contacto
int filasInsertadas = s.executeUpdate(
   "INSERT INTO contacto (nombre, apellidos, telefono) VALUES " +
   ('Pedro','Gomez','111' )");

// un delete en contacto donde id es 4
int filasBorradas = t.executeUpdate("DELETE FROM contacto WHERE id=4");

En el caso particular de los insert, debemos saber que tenemos accesibles las claves que se hayan generado automáticamente para los nuevos elementos insertados. Para obtener estas claves recién creadas, llamamos al método getGeneratedKeys(), que nos devolverá un ResultSet con dichas claves. Ya sabemos cómo leerlo.

execute()[editar]

Finalmente, hay un método exectue() genérico, válido para cualquier tipo de transacción y especialmente útil si una misma SQL hace muchas cosas a la vez, como devolver resultados e insertar generando claves. Esta llamada devuelve true si hay un ResultSet para consultar (que se obtiene llamando al método getResultSet()), o false en caso contrario.

Sigue en preparedStatement()