La interfaz JDBC está definida en la librería java.sql. Vamos a importar a nuestra aplicación Java todas las clases definidas en ella.
import java.sql.*;
Puesto que JDBC puede realizar conexiones con múltiples SGDB, la clase DriverManager configura los detalles de la interacción con cada uno en particular. Esta clase es la responsable de realizar la conexión, entregando un objeto de la clase Connection.
String url="jdbc:mysql://localhost/demo";
String usuario="yo"
String contasenia="contraseña"
Connection conexion = DriverManager.getConnection (url,usuario,contrasenia);
El destino de la conexión se especifica mediante un URL de JDBC con la sintaxis siguiente:
jdbc::
La parte protocolo_sgdb de la URL especifica el tipo de SGBD con el que se realizará la conexión, la clase DriverManager cargará el módulo correspondiente a tal efecto.
El subnombre tiene una sintaxis específica para cada SGDB que tanto para MySQL como para PostgreSQL es //servidor/base_de_datos.
Las sentencias en JDBC también son objetos que deberemos crear a partir de una conexión:
Statement sentenciaSQL = conexion.createStatement();
La variable res contiene el resultado de la ejecución de la sentencia, y proporciona un cursor que permite leer las filas una a una. |
Al ejecutar una sentencia, el SGBD entrega unos resultados que JDBC también representa en forma de objeto, en este caso de la clase ResultSet:
ResultSet res = sentencia.executeQuery("SELECT * FROM tabla");
Para acceder a los datos de cada columna de la hoja de resultados, la clase ResultSet dispone de varios métodos según el tipo de la información de la columna:
getArray() getInt()
getClob() getBoolean()
getString() getLong()
getAsciiStream() getByte()
getDate() getObject()
getTime() getObject()
getBigDecimal() getBytes()
getDouble() getBytes()
getTimestamp() getRef()
getBinaryStream() getRef()
getFloat() getCraracterStream()
getURL() &
import java.sql.*;
// Atención, no debe importarse com.mysql.jdbc ya que se carga dinámicamente!!
public static void main(String[] args) {
// Cargamos el driver JDBC para MySQL
String controlador = "com.mysql.jdbc.Driver"
Class.forName(controlador).newInstance();
// Conectamos con la BD
String url="jdbc:mysql://localhost/uoc";
String usuario="yo"
String contasenia="contraseña"
Connection conexion = DriverManager.getConnection (url,usuario,contrasenia);
// Creamos una sentencia SQL
Statement sentenciaSQL = conexion.createStatement();
// Ejecutamos la sentencia
ResultSet res = sentencia.executeQuery("SELECT * FROM tabla");
// Iteramos sobre la hoja de resultados
while (res.next()) {
// Obtenemos el campo "nombre" en forma de String
System.out.println(res.getString("nombre") );
}
// Finalmente, se liberan los recursos utilizados.
res.close();
sentencia.close();
conexion.close();
}
En el ejemplo anterior no se ha previsto nada para tratar con los errores que puedan producirse, porque en Java el tratamiento de errores se realiza a través de Exceptions. En JDBC se han previsto excepciones para los errores que pueden producirse a lo largo de todo el uso de la API: conexión, ejecución de la sentencia, etc.
Revisemos el ejemplo, utilizando excepciones para tratar los errores.
import java.sql.*;
// Atención, no debe importarse com.mysql.jdbc ya que se carga
// dinámicamente!!
public static void main(String[] args) {
try {
// Cargamos el driver JDBC para MySQL
String controlador = "com.mysql.jdbc.Driver"
Class.forName(controlador).newInstance();
} catch (Exception e) {
System.err.println("No puedo cargar el controlador de MySQL ...");
e.printStackTrace();
}
try {
// Conectamos con la BD
String url="jdbc:mysql://localhost/uoc";
String usuario="yo"
String contasenia="contraseña"
Connection conexion = DriverManager.getConnection (url,usuario,contrasenia);
// Creamos una sentencia SQL
Statement sentenciaSQL = conexion.createStatement();
// Ejecutamos la sentencia
ResultSet res = sentencia.executeQuery("SELECT * FROM tabla");
// Iteramos sobre la hoja de resultados
while (res.next()) {
// Obtenemos el campo "nombre" en forma de String
System.out.println(res.getString("nombre") );
}
// Finalmente, se liberan los recursos utilizados. res.close();
sentencia.close();
conexion.close();
} catch (SQLException e) {
System.out.println("Excepción del SQL: " + e.getMessage());
System.out.println("Estado del SQL: " + e.getSQLState());
System.out.println("Error del Proveedor: " + e.getErrorCode());
}
}
Errores |
Todos los errores de JDBC |
Mientras que la operación executeQuery() de la clase Statement devuelve un objeto ResultSet, la operación executeUpdate()sólo devuelve su éxito o fracaso. Las sentencias SQL que se utilizan con executeUpdate() son insert, update, o delete, porque no devuelven ningún resultado.
public void Insertar_persona(String nombre, direccion,
telefono){ Statement sentencia = conexion.CreateStatement();
sentencia.executeUpdate( "insert into personas values("
+ nombre + ","
+ domicilio + ","
+ telefono + ")" );
}