-------------------------------------------------------------------------------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