Está en la página 1de 7

--------------------------------------------------------------------------------

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:

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