Saltar la navegación

5.5.- Realización de consultas.

Ilustración de un pollito amarillo que parece preguntar algo.

Para operar con una base de datos,  ejecutando las consultas necesarias, nuestra aplicación deberá:

  1. Cargar el driver necesario para comprender el protocolo que usa la base de datos en cuestión.
  2. Establecer una conexión con la base de datos.
  3. Enviar consultas SQL y procesar el resultado.
  4. Liberar los recursos al terminar.
  5. Gestionar los errores que se puedan producir.

Para hacer consultas en la base de datos tendremos que crear un objeto de tipo Statement, ejecutar la consulta con el método executeQuery(sql) y recorrer el ResultSet que devuelve este método.

Ejemplo 1:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class PrimeraConsulta {
public static void main(String[] args) {
try {
    // Establecemos la conexion con la BD
    Connection conexion = DriverManager.getConnection("jdbc:mysql://localhost/ejemplo", "root", "system");
    // creamos el objeto Statement
    Statement sentencia = conexion.createStatement();
    //ejecutamos la consulta
    String sql = "SELECT * FROM dept";
    ResultSet resul = sentencia.executeQuery(sql);
    // Recorremos el resultado para visualizar cada fila 
// Se hace un bucle mientras haya registros y se van visualizando while (resul.next()) { System.out.printf("%d, %s, %s %n", resul.getInt(1), resul.getString(2), resul.getString(3)); } resul.close(); // Cerrar ResultSet sentencia.close(); // Cerrar Statement conexion.close(); // Cerrar conexión } catch (SQLException cn) { cn.printStackTrace(); }  } }

El API JDBC distingue dos tipos de sentencias SQL:

  • Consultas: SELECT devuelven de ninguna o varias filas.  
  • Actualizaciones: INSERT, UPDATE, DELETE, sentencias DDL. 

Veamos en primer lugar consultas que devuelven datos (SELECT)

Los datos se devuelven utilizando un objeto ResultSet. Se accede a los datos a través de un cursor. Este cursor es un puntero que apunta a una fila de datos en el  objeto ResultSet. Inicialmente, el cursor se coloca antes de la primera fila. Accedemos a todas las filas de una a una llamando el método next, ya que cada invocación next avanzará a la siguiente fila.

Ejemplo 2: 

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class ConsultaSencilla {
	public static void main(String[] args) {
		Connection conexion;
		try {
			String urljdbc = "jdbc:oracle:thin:ejemplo/ejemplo@localhost:1521:XE";
			conexion = DriverManager.getConnection(urljdbc, "ejemplo", "ejemplo");
			Statement smt = conexion.createStatement();
			ResultSet rset =
                                 smt.executeQuery("select  empno, ename , job from emp order by 1");
			while (rset.next())
				System.out.println("empleado numero " + rset.getString(1) +
                                " nombre " + rset.getString(2) + " oficio "+ rset.getString(3));
			        resul.close(); // Cerrar ResultSet
                                smt.close(); // Cerrar Statement
                                conexion.close(); // Cerrar conexión

		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}

Veamos como ejecutar sentencias DML (UPDATE, DELETE, INSERT)

Pese a que se trata de sentencias muy dispares, desde el punto de vista de la comunicación con el SGBD se comportan de manera muy similar, siguiendo el siguiente patrón:

  1.  A partir de una conexión activa, instanciaciamos un objeto Statement.
  2. Ejecutamos la sentencia SQL, método executeUpdate.
  3. Cerramos del objeto Statement instanciado.
  4. Cerramos la conexión activa. 

El método executeUpdate devuelve un número entero que representa el número de filas afectadas por la instrucción SQL.

Veamos el ejemplo siguiente, insertamos una línea y luego borramos todas las filas de la tabla jobs

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class Actualizacion {

	public static void main(String[] args) {
		// establecemos la conexion
		Connection conexion;
		try {
			String urljdbc = "jdbc:oracle:thin:ejemplo/ejemplo@localhost:1521:XE";
			conexion = DriverManager.getConnection(urljdbc, "scott", "tiger");
			// crea la sentencia
			Statement stm = conexion.createStatement();
			// ejecuta la actualizacion la ejecucion devuelve 1, numero de filas afectadas
			System.out.println(stm.executeUpdate("insert into jobs values ('ID TEACH', 'PROFESOR IT', 2500, 5000)"));
			// valida los datos
			// ejecuta el borrado, la ejecucion devuelve 19, numero de filas afectadas
			System.out.println(stm.executeUpdate("delete from jobs "));
			stm.close(); // Cerrar Statement
                        // cierra la conexion                       
			conexion.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}

	}

}

Para saber más

Puedes ver un ejemplo más de consultas preparadas en el siguiente enlace: