El tema que decido tratar aquí se refiere a la interfaz que hay entre una base de datos y un programa hecho en Java. El API JDBC es un conjunto de interfaces diseñadas con el objetivo de aislar al programador de una aplicación, hecha en Java, que deba comunicarse con una base de datos especifica. De esta manera, se permite al programador concentrarse en la aplicación, con la garantía que las consultas que se hagan a la base de datos se hagan correctamente y que los datos serán manipulados según se esperaba.
JDBC nos hace posible que una aplicación o applet se conecte a una base de datos para poder hacer consultas o actualizar datos. El código fuente será el mismo con independencia de la base de datos que corra por debajo sin importarnos siquiera dónde esta ubicada esta físicamente. A las ventajas que tiene Java de poder ejecutarse bajo cualquier plataforma ahora añadimos además la de poder trabajar con cualquier base de datos, con lo que podemos diseñar aplicaciones web que accedan a base de datos potentes permitiendo así que haya muchos usuarios que estén accediendo a la misma base de datos.
El programador deberá describir la aplicación usando los métodos que se describen en la API, dejando de banda de que forma se implementa realmente el driver. De hecho la API se trata como si de otra clase se tratase. Las clases que implementaran las interfaces descritas en la API serán proporcionadas por el propietario de la base de datos. Gracias a este mecanismo, cuando estemos utilizando un método descrito en alguna de las interfaces realmente nos estaremos refiriendo a un objeto de la clase que implementa la interfaz.
Todo esto no implica que cuando accedemos a la base de datos lo hagamos de forma limitada, más bien es el contrario ya que la API JDBC permite pasar cualquier consulta de SQL a la capa más inferior de comunicación con la base de datos. Esta característica permite que el programador haga uso de la funcionalidad propia de la base de datos con la que interactua, sin limitarse a la utilización de SQL estándar.
El driver JDBC
Java consigue ‘dialogar’ con las bases de datos mediante la utilización de drivers. Un driver se define como una librería de software que permite tener acceso a una fuente de datos, más concretamente, es un conjunto de clases que implementan las interfaces JDBC requeridas. Para cada sistema de administración de base de datos será necesario tener un driver diferente. Todos los drivers deberán de proveer una clase que implemente la interfaz java.sql.Driver. Esta clase utilizará la clase genérica java.sql.DriverManager cuando sea necesario conectarse a una base de datos particular mediante una URL (" Uniform Resorce Locator" ). Java se encarga de establecer la comunicación con el driver apropiado en cada caso. De esta forma, para el programador que desarrolla una aplicación es diferente trabajar con un gestor o con otro.
Por tanto como puede observarse, con este mecanismo podemos acceder a diversos sistemas de base de datos a través de uno o más drivers.
Tipos de Drivers
Existen diversos tipos de drivers JDBC que se diferencian entre sí por la manera de conectarse a los diferentes sistemas gestores de base de datos.
Drivers JDBC-ODBC:
Convierten las llamadas JDBC en llamadas equivalentes ODBC. Las siglas ODBC ( Open DataBase Connectivity ) representan un protocolo estándar para el acceso a la información de servidores de bases de datos SQL, como por ejemplo Microsoft SQL Server. De esto se deduce que la utilización de los controladores JDBC-ODBC parten de la necesaria existencia de un controlador ODBC en la máquina donde se desarrolla la aplicación. Por tanto los controladores JDBC-ODBC únicamente son adecuados en plataformas que soportan ODBC (es el caso entre otros de sistemas Microsoft ). Esta no es una de las soluciones más eficientes, ya que únicamente se esta añadiendo una capa más a la estructura de acceso existente mediante ODBC. Aún y así permiten desarrollar de forma sencilla aplicaciones Java integrados en estos sistemas.
Drivers JDBC-API nativos:
Convierten las llamadas a un API por Sybase, Oracle, Infomix, etc... Igual que en el caso anterior, este driver requieren de la presencia de determinados archivos binarios en la parte del cliente.
Drivers JDBC-Net:
Las llamadas se traducen a un protocolo de red independiente de la base de datos. Estos deberían ser convertidos en el mismo tiempo en llamadas nativas, las cuales dependerán en cada caso del fabricante de la base de datos a la que se quiere acceder.
Drivers Java puros:
Son un caso especial de drivers JDBC-Net en los cuales la comunicación se establece directamente con el servidor de la base de datos mediante un protocolo, normalmente propietario.
Cómo accedemos
Cada una de las interfaces y clase antes expuestas de la API JDBC permite que el programador pueda establecer conexiones con una base de datos cualquiera, ejecutar peticiones SQL sobre los datos y procesar los resultados que se obtienen. El proceso que sigue cualquier programa desarrollado en Java para obtener información de una base de datos se organizar de la siguiente manera:
Es opcional pasarle el nombre del campo que queremos que nos retorne.
Ejemplos
Este ejemplo es de la práctica que hice en la asignatura de progrmación hipermedia, que trataba de hacer páginas dinámicas mediante Java.
Aquí usamos el driver del tipo JDBC-ODBC ya que usamos la base de datos Microsoft Access, es solo un ejemplo de cómo usar la API JDBC, ya que los recursos de esta base de datos son muy limitados pero como he explicado antes solo habría que cambiar el nombre del driver para poder usar una base de datos más potente.
Para poder ejecutar este ejemplo además del mencionado Access necesitamos agregar la base de datos llamada mibasededatos al DSN de sistema.
En el primer ejemplo hacemos una búsqueda de un módulo específico de una página web, el módulo se llama "contentType" y la página se llama "page" y los dos se les pasa por parámetros, el resultado de la búsqueda se retorna.
String url = "jdbc:odbc:mibasededatos ";
String driver = "sun.jdbc.odbc.JdbcOdbcDriver";
Connection connection;
Statement stmt;
public String Search(String page, String contentType){
String query;
ResultSet rs;
String IdPage;
String texto;
try {
Class.forName(driver);
}catch(java.lang.ClassNotFoundException e) {
//error driver no encontrado
System.err.print("ClassNotFoundException: ");
System.err.println(e.getMessage());
}
try {
connection = DriverManager.getConnection(url);
}catch(Exception e) {
//error base de datos no encontrada
System.err.print("DB Not Found Exception: ");
System.err.println(e.getMessage());
}
try {
stmt = connection.createStatement();
// Busqueda del identificador interno de la página
query= "SELECT * FROM Paginas WHERE NomP='" + page + "'";
rs = stmt.executeQuery(query);
rs.next();
IdPage = rs.getString("IdP");
// Busqueda del texto del modulo espedificado
query = "SELECT * FROM Contenidos WHERE IdC='" + contentType +"' and Idp=" + IdPage ;
rs = stmt.executeQuery(query);
rs.next();
texto = rs.getString("Contenido");
stmt.close();
connection.close();
} catch(SQLException ex) {
System.err.println("SQLException: " + ex.getMessage());
}
return texto;
}
El segundo ejemplo modificamos el valor que antes estábamos buscando. Ahora además de pasarle la página a modificar y el módulo, se le pasa el nuevo texto.
public void Update(String page, String contentType, String content){
String query;
ResultSet rs3;
String IdPage;
try {
Class.forName(driver);
}catch(java.lang.ClassNotFoundException e) {
System.err.print("ClassNotFoundException: ");
System.err.println(e.getMessage());
}
try {
con = DriverManager.getConnection(url);
stmt = con.createStatement();
/// Busqueda del identificador ///
query = "SELECT * FROM Paginas WHERE NomP='" + page + "'";
rs3 = stmt.executeQuery(query);
rs3.next();
IdPage = rs3.getString("IdP");
/// Busqueda del texto ///
query = "UPDATE Contenidos SET Contenido='" + content + "' WHERE IdC='" + contentType +"' and Idp=" + IdPage ;
stmt.executeUpdate(query);
stmt.close();
con.close();
} catch(SQLException ex) {
System.err.println("SQLException: " + ex.getMessage());
}
}
Bibliografía
En la red:
Libros de la compañía Sun:
Titulo: JDBC Database Access with Java: A Tutorial and Annotated Reference Autores: Graham Hamilton, Rick Cattell, y Maydene Fisher. Publicado por: Addison Wesley Longman, Inc. Titulo: JDBCTMAPI Tutorial and Reference, Second Edition: Universal Data Access for the Java 2 Platform Autores: Seth White, Maydene Fisher, Graham Hamilton, Rick Catell, and Mark Hapner. Publicado por: Addison Wesley Longman, Inc. June 1999.