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:
- Abra una conexión a la base
de datos.
- Baje hasta el extremo final
del archivo:
- Lea la línea del texto
del archivo "plano".
- Analice la línea del
texto en las columnas de la tabla.
- Ejecute una
declaración o estado del SQL para insertar el registro.
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:
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