Texto íntegro de Carlos Morales
is06200@salleurl.edu
Java DataBase Connectivity
-

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:

  1. Debemos antes de nada cargar el driver, mediante la orden Class.forName
  2. Especificar la base de datos que será de la clase String y su valor es la URL
  3. Pasamos una URL al método getConnection(), que pertenece a la clase DriverManager, que escoge el driver adecuado, y nos retorna un objeto Connection
  4. Una vez tenemos el objeto Connection podemos crear un Statement con el método createStatement()
  5. Con este objeto Statement podemos hacer consultas a la base de datos con el método executeQuery("SELECT ... "), pasándole el query que queremos que ejecuta. Al hacer la llamada nos retorna un objeto ResultSet en el caso de haber hecho una consulta, si era una actualización de la base de datos no nos retorna nada
  6. Finalmente una vez tenemos el objeto ReultSet tenemos una especie de cursor que debemos mover con el método next()el caso de que hubiese varios resultados (como se puede ver en los ejemplos del final cuando nos retorne un valor siempre hay que hacer un primer next pues el cursor se inicializa en la línea de los nombres de cada campo). Una vez puesto el cursor donde queríamos podemos obtener todos los resultados de la consulta con los siguientes métodos:
  • getByte
  • getShort
  • getInt
  • getLong
  • getFloat
  • getDouble
  • getBigDecimal
  • getBoolean
  • getString
  • getBytes
  • getDate
  • getTime
  • getTimestamp
  • getAsciiStream
  • getUnicodeStream
  • getBinaryStream
  • getObject

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:

http://java.sun.com/docs/books/tutorial/jdbc/index.html

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.