Objective Viewpoint Index

JDBC - Conectividad de la Base de Datos de Java

por Kevin Henry
Traducido por Paulo N. Lama

Qué es el JDBC?

La conectividad de la base de datos de Java (JDBC , Java Database Connectivity) es un marco de programación para los desarrolladores de Java que escriben los programas que tienen acceso a la información guardada en bases de datos, hojas de calculo, y archivos "planos". JDBC se utiliza comúnmente para conectar un programa del usuario con una base de datos por “detrás de la escena”, sin importar qué software de administración o manejo de base de datos se utilice para controlarlo. De esta manera, JDBC es una plataforma-cruzada [1]. Este artículo proporcionará un código de introducción que demuestra el acceso a la base de datos de los programas de Java que utilizan las clases JDBC API, que está disponible para la transferencia directa libre del sitio de SunÔ [3 ].

Una base de datos que conecta con otros programas se llama fuente de datos. Muchas fuentes de datos, incluyendo los productos producidos por Microsoft y Oracle, utilizan ya un estándar llamado conectividad abierta de la base de datos” (ODBC, Open Database Connectivity). Mucho de la herencia en la programación en C y de los programas del Perl utilizan ODBC para conectar con las fuentes de datos. El ODBC consolidó mucha de la concordancia entre los sistemas de administración de base de datos. Las structuras de JDBC están construidos en esta característica, e incrementa el nivel de abstracción. Los puentes de JDBC-ODBC se han creado para permitir que los programas de Java conecten con el software compatible ODBC de la base de datos [1].

Este artículo asume que los lectores ya tienen una fuente de datos establecida y están moderadamente familiarizados con el lenguaje de interrogación estructurado o más conocido como SQL, Structured Query Language, la lengua de mando para agregar, extraer datos o expedientes, asi como otras manipulaciones básicas de la base de datos. Vea la guía SQL de Hoffman si usted es un principiante o necesite repasar conceptos importantes. [2].

Usando el programa piloto de JDBC

Sin importar la localización, la plataforma, o el programa piloto de la fuente de datos (Oracle, Microsoft, etc.), el JDBC se conecta con una fuente de datos menos difícil proporcionando a una colección de extensiones (class) que contienen los detalles abstractos de la interacción de la base de datos. La ingeniería del software en los programas con JDBC también conduce a la reutilización del módulo. Los programas pueden fácilmente insertados en  diferentes infraestructuras para su almacenamiento de datos  (cualquier plataforma usted elija utilizar en el futuro) con solo sustituir el programa piloto o JDBC driver.

Mientras usted se maneja con las plataformas más populares en base de datos (tales como Oracle, Informix, Microsoft, MySQL, etc.), hay un programa piloto de JDBC escrito que permite que los programas puedan conectarse y manipular los datos. Usted puede descargar un programa piloto específico de JDBC del fabricante de su sistema de administración de base de datos (DBMS) o de terceros (en la caja de los productos abiertos menos populares) [5]. El programa piloto de JDBC para su base de datos vendrá con instrucciones específicas de hacer los archivos del tipo class del programa piloto disponible para la JVM o Máquina Virtual de Java, que va a hacer funcionar su programa. Los programas pilotos de JDBC utilizan el built-in de Java DriverManager para abrir y tener acceso a una base de datos dentro de su programa de Java.

Para comenzar a conectar con una fuente de datos, usted primero necesita al instante, un objeto de su programa piloto de JDBC. Esto esencialmente requiere una sola línea de código, un comando al DriverManager ordenando que la Máquina Virtual de Java cargue el bytecode de su programa piloto en la memoria, donde sus métodos estarán disponibles para su programa. El parámetro o String abajo es el nombre calificado de la clase del programa piloto que usted está utilizando para su combinación de plataformas:

 
Class.forName("org.gjt.mm.mysql.Driver").newInstance();

Conectando con su base de datos

Para manipular realmente su base de datos, usted necesita conseguir un objeto Connection class de su programa piloto. Por lo menos, su programa piloto necesitará un URL para la base de datos y los parámetros para el control de acceso, que generalmente implica la autentificación del password o clave estándar en una cuenta de la base de datos.

Como usted puede ya estar enterado, el estándar del localizador de recurso uniforme o mas bien conocido por sus siglas en Ingles como URL (Uniform Resource Locator) es mucho más que solamente decir a su navegador dónde encontrar un sitio Web:

 
http://www.vusports.com/index.html

El URL para nuestro programa piloto y para la base de datos se parece a esto:

 
jdbc:mysql://db_server:3306/contacts/

Aunque ambos URL lucen diferente, ellos están realmente de la misma forma: el protocolo para la conexión, el nombre del computador principal de la máquina y el número del puerto opcional, y la ruta de dirección del archivo. Su programa piloto de JDBC vendrá con las instrucciones que detallan cómo formar el URL para su base de datos. Parecerá similar al ejemplo anterior dado.

Usted querrá controlar el acceso a sus datos, a menos que la seguridad no sea un problema. El minimo común denominador estándar para la autentificación a una base de datos es un par de cadenas, una cuenta y un password. El nombre y el password de la cuenta que usted da al programa piloto debieran tener significado dentro de su DBMS, donde los permisos establecidos para controlar los privilegios de acceso.

Nuestro ejemplo del programa piloto del JDBC utiliza el objeto Properties class para pasar la información con DriverManager , el cual rinde como un objeto Connection:

 
Properties props = new Properties();
props.setProperty("user", "contacts");
props.setProperty("password", "blackbook");
Connection con = DriverManager.getConnection( 
   "jdbc:mysql://localhost:3306/contacts/", props);

Ahora que tenemos un objeto Connection, podemos pasar fácilmente los comandos a través de él a la base de datos, aprovechándose de las capas de abstracción proporcionadas por JDBC.

Estado de la estructuración

Las bases de datos se componen de tablas, de  las cuales se componen de filas. Cada tabla de la base de datos tiene un conjunto de las filas que definen qué tipos de datos están en cada registro. Los registros también se guardan como filas de la tabla de una base de datos con una fila por registro. Utilizamos la conexión de la fuente de datos creada en la ultima sección para ejecutar un comando a la base de datos.

Escribimos comandos que van a ser ejecutados por el DBMS de base de datos usando el SQL. El sintaxis del estado del SQL, o de la indagación, consiste en la acción de una palabra clave, de un nombre del objetivo de la tabla, y algunos parámetros. Por ejemplo:

 
INSERT INTO songs VALUES ( 
   "Jesus Jones", "Right Here, Right Now");
INSERT INTO songs VALUES ( 
   "Def Leppard", "Hysteria");

Cada una de estas indagaciones del SQL agregaron una fila de datos a la tabla "canciones" en la base de datos. Naturalmente, el orden de los valores insertados en la tabla deben corresponder con las columnas de la tabla, y los tipos de datos de los nuevos valores deben corresponder con los tipos de datos de las columnas respectivas. Para mayor información sobre los tipos de datos utilizados en su DBMS, consulte su manual de referencia.

Para ejecutar el estado del SQL usando el objeto Connection, primero usted necesita crear el objeto estado, que ejecutará la indagación (query) contenida en una palabra clave.

 
Statement stmt = con.createStatement(); 
String query = ... // define query
stmt.executeQuery(query);

Ejemplo: Analizando el texto en un tabla de la base de datos

En la modernización del sistema para mantener los registros, usted encuentra un archivo "plano" de datos que fueron creados mucho antes de que la llegada de una base de datos mas moderna. En vez de tipear todos los datos del archivo "plano" al DBMS, usted puede crear un programa que lea adentro el archivo del texto, insertando cada fila en una tabla de la base de datos, el cual se ha creado para modelar la estructura original del archivo "plano".

En este caso, examinamos un archivo muy simple del texto. Hay solamente algunas filas y columnas, pero el principio aquí es el mismo cuando se trata de aplicar y escalar a problemas más grandes. Hay solamente pocos pasos:

Aquí está el código del programa del ejemplo:

 
import java.io.*;
import java.sql.*;
import java.util.*;
 
public class TextToDatabaseTable {
   private static final String DB = "contacts",
                               TABLE_NAME = "records",
                               HOST = "jdbc:mysql://db_lhost:3306/",
                               ACCOUNT = "account", 
                               PASSWORD = "nevermind",
                               DRIVER = "org.gjt.mm.mysql.Driver",
                               FILENAME = "records.txt";
 
   public static void main (String[] args) {
      try {
 
         // connect to db
         Properties props = new Properties();
         props.setProperty("user", ACCOUNT);
         props.setProperty("password", PASSWORD);
 
         Class.forName(DRIVER).newInstance();
         Connection con = DriverManager.getConnection( 
            HOST + DB, props); 
         Statement stmt = con.createStatement(); 
 
         // open text file
         BufferedReader in = new BufferedReader( 
                                new FileReader(FILENAME));
 
         // read and parse a line
         String line = in.readLine();
         while(line != null) {
 
            StringTokenizer tk = new StringTokenizer(line);
            String first = tk.nextToken(),
                   last = tk.nextToken(),
                   email = tk.nextToken(),
                   phone = tk.nextToken();
 
            // execute SQL insert statement
            String query = "INSERT INTO " + TABLE_NAME;
            query += " VALUES(" + quote(first) + ", ";
            query += quote(last) + ", ";
            query += quote(email) + ", ";
            query += quote(phone) + ");";
            stmt.executeQuery(query);
 
            // prepare to process next line
            line = in.readLine();
         }
         in.close();
      }
 
      catch( Exception e) { 
         e.printStackTrace();
      } 
   }
 
   // protect data with quotes
   private static String quote(String include) {
      return("\"" + include + "\"");
   }
}

Procesando el conjunto de resultados

Quizás más a menudo que estar insertando los datos, usted podrá extraer la información existente de su base de datos y utilizarla en su programa de Java. La manera mas usual de implementarlo es con otro tipo de indagación del SQL, que selecciona un conjunto de filas y de columnas de su base de datos y  se parece mucho a una tabla. Las filas y columnas del conjunto del resultados serán aquel subconjunto de las tablas que usted buscó, donde ciertos campos corresponden con sus parámetros. Por ejemplo:

 
SELECT title FROM songs WHERE artist="Def Leppard";

Esta indagación vuelve:

título

Hysteria

La porción del cuadro de arriba es un simple conjunto de resultados de una determinada de la base de datos. En un programa de Java, esta declaración o estado del SQL puede ser ejecutado de la misma manera que en el ejemplo anterior, pero además, debemos capturar los resultados en un objeto ResultSet.

 
Statement stmt = con.createStatement(); 
String query = "SELECT FROM junk;"; // define query
ResultSet answers = stmt.executeQuery(query);

La versión de JDBC de un conjunto de resultados de la indagación tiene un cursor que señala inicialmente la fila, justo antes de la primera fila. Para avanzar el cursor, utilice el método next(). Si usted se sabe los nombres de las columnas de su conjunto de resultados, usted puede referirlos por su nombre. Usted puede también referir a las columnas por número, comenzando con el 1. Generalmente podrá conseguir el acceso a todas las filas de su conjunto de resultados, usando un bucle como en el segmento de código siguiente:

 
while(answers.next()) {
   String name = answers.getString("name");
   int number = answers.getInt("number");
   // do something interesting
}

Todos las tablas de la base de datos tienen meta datos que describen los nombres y los tipos de datos de cada columna; los conjuntos de resultados son la misma manera. Usted puede utilizar ResultSetMetaData class para conseguir los numeros y los nombres de las columnas, como aqui:

 
ResultSetMetaData meta = answers.getMetaData();
String[] colNames = new String[meta.getColumnCount()];
for (int col = 0; col < colNames.length; col++) 
   colNames[col] = meta.getColumnName(col + 1);

Ejemplo: Imprimiendo una tabla de la base de datos

Elegimos escribir una herramienta simple de un software para mostrar las filas y las columnas de un tabla de la base de datos.

En este caso, vamos a preguntar por una tabla de la base de datos con todos sus registros, y visualizamos el conjunto de resultados fijado a la línea de comando. Podríamos también crear un gráfico hecho con los componentes del  Java Swing.

Note que no sabemos nada, excepto el URL y información de autentificación de la tabla de la base de datos que vamos a visualizar. Todo esta determinado por los ResultSet y sus meta datos.

Los comentarios en el código explican las acciones del programa. Aquí está el código del programa del ejemplo:

 
import java.sql.*;
import java.util.*;
         
public class DatabaseTableViewer {
   private static final String DB = "contacts",
                               TABLE_NAME = "records",
                               HOST = "jdbc:mysql://db_host:3306/",
                               ACCOUNT = "account",
                               PASSWORD = "nevermind",
                               DRIVER = "org.gjt.mm.mysql.Driver";
         
   public static void main (String[] args) {
      try {
 
         // authentication properties
         Properties props = new Properties();
         props.setProperty("user", ACCOUNT);
         props.setProperty("password", PASSWORD);
               
         // load driver and prepare to access
                Class.forName(DRIVER).newInstance();
         Connection con = DriverManager.getConnection(
            HOST + DB, props);
         Statement stmt = con.createStatement();
         
         // execute select query
         String query = "SELECT * FROM " + TABLE_NAME + ";";
         ResultSet table = stmt.executeQuery(query);
            
         // determine properties of table
         ResultSetMetaData meta = table.getMetaData();
         String[] colNames = new String[meta.getColumnCount()];
         Tabla[] cells = new Tabla[colNames.length];
         for( int col = 0; col < colNames.length; col++) {
            colNames[col] = meta.getColumnName(col + 1);
            cells[col] = new Tabla();
         } 
 
         // hold data from result set
         while(table.next()) {
            for(int col = 0; col < colNames.length; col++) {
               Object cell = table.getObject(colNames[col]);
               cells[col].add(cell);
            }
         }
         
         // print column headings
         for(int col = 0; col < colNames.length; col++)
            System.out.print(colNames[col].toUpperCase() + "\t");
         System.out.println();
 
         // print data row-wise
         while(!cells[0].isEmpty()) {
            for(int col = 0; col < colNames.length; col++) 
               System.out.print(cells[col].remove(0).toString() 
                                   + "\t");
            System.out.println();
         }
      }
 
      // exit more gently
      catch(Exception e) {
         e.printStackTrace();
      }
   }
}

Conclusiones

En este artículo, usted vio una rápida introducción a la manipulación de las bases de datos con JDBC. Las características más avanzadas del JDBC requieren un mayor conocimiento acerca de las bases de datos. Vea más artículos de referencia acerca del JDBC y sus aplicaciones [ 4 ]. Como programador de Java, el JDBC es una buena herramienta a tener en su arsenal.

Le animo a que copie el código en este artículo en su propio computador. Con este artículo y documentación para otro programa piloto de JDBC, usted está en su camino de crear programas de fuentes de datos conducida por Java. Experimente con este código, y adáptelo para conectar las fuentes de datos disponibles para usted.

Referencias

1 ComputerWorld. Java Database Connectivity por Carol Sliwa -- http://www.computerworld.com/cwi/story/0,1199,NAV47-68-85-98_STO43545,00.html

2 Hoffman. Tutorial de SQL -- http://w3.one.net/~jhoffman/sqltut.htm

3 Sun Microsystems. JDBC Data Access API -- http://java.sun.com/products/jdbc/index.html

4 Sun Microsystems. JDBC Data Access API: Articles and Success Stories -- http://java.sun.com/products/jdbc/articles.html

5 Sun Microsystems. JDBC Data Access API: Drivers o Programas Pilotos-- http://industry.java.sun.com/products/jdbc/drivers

Last Modified:
Location: www.acm.org/crossroads/espanol/xrds7-3/ovp_marzo2001.html