2.1. Acceder al SGBD con JDBC

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
se informan a través de SQLExeption. SQLWarning presenta las advertencias de
acceso a las bases de datos.

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 + ")" );
  }