JDBC PDF
JDBC PDF
Es una interface de acceso a bases de datos estndar SQL que proporciona un acceso
uniforme a una gran variedad de bases de datos relacionales. JDBC tambin proporciona
una base comn para la construccin de herramientas y utilidades de alto nivel.
El paquete actual de JDK incluye JDBC y el puente JDBC-ODBC. Estos paquetes son para su
uso con JDK 1.0
JDK (Java Development Kit): Se trata de un conjunto de herramientas (programas y libreras) que permiten desarrollar (compi lar,
ejecutar, generar documentacin, etc.) programas en lenguaje Java.
ODBC(Open Database Connectivity): Es un estndar de acceso a bases de datos, que permite mantener
independencia entre los lenguajes de programacin, los sistemas de bases de datos (las bases de datos y su software gestor), y
los sistemas operativos. ODBC es desarrollado por Microsoft Corporation.
Drivers JDBC
Para usar JDBC con un sistema gestor de base de datos en particular, es necesario disponer
del driver JDBC apropiado que haga de intermediario entre sta y JDBC. Dependiendo de
varios factores, este driver puede estar escrito en Java puro, o ser una mezcla de Java y
mtodos nativos JNI.
JNI (Java Native Interface):Es un framework de programacin que permite que un programa escrito en Java ejecutado en la mquina
virtual java (JVM), pueda interactuar con programas escritos en otros lenguajes como C, C++ y ensamblador.
Qu hace JDBC?
Simplemente JDBC hace posible estas tres cosas:
Establece una conexin con la base de datos.
Enva sentencias SQL.
Procesa los resultados.
JDBC es un API de bajo nivel y una base para APIs de alto nivel.
JDBC es una interface de bajo nivel, lo que quiere decir que se usa para invocar o llamar a
comandos SQL directamente. En esta funcin trabaja muy bien y es ms fcil de usar que
otros APIs de conexin a bases de datos, pero est diseado de forma que tambin sea la
base sobre la cual construir interfaces y herramientas de alto nivel. Una interface de alto
nivel es amigable, usa un API mas entendible o ms conveniente que luego se traduce en la
interface de bajo nivel tal como JDBC.
Estableciendo una Conexin
La primera cosa para hacer, por supuesto, es instalar Java, JDBC y el DBMS en sus mquinas
de trabajo. En este caso nosotros tenemos nuestro IDE NetBeans para trabajar con JAVA y
para trabajar con base de datos tenemos MySQL.
Para poder interactuar con una base de datos MySQL, nosotros necesitaramos un driver
para esta base de datos en especfica, este driver lo trae NetBeans y solo hay que incluirlo
en nuestro proyecto.
Incluir Driver a nuestro proyecto: Click derecho en la carpeta libraries -> seleccionar add
library -> seleccionar la librera MySQL JDBC Driver -> dar click en el botn Add Library.
MySQL JDBC Driver en nuestro proyecto
Antes de acceder a una base de datos, debe abrirse una conexin entre nuestro programa
(cliente) y la base de datos (servidor). Esto involucra dos pasos:
Paso 1: Cargue el driver especfico
Por qu necesitamos este paso? Para asegurar portabilidad y reutilizacin del cdigo, el API
fue diseado para ser independiente de la versin o el vendedor de una base de datos. Ya
que diferentes DBMS tiene funcionamiento diferente, necesitamos decirle al driver
administrador del DBMS que deseamos usarlo, para que pueda invocar el driver correcto.
Paso 2: Hacer una conexin
Una vez el driver es cargado y listo para realizar una conexin, usted puede crear una
instancia de un objeto de la clase Connection.
Creando una Instruccin JDBC
Un objeto Statement JDBC se usa para enviar sus declaraciones del SQL al DBMS, y no debe
ser confundida con una declaracin SQL. Un objeto Statement JDBC es asociado con una
conexin abierta para poder ser creado.
Creando un Objeto PreparedStatement JDBC
Algunas veces, es ms conveniente o ms eficiente usar un objeto PreparedStatement para
enviar las instrucciones SQL al DBMS. La caracterstica principal que lo distingue de su
superclase Statement, es que a diferencia de la instruccin Statement, ella est dando una
instruccin SQL correcta cuando se crea.
Esta instruccin SQL se enva en seguida al DBMS, dnde es compilada. Entonces, en efecto,
un objeto PreparedStatement es asociado como un canal con una conexin y una
instruccin SQL compilada.
La ventaja ofrecida es que si necesita usar la misma, o similar consulta con diferentes
parmetros varias veces, la instruccin puede ser compilada y optimizada por el DBMS slo
una vez. Contrasta esto con un uso de una Statement normal dnde cada uso de la misma
instruccin SQL requiere una compilacin de nuevo.
Tambin se crean PreparedStatements con un mtodo Connection. El siguiente trozo
muestra cmo crear una instruccin SQL parametrizada con tres parmetros de entrada:
Ejecutando una Instruccin CREATE/INSERT/UPDATE
La Ejecucin de las instrucciones SQL en JDBC vara dependiendo de la intencin de la
instruccin SQL. Las instrucciones DDL (data definition language) tales como la creacin de
una tabla y la alteracin de una tabla, as como las declaraciones para actualizar el
contenido de una tabla, son todas ejecutadas usando el mtodo executeUpdate. Note que
estos comandos cambian el estado de la base de datos, ya que el nombre del mtodo
contiene Update.
Veamos los siguientes ejemplos de instrucciones executeUpdate:
Ya que la instruccin SQL no encajar en una lnea en la pgina, hemos dividido en dos
cadenas concatenadas por un signo ms (+) para que compilara. Preste atencin a la
instruccin "INSERT INTO Venta", se ha separado en la cadena de la clusula VALUES". Note
que estamos reusando el mismo objeto Statement en lugar de haber creado un nuevo
objeto.
Cuando se usa executeUpdate para llamar las instrucciones DDL, el valor devuelto es
siempre cero, mientras la ejecucin de instrucciones de modificacin de datos devolvern
un valor mayor que cero, el cual es el nmero de tuplas afectadas en la relacin.
Mientras est trabajando con un PreparedStatement, debemos ejecutar tal consulta por el
primer plugging en los valores de los parmetros (como vimos anteriormente), y luego
invocando el executeUpdate sobre l.
int n = prepareUpdatePrecio.executeUpdate();
Ejecutando una Instruccin SELECT
En oposicin a las instrucciones anteriores, se espera que una consulta devuelva un
conjunto de tuplas como resultado, y no cambia el estado de la base de datos. No es
sorprendentemente, ya que un mtodo correspondiente llamado executeQuery, devuelve
sus resultados como un objeto de ResultSet:
La bolsa de tuplas resultante de la consulta est contenida en la variable rs, la cual es una
instancia de ResultSet. Este conjunto de datos no es de mucha utilidad a menos que
podemos acceder cada fila y los atributos en cada fila. El ResultSet nos proporciona un
cursor, que podemos usar para acceder cada fila a la vez. El cursor es inicialmente fijado
antes de la primera fila. Cada invocacin del mtodo next causa que el cursor se mueva a la
siguiente fila, si ella existe retorna verdadero (true), o retorno falso (false) si no hay fila de
retorno.
Podemos usar el mtodo del getXXX del tipo apropiado para recuperar los atributos de una
fila. En el ejemplo anterior, nosotros usamos los mtodos getString y getFloat para acceder
los valores de la columna. Observe que debemos proporcionar el nombre de la columna
cuyo valor se desea adquirir, como parmetro al mtodo.
Tambin debemos observar que los atributos de tipo VARCHAR nombreBar, marcaCerveza,
se han convertido a un String de Java, y el REAL al tipo float de Java.
Equivalentemente, podemos especificar el nmero de la columna en lugar del nombre de la
columna, con el mismo resultado. As las declaraciones pertinentes seran:
Mientras se trabaja con un PreparedStatement, debemos ejecutar tal consulta por el primer
plugging en los valores de los parmetros, e invocando luego el executeQuery sobre l.
ResultSet rs = prepareUpdatePrice.executeQuery() ;
Notas Sobre Accessos ResultSet
JDBC tambin le ofrece varios mtodos para averiguar dnde est ubicado en el conjunto
resultante usando getRow, isFirst, isBeforeFirst, isLast, isAfterLast.
Hay la forma de hacer los cursores desplegables para permitir libre acceso a cualquier fila en
el conjunto resultante.
Por defecto, los cursores desplazan hacia adelante solamente y slo son de lectura. Cuando
se crea una Statement para una Connection, se puede cambiar el tipo de ResultSet a un
modelo desplegable ms flexible o actualizable:
Las diferentes opciones para los tipos son TYPE_FORWARD_ONLY,
TYPE_SCROLL_INSENSITIVE y TYPE_SCROLL_SENSITIVE. Usted puede escoger si el cursor es
de slo lectura o actualizable usando las opciones CONCUR_READ_ONLY, y
CONCUR_UPDATABLE. Con el cursor predefinido, usted puede desplazar usando rs.next().
Con los cursores desplegabless usted tiene ms opciones:
rs.absolute(3); // se mueve a la tercera tupla
rs.previous(); // se mueve hacia atrs una tupla (tupla 2)
rs.relative(2); // se mueve hacia delante dos tuplas (tupla 4)
rs.relative(-3); // se mueve hacia atrs tres tuplas (tuple 1)
Hay una gran cantidad de detalles en el desempeo de un cursor desplegable. Los cursores
desplegables, aunque bastante tiles para ciertas aplicaciones, son extremadamente
susceptibles de traspasar los lmites (overhead), y deben usarse en forma restringida y con
cautela. Ms informacin puede encontrarse en
http://java.sun.com/docs/books/tutorial/jdbc/jdbc2dot0/index.html dnde puede hallar
una gua didctica ms detallada acerca de las tcnicas de manipulacin del cursor.
Transacciones
JDBC permite agrupar instrucciones SQL en una sola transaccin. As, podemos asegurar las
propiedades ACID (Atomicidad, Consistencia, Aislamiento, Durabilidad) usando las
facilidades transaccionales del JDBC.
El control de la transaccin es realizado por el objeto Connection. Cuando una conexin se
crea, por defecto es en modo auto - commit. Esto significa que cada instruccin individual
SQL se trata como una transaccin en s misma, y se comprometer en cuanto la ejecucin
sea terminada. (Esto no es exactamente preciso, pero podemos encubrir esta sutileza por
propsitos didcticos).
Nosotros podemos desactivar el modo auto - commit para una conexin activa con:
con.setAutoCommit(false) ;
y se lo vuelve a activar con:
con.setAutoCommit(true) ;
Una vez que el auto-commit es desactivado, ninguna declaracin del SQL se comprometer
(es decir, la base de datos no se actualizar permanentemente) hasta que usted le haya
dicho explcitamente que comprometa invocando el mtodo commit():
con.commit() ;
A cualquier punto antes del commit, podemos invocar un rollback () para reversar la
transaccin, y restaurar los valores al ltimo punto de commit (antes de las actualizaciones
intentadas).
Aqu hay un ejemplo que presenta estas ideas:
Manejo de Errores con Exceptions
La verdad es que siempre ocurren errores en los programas de software. A menudo, los
programas de base de datos son aplicaciones crticas, y es indispensable que los errores se
capturen y se manejen limpiamente. Los Programas deben recuperar y dejar la base de
datos en un estado consistente. El rollback usado junto con el manejo de excepciones de
Java es una forma decorosa de lograr tal requisito.
El programa (cliente) accediendo una base de datos (servidor) necesita ser consciente de
cualquier error devuelto por el servidor. JDBC da acceso a la tal informacin proporcionando
dos niveles de condiciones del error: SQLException y SQLWarning.
SQLExceptions son las excepciones de Java que, si no manej, terminarn la aplicacin.
SQLWarnings son subclases de SQLException, pero ellas representan errores no fatales o
condiciones inesperadas, las cuales puede ignorarse.
En Java, declaraciones de las cuales se espera disparen una excepcin o una advertencia son
encerradas en un bloque try. Si una declaracin en bloque try dispara una excepcin o una
advertencia, puede ser capturada en una de las declaraciones de captura (catch)
correspondientes. Cada declaracin catch especifica cual excepciones est disponible para
capturar.
Aqu es un ejemplo de captura de un SQLException, y usando la condicin de error para
reversar la transaccin:
En este caso, se dispara una excepcin porque marcaCerveza est definida como VARHAR2
que es un error de sintaxis. No hay tal tipo de datos en nuestro DBMS, entonces se dispara
un SQLException. La salida en este caso ser:
Message: ORA-00902: invalid datatype
Alternativamente, si los tipos de dato estn correctos, una excepcin podra dispararse en
caso de que el tamao de la base de datos exceda la cuota de espacio y sea incapaz de
construir una nueva tabla. Un SQLWarning puede ser regresado de los objetos Connection,
Statement y ResultSet. Cada uno slo almacena el ms reciente SQLWarning.