Para operar con una base de datos, ejecutando las consultas necesarias, nuestra aplicación deberá:
- Cargar el driver necesario para comprender el protocolo que usa la base de datos en cuestión.
- Establecer una conexión con la base de datos.
- Enviar consultas SQL y procesar el resultado.
- Liberar los recursos al terminar.
- 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:
- A partir de una conexión activa, instanciaciamos un objeto
Statement.
- Ejecutamos la sentencia SQL, método
executeUpdate.
- Cerramos del objeto
Statement
instanciado. - 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();
}
}
}