SlideShare una empresa de Scribd logo
1 de 10
Tópicos avanzados de programación
SCD1027
Aula I13
Alumno: Joaquín Martínez Benjamín Joaquín Martínez
Trabajo: Investigación
JDBC
Una integraciónde SQL haciaJava, esdecirque lassentenciasSQLse puedanmezclarcon Java,por
ejemplo, que una variable de Java pueda ser usada en una sentencia SQL para recibir o dar
valores.Unmapeodirectode las tablas de la BD hacia las clasesde Java, donde cala filade la tabla
se convierte en una instancia de la clase, y donde cada columna se corresponde a un atrubuto de
esa instancia.
ODBC es muy difícil de aprender, hace una mezcla de acciones simples y avanzadas.
Una API como JDBC es necesario para poder desarrollar una solución “puramente de Java”
La clase DriverManager
La clase DriverManagerimplementalacapade gestiónde JDBC,ytrabaja comointermediariaentre
el usuario y los drivers.Guarda la listade losdriversque estándisponiblesyestablece laconexión
entre labase de datosyel driverapropiado.AdemáslaclaseDriverManagerse ocupadecosascómo
gestionarloslímitesde tiempode ‘login’enel driver y de la salida de los mensajes de traza y log.
Para aplicacionessimples,el únicométodoenestaclase que necesitaunprogramadorgeneral para
su uso directamente es DriverManager.getConnection. Como su nombre indica, este método
establece una conexión con la base de datos. JDBC permite al usuario llamar a los métodos de
DriverManager getDriver, getDrivers y registerDriver así como al método de Driver connect, pero
en la mayoría de los casos es preferible dejar que la clase DriverManager gestione los detalles al
establecer la conexión.
Mantenimiento de la lista de drivers disponibles.
La clase DriverManagermantiene unalistade clasesdisponiblesque hansidoregistradosmediante
el método DriverManager.registerDriver. Todas las clases Driver deben escribirse con una sección
estática que cree una instancia de la clase y luego la registre en la clase DriverManager cuando se
cargue. Además el usuario normalmente no debería llamar a DriverManager.registerDriver
directamente; debería llamarse automáticamente por el driver cuando esté se carga,. Una clase
Driver se carga, y por tanto se registra, de dos formas diferentes:
1 Mediante una llamada al método Class.forName. Este carga explícitamente la clase driver. Dado
que no depende de ningún ‘setup’ externo, esta forma de cargar drivers es la recomendada. El
siguiente código carga la clase acme.db.Driver:
Class.forName("acme.db.Driver");
Si acme.db.Driver se ha escrito para que al cargar produzca una instancia y llame al método
DriverManager.registerDriver con esta instancia como argumento (es lo que debería hacer),
entonces este estará en la lista de drivers disponibles para efectuar la conexión.
2 Mediante laadicióndel driveralapropiedadjdbc.driversde java.lang.System-Estaesunalistade
nombresde clasesde drivers,separadaspordospuntos,que eslaquecargalaclase DriverManager.
Cuando la clase DriverManager se inicializa, mira en la propiedad jdbc.drivers, y si el usuario ha
introducidounoo más drivers,la clase DriverManagerintentacargarlos.El siguiente códigoilutsra
como un programador debería introducir estas tres clases en ~/.hotjava/properties
jdbc.drivers=foo.bah.Driver:wombat.sql.Driver:bad.test.ourDriver;
La primerallamadaal métodoDriverManagerharáque estosdriversse carguenautomáticamente.
Nótese que enestasegundamanerade cargarlosdriversesnecesariounapreparacióndelentorno
que es persistente. Si existe alguna duda sobre esto es preferible y más seguro llamar al método
Class.forName para cargar explicitamente cada driver. Este es también el método que se usa para
traer un driver particular puesto que una vez que la clase DriverManager ha sido inicializada no
chequeará la lista de propiedades jdbc.drivers.
Enamboscasos,esresponsabilidaddelaclase Driverreciéncargadaregistrarseasi mismamediante
una llamadaa DriverManager.registerDriver.Comose hamencionadoanteriormente,estodebería
hacerse automáticamente al cargar la clase.
Por razones de seguridad, la capa de gestión de JDBC guardará traza de que clases de cargadores
provee cada driver. Entonces cuando la clase DriverManager abre una conexión solo usará los
driversque vienendesde el sistemade ficheroslocal odesde lasmismasclasescargadorascomoel
código que solicita la conexión.
Establecer una conexión
Una vez que la clase Driver ha sido cargada y registrada con la clase DriverManager, se está en
condiciones de establecer la conexión con la base de datos. La solicitud de la conexión se realiza
mediante unallamadaal métodoDriverManager.getConnection,yDriverManagertestealosdrivers
regsitrados para ver si puede establecer la conexión.
A veces puede darse el caso de que más de un driver JDBC pueda establecer la conexiónpara una
URL dada.Por ejemplo,cuandoconectamosconunabase de datosremota,podría ser posible usar
un driver puente JDBC-ODBC, o un driver JDBC de protocolo genérico de red, o un driver
suministrado por el vendedor.
En talescasos,el ordenenque losdriversontesteadosessignificanteporque DriverManagerusará
el primer driver que encuentre que pueda conectar con éxito a la base de datos.
PrimeroDriverManagerintentausarcada driverenel ordenenque ha sidoregistrado( los drivers
listados en la propiedad jdbc.drivers son siempre losregistrados primero). Saltará cualquier driver
con código ‘untrusted’, a menos que se cargue desde el mismo código fuente que el código que
intenta abrir la conexión.
Testea los drivers mediante la llamada al método Driver.connect cada uno por turno, pasándole
como argumento la URL que el usuario ha pasado originalmente al método
DriverManager.getConnection. El primer driver que reconozca la URL realiza la conexión.
Una primera ojeda puede parecer insuficiente, pero son necesarias solo unas pocas llamadas a
procedimientos y comparaciones de cadena por conexión puesto que no es probable que haya
docenas de drivers se carguen concurrentemente.
El siguiente códigoesunejemplode todolonecesarionormalmente paraestablecerunaconexión
con un driver puente JDBC-ODBC:
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //loads the driver
String url = "jdbc:odbc:fred";
DriverManager.getConnection(url, "userID", "passwd");
La clase Statement
Un objeto Statement se usa para enviar sentencias SQL a la base de datos. Actualmente hay tres
tipos de objetos Statement, todos los cuales actúan como contenedores para la ejecución de
sentencias en una conexión dada: Statement, PreparedStatement que hereda de Statement y
CallableStatementque heredade PreparedStatement.Estasestànespecializadasparaenviartipos
particularesde sentenciasSQL,UnobjetoStatementse usaparaejecutarunasentenciaSQLsimple
sin parámetros. Un objeto PreparedStatement se usa para ejecutar sentencias SQL precompiladas
con o sin parámetros IN; y un objeto CallableStatement se usa para ejecutar un procedimienode
base de datos almacenado.
La interface Statementsuminstramétodosbásicospara ejecutarsentenciasydevolverresultados.
La interfase PreparedStatementañade métodosparatrabajat con losparámetros IN;y la interfase
CallableStatement añade métodos para trabajar con parameters OUT.
Creación de objetos Statement
Una vez establecidalaconexiónconunabase de datosparticular,estaconexiónpuede usarse para
enviar sentencias SQL. Un objeto Statement se crea mediante el método de Connection
createStatement, como podemos ver en el siguiente fragmento de código.
Connection con = DriverManager.getConnection(url, "sunny", "");
Statement stmt = con.createStatement();
La sentenciaSQL que será enviadaa la base de datos es alimentadacomoun argumentoa unode
los métodos de ejecución del objeto Statement. Por ejemplo:
ResultSet rs = stmt.executeQuery("SELECT a, b, c FROMTable2");
Ejecución de sentencias usando objetos Statement.
La interfase Statement nos suministra tres métodos diferentes para ejecutar sentencias SQL,
executeQuery,executeUpdate yexecute.El métodoausar esta determinadoporel productode la
sentencia SQL
El método executeQuery esta diseñado para sentencias que producen como resultado un único
result set tal como las sentencias SELECT.
El método executeUpdate se usa para ejecutar sentencias INSERT, UPDATE ó DELETE así como
sentenciasSQLDDL(DataDefinitionLanguage) comoCREATETABLEoDROPTABLE.El efectode una
sentenciaINSERT,UPDATEoDELETE esunamodificaciónde unaomáscolumnasenceroomásfilas
de una tabla. El valor devuelto de executeUpdate es un entero que indica el número de filasque
hansidoafectadas(referidocomoupdatecount).ParasentenciastalescomoCREATETABLEoDROP
TABLE, que no operan sobre filas, le valor devuelto por executeUpdate es siempre cero.
El métodoexecutese usaparaejecutarsentenciasque devuelvenmásde unresultset,más que un
update counto una combinaciónde ambos.Comoesesta unacaracterística avanzada que muchos
programadores no necesitarñan nunca se verá en su propia sección.
Todos los métodos que ejecutan sentencias cierran los objetosResultset abiertoscomo resultado
de lasllamadasa Statement.Estoquiere decirque es necesariocompletarel procesoconel actual
objeto Resulset antes de reejecutar una sentencia Statement.
Debe notarse que la interfase PreparedStatement, que hereda los métodos de la interfase
Statement,tienesuspropiasversionesdelosmétodosexecuteQuery,executeUpdateyexecute.Los
objetos Statement en si mismos no contienen una sentencia SQL, por tanto debe suministrarse
como un argumento a los métodos Statement.execute. Los objetos PreparedStatement no
suministranunasentenciaSQLcomoargumentoaestosmétodospuestoque yatienenlasentencia
precompilada. Los objetos CallableStatement heredan las formas de estos métodos de
PreparedStatement. Usar un parametro de query con las versiones de los métodos de
PreparedStatement o CallableStatement producirái una SQLException,.
Realización de Statement
Cuando una conexión está en modo auto-commit, las sentencias ejecutadas son ‘comitadas’ o
rechazadascuando se completan.Un sentenciase consideracompletacuandoha sidoejecutaday
se han devueltotodoslosresultados.Pare el métodoexecuteQuery,que devuelve unúnicoresult
set, la sentencia se completa cuando todas las filas del objeto ResultSet se han devuelto. Para el
métodoexecuteUpdate,unsentenciase completacuandose ejecuta.En los raros casos en que se
llama al método execute, de cualquier modo, no se completa hasta que los result sets o update
counts que se generan han sido devueltos.
AlgunosDBMStratancada sentenciaenun procedimientoalmacenadocomosentenciasseparadas.
Otros tratan el procedimientoenterocomouna sentenciacompuesta.Estadiferenciase convierte
en importante cuandoestáactivo el modo auto-commitporque afectacuandose llamaal método
commit. En el primer caso, cada sentencia individual es commitada. En el segundo, se commiten
todas juntas.
Cerrar objetos Statement.
Los objetos Statement se cerrarán automáticamente por el colector de basura de Java (garbage
collector). No obstante se recomienda como una buena práctica de programación que se cierren
explicitamente cuandonosean ya necesarios.EstoliberarecursosDBMS inmediatamente yayuda
a evitar potenciales problemas de memoria.
Sintaxis de Escape SQL en objetos Statement
Los objetosStatementpuedencontenersentenciasSQLque usensintaxisde escape SQL.Lasintaxis
de escape señalaal driverqueel códigoquellevadebe sertratadodiferentemente.El driverbuscará
porcualquiersintaxisde escapeylotraduciráencódigoque entiendelabase de datosenparticular.
Esto hace que la sintaxis de escape sea independiente de la DBMS y permite al programador usar
características que de otro modo no estarían disponibles.
Una cláusula de escape se enmarca entre llaves y tiene una palabra clave:
{keyword . . . parameters . . . }
La palabra clave (keyword) indica el tipo de clausula de escape, según se muestra:
• escape para caracteres LIKE
Los caracteres “%” y “_” trabajan como wildcardsen la clausulaSQL LIKE (“%”significacero o más
caracteresy “_” significaexactamenteuncarácter”.En ordena interpretarlosliteralmente,pueden
estarprecedidosporunbackslash(‘’),que esuncarácterde escape especial encadenas.Se puede
especificarun carácter que se use como carácter de escape por la inclusiónde lasintaxissiguiente
al final de la consulta.
{escape 'escape-character'}
Por ejemplo,lasiguientequery,usandobackslashcomocaracterde escape,encuentranombresde
identificador que comiencen con ‘_’.
stmt.executeQuery("SELECT name FROMIdentifiers
WHERE Id LIKE `_%' {escape `'};
La clase ResultSet
Un ResultSet contiene todas las filas que satisfacen las condiciones de una sentencia SQL y
proporcionael accesoalosdatosde estasfilasmedianteunconjuntode métodosgetque permiten
el acceso a las diferentes columnas de la filas. El método ResultSet.next se usa para moverse a la
siguiente fila del result set, convirtiendo a ésta en la fila actúal.
El formato general de un result set es una tabla con cabeceras de columna y los valores
correspondientesdevueltosporla‘query’.Porejemplo,si la‘query’esSELECTa, b,c FROMTable1,
el resultado tendrá una forma semejante a :
a b c
-------- --------- --------
12345 Cupertino CA
83472 Redmond WA
83492 Boston MA
El siguientefragmentode códigoesunejemplode laejecuciónde unasentenciaSQLque devolverá
una colecciónde filas,con la columna1 como un int, la columna2 como una String y la columna3
como un array de bytes:
java.sql.Statement stmt = conn.createStatement();
ResultSet r = stmt.executeQuery("SELECT a, b, c FROMTable1");
while (r.next())
{
// print the values for the current row.
int i = r.getInt("a");
String s = r.getString("b");
float f = r.getFloat("c");
System.out.println("ROW = " + i + " " + s + " " + f);
}
Filas y Cursores
Un ResultSet mantiene un cursor que apunta a la fila actúal de datos. El cursor se mueve una fila
hacia abajocada vezque se llamaal métodonext.Incialmente se sitúaantesde laprimerafila,por
loque hayque llamaral métodonextparasituarloenlaprimerafilaconviertiendolaenlafilaactúal.
Las filas de ResultSet se recuperan en secuencia desde la fila más alta a la más baja.
Un cursor se mantiene válidohastaque el objetoResultsetosu objeto padre Statement se cierra.
En SQL, el cursor resultado para una tabla tiene nombre. Si una base de datos permite upadtes
posicionados o deletes posicionados,el nombre del cursor es necesarioy debe ser proporcionado
comoun parámetro del comandoupdate odelete.El nombre delcursorpuede obtenersemediante
una llamada al método getCursorName.
No todas las bases de datos soportan updates o deletes posicionados. Los métodos
DatabaseMetaData.supportsPositionedDeleteyDatabaseMetaData.supportsPositionedUpdatenos
permitendescubrirsi estasoperacionesestánsoportadasenuna conexióndada.Cuandolo están,
el drivero la DBMS debenasegurarse que lasfilasseleccionadasestánapropiadamentebloquedas
y por tanto que estas operaciones no provoquen actualizaciones anomalas ni otros problemasde
concurrencia.
Columnas
Los métodos getXXX suministran los medios para recuperar los valores de las columnas de la fila
actúal.Dentrode cadafila,losvaloresde lascolumnaspuedenrecuperarseen cualquierorden,pero
para asegurarlamáximaportabilidad,deberíanextraerselascolumnasdeizquierdaaderechayleer
los valores de las columnas una única vez.
Puede usarse o bien el nombre de la columna o el número de columna para referirse a esta. Por
ejemplo: si la columna segunda de un objeto RecordSet rs se denomina “title” y almacena valores
de cadena, cualquiera de los dos ejemplos siguientes nos devolverá el valor almacenado en la
columna.
String s = rs.getString("title");
String s = rs.getString(2);
Nótese que lascolumnasse numerandeizquierdaaderechacomenzandoconlacolumna1.Además
los nombres usados como input en los métodos getXXX son insensibles a las mayúsculas.
La opción de usar el nombre de columna fue provista para que el usuario que especifica nombres
de columnasenuna‘query’puedausaresosnombrescomoargumentosde losmétodosgetXXX.Si,
por otro lado, la sentencia select no especifica nombres de columnas (tal como en “select * from
table1”oencasosdonde unacolumnaes derivada),debenusarse losnúmerosde columna.Enestas
situaciones , no hay forma de que el usuario sepa con seguridad cuales son los nombres de las
columnas.
En algunoscasos,esposibleparaunaquerySQLdevolverunresultsetconmásde unacolumna con
el mismo nombre. Si se usa el nombre de columna como argumento en un método getXXX, éste
devolverá el valor de la primera columna que coincida con el nombre. Por eso, si hay múltiples
columnas con el mismo nombre, se necesita usar un índice de columna para asegurarse que se
recupera el valor de la columna correcta. Esto puede ser ligeramente más eficiente que usar los
números de columna.
Información acerca de las columnas en un ResultSet es accesible mediante el método
ResultSet.getMetaData. El objeto ResultSetMetaData devuelto nos da el numero, tipo y
propiedades de las columnas de los objetos ResultSet.
Si se conoce el nombre de unacolumna,peronosuindice,puedeusarse elmétodofindColumnpara
encontrar el número de columna.
La clase PreparedStatement
La interfase PreparedStatement hereda de Statement y difiere de esta en dos maneras.
• Las instanciasde PreparedStatementcontienenunasentenciaSQLque yaha sidocompilada.Esto
es lo que hace que se le llame ‘preparada’.
• La sentenciaSQLcontenidaenunobjetoPreparedStatementpuedentenerunoomásparámetros
IN.Un parámetroIN esaquel cuyovalornose especificaenlasentenciaSQLcuandose crea. En vez
de ello la sentencia tiene un interrogante (‘?’) como un ‘encaje’ para cada parámetro IN. Debe
suministrarse un valor para cada interrogante mediante el método apropiado setXXX antes de
ejecutar la sentencia.
Como los objetos PreparedStatement están precompilados, su ejecución es más rápida que los
objetosStatement. Consecuentemente,unasentenciaSQLque se ejecute muchasvecesamenudo
se crea como PreparedStatement para incrementar su eficacia.
Siendounasubclase de Statement,PreparedStatementheredatodalafuncionalidadde Statement.
Además , se añade un set completo de métodos necesarios para fijar los valores que van a ser
enviadosalabase de datosenellugarde los‘encajes’paralosparámetrosIN.Tambiénsemodifican
lostres métodosexecute,executeQueryyexecuteUpdatede tal formaque no toman argumentos.
Los formatos de Statement de estos métodos (los formatos que toman una sentencia SQL como
argumento) no deberían usarse nunca con objetos PreparedStatement.
Creación de objetos PreparedStatement
El siguiente ejemplo, donde con es un objeto Connection, crea un objeto PreparedStatement
conteniendo una sentencia SQL con dos ‘encajes’ para parámetros IN.
PreparedStatement pstmt = con.prepareStatement(
"UPDATE table4 SET m = ? WHERE x = ?");
El objetopstmtcontiene ahoralasentencia“UPDATEtable4SETm= ? WHERE x = ? “, que yaha sido
enviada a la base de datos y ha sido preparada para su ejecución.
Bibliografía
http://users.dcc.uchile.cl/~lmateu/CC60H/Trabajos/jfernand/
http://www.euskalnet.net/jaoprogramador/j2ee/JDBC/jdbc16.htm

Más contenido relacionado

La actualidad más candente (18)

Bases Datos en java
Bases Datos en javaBases Datos en java
Bases Datos en java
 
Jdbc
JdbcJdbc
Jdbc
 
Java y Base de Datos
Java y Base de DatosJava y Base de Datos
Java y Base de Datos
 
Java con base de datos
Java con base de datosJava con base de datos
Java con base de datos
 
[ES] Conectividad de java a base de datos(jdbc)
[ES] Conectividad de java a base  de datos(jdbc)[ES] Conectividad de java a base  de datos(jdbc)
[ES] Conectividad de java a base de datos(jdbc)
 
JDBC
JDBCJDBC
JDBC
 
Programacion web java
Programacion web javaProgramacion web java
Programacion web java
 
JDBC MONOGRAFIA
JDBC MONOGRAFIAJDBC MONOGRAFIA
JDBC MONOGRAFIA
 
Resumen jee
Resumen jeeResumen jee
Resumen jee
 
2. Java Servlets (J2EE) - Curso 2005-2006
2. Java Servlets (J2EE) - Curso 2005-20062. Java Servlets (J2EE) - Curso 2005-2006
2. Java Servlets (J2EE) - Curso 2005-2006
 
Curso Java Avanzado 1 IntroduccióN Al Desarrollo Web
Curso Java Avanzado   1 IntroduccióN Al Desarrollo WebCurso Java Avanzado   1 IntroduccióN Al Desarrollo Web
Curso Java Avanzado 1 IntroduccióN Al Desarrollo Web
 
Servlets exposicion
Servlets exposicionServlets exposicion
Servlets exposicion
 
JDBC
JDBCJDBC
JDBC
 
Introducción al desarrollo de aplicaciones web en Java
Introducción al desarrollo de aplicaciones web en JavaIntroducción al desarrollo de aplicaciones web en Java
Introducción al desarrollo de aplicaciones web en Java
 
T2 - JDBC
T2 - JDBCT2 - JDBC
T2 - JDBC
 
Jdbc
JdbcJdbc
Jdbc
 
Servlets y jsp
Servlets y jspServlets y jsp
Servlets y jsp
 
Curso Java Avanzado 3 Js Ps
Curso Java Avanzado   3 Js PsCurso Java Avanzado   3 Js Ps
Curso Java Avanzado 3 Js Ps
 

Similar a JDBC (20)

Notas clase java ii
Notas clase java iiNotas clase java ii
Notas clase java ii
 
Notas clase
Notas claseNotas clase
Notas clase
 
Notas clase java ii
Notas clase java iiNotas clase java ii
Notas clase java ii
 
Notas clase
Notas claseNotas clase
Notas clase
 
Jdbc
JdbcJdbc
Jdbc
 
Bases de Datos en en www.fiec.espol.edu.ec
Bases de Datos en  en www.fiec.espol.edu.ecBases de Datos en  en www.fiec.espol.edu.ec
Bases de Datos en en www.fiec.espol.edu.ec
 
Acceso a datos con JDBC.pdf
Acceso a datos con JDBC.pdfAcceso a datos con JDBC.pdf
Acceso a datos con JDBC.pdf
 
Acceso a datos con JAVA
Acceso a datos con JAVAAcceso a datos con JAVA
Acceso a datos con JAVA
 
Unidad 9. acceso a base de datos desde java
Unidad 9. acceso a base de datos desde javaUnidad 9. acceso a base de datos desde java
Unidad 9. acceso a base de datos desde java
 
Ser vlet conectar con base de datos
Ser vlet conectar con base de datosSer vlet conectar con base de datos
Ser vlet conectar con base de datos
 
Jdbc Mysql
Jdbc MysqlJdbc Mysql
Jdbc Mysql
 
Coneccion
ConeccionConeccion
Coneccion
 
Jdbc
JdbcJdbc
Jdbc
 
Trabajo de jdbc
Trabajo de jdbcTrabajo de jdbc
Trabajo de jdbc
 
Trabajo de jdbc
Trabajo de jdbcTrabajo de jdbc
Trabajo de jdbc
 
Uso java jdbc
Uso java jdbcUso java jdbc
Uso java jdbc
 
Uso java jdbc
Uso java jdbcUso java jdbc
Uso java jdbc
 
Jyoc java-cap16 persistencia. bases de datos
Jyoc java-cap16 persistencia. bases de datosJyoc java-cap16 persistencia. bases de datos
Jyoc java-cap16 persistencia. bases de datos
 
Java con base de datos
Java con base de datosJava con base de datos
Java con base de datos
 
Jdbc
JdbcJdbc
Jdbc
 

Más de Benjamín Joaquín Martínez

Más de Benjamín Joaquín Martínez (20)

Sistemas de detección de intrusiones.pdf
Sistemas de detección de intrusiones.pdfSistemas de detección de intrusiones.pdf
Sistemas de detección de intrusiones.pdf
 
Portafolio ingles.pdf
Portafolio ingles.pdfPortafolio ingles.pdf
Portafolio ingles.pdf
 
Tabla de llamadas para linux x86_64 bits.pdf
Tabla de llamadas para linux x86_64 bits.pdfTabla de llamadas para linux x86_64 bits.pdf
Tabla de llamadas para linux x86_64 bits.pdf
 
Sistema de registro con php
Sistema de registro con phpSistema de registro con php
Sistema de registro con php
 
compiladores6Benjamin133467.pdf
compiladores6Benjamin133467.pdfcompiladores6Benjamin133467.pdf
compiladores6Benjamin133467.pdf
 
Compiladores5_Benjamin133467.pdf
Compiladores5_Benjamin133467.pdfCompiladores5_Benjamin133467.pdf
Compiladores5_Benjamin133467.pdf
 
133467 compiladores 4.pdf
133467 compiladores 4.pdf133467 compiladores 4.pdf
133467 compiladores 4.pdf
 
133467_COMPILADORES3.pdf
133467_COMPILADORES3.pdf133467_COMPILADORES3.pdf
133467_COMPILADORES3.pdf
 
133467_COMPILADORES2
133467_COMPILADORES2133467_COMPILADORES2
133467_COMPILADORES2
 
COMPILADORES1.pdf
COMPILADORES1.pdfCOMPILADORES1.pdf
COMPILADORES1.pdf
 
Algoritmos de búsqueda.pdf
Algoritmos de búsqueda.pdfAlgoritmos de búsqueda.pdf
Algoritmos de búsqueda.pdf
 
Logica proposicional
Logica proposicionalLogica proposicional
Logica proposicional
 
Lenguajes para dispositivos moviles 133467
Lenguajes para dispositivos moviles 133467Lenguajes para dispositivos moviles 133467
Lenguajes para dispositivos moviles 133467
 
Bd distribuidas
Bd distribuidasBd distribuidas
Bd distribuidas
 
diseño de bases de datos distribuidas
diseño de bases de datos distribuidas   diseño de bases de datos distribuidas
diseño de bases de datos distribuidas
 
procesamiento de consultas distribuidas
procesamiento de consultas distribuidasprocesamiento de consultas distribuidas
procesamiento de consultas distribuidas
 
Algoritmo de INGRES
Algoritmo de INGRES Algoritmo de INGRES
Algoritmo de INGRES
 
Fragmentación
FragmentaciónFragmentación
Fragmentación
 
Modelo cliente servidor
Modelo cliente servidorModelo cliente servidor
Modelo cliente servidor
 
Arquitectura de bases de datos distribuidas
Arquitectura de bases de datos distribuidasArquitectura de bases de datos distribuidas
Arquitectura de bases de datos distribuidas
 

Último

BREEAM ES Urbanismo como herramienta para un planeamiento sostenible - Miguel...
BREEAM ES Urbanismo como herramienta para un planeamiento sostenible - Miguel...BREEAM ES Urbanismo como herramienta para un planeamiento sostenible - Miguel...
BREEAM ES Urbanismo como herramienta para un planeamiento sostenible - Miguel...ITeC Instituto Tecnología Construcción
 
Manual de Usuario APPs_AppInventor-2023.pdf
Manual de Usuario APPs_AppInventor-2023.pdfManual de Usuario APPs_AppInventor-2023.pdf
Manual de Usuario APPs_AppInventor-2023.pdfmasogeis
 
Introducción a Funciones LENGUAJE DART FLUTTER
Introducción a Funciones LENGUAJE DART FLUTTERIntroducción a Funciones LENGUAJE DART FLUTTER
Introducción a Funciones LENGUAJE DART FLUTTEREMMAFLORESCARMONA
 
Caso de éxito de Hervian con el ERP Sage 200
Caso de éxito de Hervian con el ERP Sage 200Caso de éxito de Hervian con el ERP Sage 200
Caso de éxito de Hervian con el ERP Sage 200Opentix
 
Unidad_3_T1_AutomatasFinitos presentacion
Unidad_3_T1_AutomatasFinitos presentacionUnidad_3_T1_AutomatasFinitos presentacion
Unidad_3_T1_AutomatasFinitos presentacionarmando_cardenas
 
PARTES DEL TECLADO Y SUS FUNCIONES - EJEMPLO
PARTES DEL TECLADO Y SUS FUNCIONES - EJEMPLOPARTES DEL TECLADO Y SUS FUNCIONES - EJEMPLO
PARTES DEL TECLADO Y SUS FUNCIONES - EJEMPLOSelenaCoronadoHuaman
 
Segmentacion Segmantica_Modelos UNET and DEEPLABV3
Segmentacion Segmantica_Modelos UNET and DEEPLABV3Segmentacion Segmantica_Modelos UNET and DEEPLABV3
Segmentacion Segmantica_Modelos UNET and DEEPLABV3AlexysCaytanoMelndez1
 

Último (7)

BREEAM ES Urbanismo como herramienta para un planeamiento sostenible - Miguel...
BREEAM ES Urbanismo como herramienta para un planeamiento sostenible - Miguel...BREEAM ES Urbanismo como herramienta para un planeamiento sostenible - Miguel...
BREEAM ES Urbanismo como herramienta para un planeamiento sostenible - Miguel...
 
Manual de Usuario APPs_AppInventor-2023.pdf
Manual de Usuario APPs_AppInventor-2023.pdfManual de Usuario APPs_AppInventor-2023.pdf
Manual de Usuario APPs_AppInventor-2023.pdf
 
Introducción a Funciones LENGUAJE DART FLUTTER
Introducción a Funciones LENGUAJE DART FLUTTERIntroducción a Funciones LENGUAJE DART FLUTTER
Introducción a Funciones LENGUAJE DART FLUTTER
 
Caso de éxito de Hervian con el ERP Sage 200
Caso de éxito de Hervian con el ERP Sage 200Caso de éxito de Hervian con el ERP Sage 200
Caso de éxito de Hervian con el ERP Sage 200
 
Unidad_3_T1_AutomatasFinitos presentacion
Unidad_3_T1_AutomatasFinitos presentacionUnidad_3_T1_AutomatasFinitos presentacion
Unidad_3_T1_AutomatasFinitos presentacion
 
PARTES DEL TECLADO Y SUS FUNCIONES - EJEMPLO
PARTES DEL TECLADO Y SUS FUNCIONES - EJEMPLOPARTES DEL TECLADO Y SUS FUNCIONES - EJEMPLO
PARTES DEL TECLADO Y SUS FUNCIONES - EJEMPLO
 
Segmentacion Segmantica_Modelos UNET and DEEPLABV3
Segmentacion Segmantica_Modelos UNET and DEEPLABV3Segmentacion Segmantica_Modelos UNET and DEEPLABV3
Segmentacion Segmantica_Modelos UNET and DEEPLABV3
 

JDBC

  • 1. Tópicos avanzados de programación SCD1027 Aula I13 Alumno: Joaquín Martínez Benjamín Joaquín Martínez Trabajo: Investigación JDBC
  • 2. Una integraciónde SQL haciaJava, esdecirque lassentenciasSQLse puedanmezclarcon Java,por ejemplo, que una variable de Java pueda ser usada en una sentencia SQL para recibir o dar valores.Unmapeodirectode las tablas de la BD hacia las clasesde Java, donde cala filade la tabla se convierte en una instancia de la clase, y donde cada columna se corresponde a un atrubuto de esa instancia. ODBC es muy difícil de aprender, hace una mezcla de acciones simples y avanzadas. Una API como JDBC es necesario para poder desarrollar una solución “puramente de Java” La clase DriverManager La clase DriverManagerimplementalacapade gestiónde JDBC,ytrabaja comointermediariaentre el usuario y los drivers.Guarda la listade losdriversque estándisponiblesyestablece laconexión entre labase de datosyel driverapropiado.AdemáslaclaseDriverManagerse ocupadecosascómo gestionarloslímitesde tiempode ‘login’enel driver y de la salida de los mensajes de traza y log. Para aplicacionessimples,el únicométodoenestaclase que necesitaunprogramadorgeneral para su uso directamente es DriverManager.getConnection. Como su nombre indica, este método establece una conexión con la base de datos. JDBC permite al usuario llamar a los métodos de DriverManager getDriver, getDrivers y registerDriver así como al método de Driver connect, pero
  • 3. en la mayoría de los casos es preferible dejar que la clase DriverManager gestione los detalles al establecer la conexión. Mantenimiento de la lista de drivers disponibles. La clase DriverManagermantiene unalistade clasesdisponiblesque hansidoregistradosmediante el método DriverManager.registerDriver. Todas las clases Driver deben escribirse con una sección estática que cree una instancia de la clase y luego la registre en la clase DriverManager cuando se cargue. Además el usuario normalmente no debería llamar a DriverManager.registerDriver directamente; debería llamarse automáticamente por el driver cuando esté se carga,. Una clase Driver se carga, y por tanto se registra, de dos formas diferentes: 1 Mediante una llamada al método Class.forName. Este carga explícitamente la clase driver. Dado que no depende de ningún ‘setup’ externo, esta forma de cargar drivers es la recomendada. El siguiente código carga la clase acme.db.Driver: Class.forName("acme.db.Driver"); Si acme.db.Driver se ha escrito para que al cargar produzca una instancia y llame al método DriverManager.registerDriver con esta instancia como argumento (es lo que debería hacer), entonces este estará en la lista de drivers disponibles para efectuar la conexión. 2 Mediante laadicióndel driveralapropiedadjdbc.driversde java.lang.System-Estaesunalistade nombresde clasesde drivers,separadaspordospuntos,que eslaquecargalaclase DriverManager. Cuando la clase DriverManager se inicializa, mira en la propiedad jdbc.drivers, y si el usuario ha introducidounoo más drivers,la clase DriverManagerintentacargarlos.El siguiente códigoilutsra como un programador debería introducir estas tres clases en ~/.hotjava/properties jdbc.drivers=foo.bah.Driver:wombat.sql.Driver:bad.test.ourDriver; La primerallamadaal métodoDriverManagerharáque estosdriversse carguenautomáticamente. Nótese que enestasegundamanerade cargarlosdriversesnecesariounapreparacióndelentorno que es persistente. Si existe alguna duda sobre esto es preferible y más seguro llamar al método Class.forName para cargar explicitamente cada driver. Este es también el método que se usa para traer un driver particular puesto que una vez que la clase DriverManager ha sido inicializada no chequeará la lista de propiedades jdbc.drivers. Enamboscasos,esresponsabilidaddelaclase Driverreciéncargadaregistrarseasi mismamediante una llamadaa DriverManager.registerDriver.Comose hamencionadoanteriormente,estodebería hacerse automáticamente al cargar la clase. Por razones de seguridad, la capa de gestión de JDBC guardará traza de que clases de cargadores provee cada driver. Entonces cuando la clase DriverManager abre una conexión solo usará los driversque vienendesde el sistemade ficheroslocal odesde lasmismasclasescargadorascomoel código que solicita la conexión.
  • 4. Establecer una conexión Una vez que la clase Driver ha sido cargada y registrada con la clase DriverManager, se está en condiciones de establecer la conexión con la base de datos. La solicitud de la conexión se realiza mediante unallamadaal métodoDriverManager.getConnection,yDriverManagertestealosdrivers regsitrados para ver si puede establecer la conexión. A veces puede darse el caso de que más de un driver JDBC pueda establecer la conexiónpara una URL dada.Por ejemplo,cuandoconectamosconunabase de datosremota,podría ser posible usar un driver puente JDBC-ODBC, o un driver JDBC de protocolo genérico de red, o un driver suministrado por el vendedor. En talescasos,el ordenenque losdriversontesteadosessignificanteporque DriverManagerusará el primer driver que encuentre que pueda conectar con éxito a la base de datos. PrimeroDriverManagerintentausarcada driverenel ordenenque ha sidoregistrado( los drivers listados en la propiedad jdbc.drivers son siempre losregistrados primero). Saltará cualquier driver con código ‘untrusted’, a menos que se cargue desde el mismo código fuente que el código que intenta abrir la conexión. Testea los drivers mediante la llamada al método Driver.connect cada uno por turno, pasándole como argumento la URL que el usuario ha pasado originalmente al método DriverManager.getConnection. El primer driver que reconozca la URL realiza la conexión. Una primera ojeda puede parecer insuficiente, pero son necesarias solo unas pocas llamadas a procedimientos y comparaciones de cadena por conexión puesto que no es probable que haya docenas de drivers se carguen concurrentemente. El siguiente códigoesunejemplode todolonecesarionormalmente paraestablecerunaconexión con un driver puente JDBC-ODBC: Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //loads the driver String url = "jdbc:odbc:fred"; DriverManager.getConnection(url, "userID", "passwd"); La clase Statement Un objeto Statement se usa para enviar sentencias SQL a la base de datos. Actualmente hay tres tipos de objetos Statement, todos los cuales actúan como contenedores para la ejecución de
  • 5. sentencias en una conexión dada: Statement, PreparedStatement que hereda de Statement y CallableStatementque heredade PreparedStatement.Estasestànespecializadasparaenviartipos particularesde sentenciasSQL,UnobjetoStatementse usaparaejecutarunasentenciaSQLsimple sin parámetros. Un objeto PreparedStatement se usa para ejecutar sentencias SQL precompiladas con o sin parámetros IN; y un objeto CallableStatement se usa para ejecutar un procedimienode base de datos almacenado. La interface Statementsuminstramétodosbásicospara ejecutarsentenciasydevolverresultados. La interfase PreparedStatementañade métodosparatrabajat con losparámetros IN;y la interfase CallableStatement añade métodos para trabajar con parameters OUT. Creación de objetos Statement Una vez establecidalaconexiónconunabase de datosparticular,estaconexiónpuede usarse para enviar sentencias SQL. Un objeto Statement se crea mediante el método de Connection createStatement, como podemos ver en el siguiente fragmento de código. Connection con = DriverManager.getConnection(url, "sunny", ""); Statement stmt = con.createStatement(); La sentenciaSQL que será enviadaa la base de datos es alimentadacomoun argumentoa unode los métodos de ejecución del objeto Statement. Por ejemplo: ResultSet rs = stmt.executeQuery("SELECT a, b, c FROMTable2"); Ejecución de sentencias usando objetos Statement. La interfase Statement nos suministra tres métodos diferentes para ejecutar sentencias SQL, executeQuery,executeUpdate yexecute.El métodoausar esta determinadoporel productode la sentencia SQL El método executeQuery esta diseñado para sentencias que producen como resultado un único result set tal como las sentencias SELECT. El método executeUpdate se usa para ejecutar sentencias INSERT, UPDATE ó DELETE así como sentenciasSQLDDL(DataDefinitionLanguage) comoCREATETABLEoDROPTABLE.El efectode una sentenciaINSERT,UPDATEoDELETE esunamodificaciónde unaomáscolumnasenceroomásfilas de una tabla. El valor devuelto de executeUpdate es un entero que indica el número de filasque hansidoafectadas(referidocomoupdatecount).ParasentenciastalescomoCREATETABLEoDROP TABLE, que no operan sobre filas, le valor devuelto por executeUpdate es siempre cero.
  • 6. El métodoexecutese usaparaejecutarsentenciasque devuelvenmásde unresultset,más que un update counto una combinaciónde ambos.Comoesesta unacaracterística avanzada que muchos programadores no necesitarñan nunca se verá en su propia sección. Todos los métodos que ejecutan sentencias cierran los objetosResultset abiertoscomo resultado de lasllamadasa Statement.Estoquiere decirque es necesariocompletarel procesoconel actual objeto Resulset antes de reejecutar una sentencia Statement. Debe notarse que la interfase PreparedStatement, que hereda los métodos de la interfase Statement,tienesuspropiasversionesdelosmétodosexecuteQuery,executeUpdateyexecute.Los objetos Statement en si mismos no contienen una sentencia SQL, por tanto debe suministrarse como un argumento a los métodos Statement.execute. Los objetos PreparedStatement no suministranunasentenciaSQLcomoargumentoaestosmétodospuestoque yatienenlasentencia precompilada. Los objetos CallableStatement heredan las formas de estos métodos de PreparedStatement. Usar un parametro de query con las versiones de los métodos de PreparedStatement o CallableStatement producirái una SQLException,. Realización de Statement Cuando una conexión está en modo auto-commit, las sentencias ejecutadas son ‘comitadas’ o rechazadascuando se completan.Un sentenciase consideracompletacuandoha sidoejecutaday se han devueltotodoslosresultados.Pare el métodoexecuteQuery,que devuelve unúnicoresult set, la sentencia se completa cuando todas las filas del objeto ResultSet se han devuelto. Para el métodoexecuteUpdate,unsentenciase completacuandose ejecuta.En los raros casos en que se llama al método execute, de cualquier modo, no se completa hasta que los result sets o update counts que se generan han sido devueltos. AlgunosDBMStratancada sentenciaenun procedimientoalmacenadocomosentenciasseparadas. Otros tratan el procedimientoenterocomouna sentenciacompuesta.Estadiferenciase convierte en importante cuandoestáactivo el modo auto-commitporque afectacuandose llamaal método commit. En el primer caso, cada sentencia individual es commitada. En el segundo, se commiten todas juntas. Cerrar objetos Statement. Los objetos Statement se cerrarán automáticamente por el colector de basura de Java (garbage collector). No obstante se recomienda como una buena práctica de programación que se cierren explicitamente cuandonosean ya necesarios.EstoliberarecursosDBMS inmediatamente yayuda a evitar potenciales problemas de memoria.
  • 7. Sintaxis de Escape SQL en objetos Statement Los objetosStatementpuedencontenersentenciasSQLque usensintaxisde escape SQL.Lasintaxis de escape señalaal driverqueel códigoquellevadebe sertratadodiferentemente.El driverbuscará porcualquiersintaxisde escapeylotraduciráencódigoque entiendelabase de datosenparticular. Esto hace que la sintaxis de escape sea independiente de la DBMS y permite al programador usar características que de otro modo no estarían disponibles. Una cláusula de escape se enmarca entre llaves y tiene una palabra clave: {keyword . . . parameters . . . } La palabra clave (keyword) indica el tipo de clausula de escape, según se muestra: • escape para caracteres LIKE Los caracteres “%” y “_” trabajan como wildcardsen la clausulaSQL LIKE (“%”significacero o más caracteresy “_” significaexactamenteuncarácter”.En ordena interpretarlosliteralmente,pueden estarprecedidosporunbackslash(‘’),que esuncarácterde escape especial encadenas.Se puede especificarun carácter que se use como carácter de escape por la inclusiónde lasintaxissiguiente al final de la consulta. {escape 'escape-character'} Por ejemplo,lasiguientequery,usandobackslashcomocaracterde escape,encuentranombresde identificador que comiencen con ‘_’. stmt.executeQuery("SELECT name FROMIdentifiers WHERE Id LIKE `_%' {escape `'}; La clase ResultSet Un ResultSet contiene todas las filas que satisfacen las condiciones de una sentencia SQL y proporcionael accesoalosdatosde estasfilasmedianteunconjuntode métodosgetque permiten el acceso a las diferentes columnas de la filas. El método ResultSet.next se usa para moverse a la siguiente fila del result set, convirtiendo a ésta en la fila actúal. El formato general de un result set es una tabla con cabeceras de columna y los valores correspondientesdevueltosporla‘query’.Porejemplo,si la‘query’esSELECTa, b,c FROMTable1, el resultado tendrá una forma semejante a : a b c -------- --------- -------- 12345 Cupertino CA
  • 8. 83472 Redmond WA 83492 Boston MA El siguientefragmentode códigoesunejemplode laejecuciónde unasentenciaSQLque devolverá una colecciónde filas,con la columna1 como un int, la columna2 como una String y la columna3 como un array de bytes: java.sql.Statement stmt = conn.createStatement(); ResultSet r = stmt.executeQuery("SELECT a, b, c FROMTable1"); while (r.next()) { // print the values for the current row. int i = r.getInt("a"); String s = r.getString("b"); float f = r.getFloat("c"); System.out.println("ROW = " + i + " " + s + " " + f); } Filas y Cursores Un ResultSet mantiene un cursor que apunta a la fila actúal de datos. El cursor se mueve una fila hacia abajocada vezque se llamaal métodonext.Incialmente se sitúaantesde laprimerafila,por loque hayque llamaral métodonextparasituarloenlaprimerafilaconviertiendolaenlafilaactúal. Las filas de ResultSet se recuperan en secuencia desde la fila más alta a la más baja. Un cursor se mantiene válidohastaque el objetoResultsetosu objeto padre Statement se cierra. En SQL, el cursor resultado para una tabla tiene nombre. Si una base de datos permite upadtes posicionados o deletes posicionados,el nombre del cursor es necesarioy debe ser proporcionado comoun parámetro del comandoupdate odelete.El nombre delcursorpuede obtenersemediante una llamada al método getCursorName. No todas las bases de datos soportan updates o deletes posicionados. Los métodos DatabaseMetaData.supportsPositionedDeleteyDatabaseMetaData.supportsPositionedUpdatenos permitendescubrirsi estasoperacionesestánsoportadasenuna conexióndada.Cuandolo están, el drivero la DBMS debenasegurarse que lasfilasseleccionadasestánapropiadamentebloquedas y por tanto que estas operaciones no provoquen actualizaciones anomalas ni otros problemasde concurrencia.
  • 9. Columnas Los métodos getXXX suministran los medios para recuperar los valores de las columnas de la fila actúal.Dentrode cadafila,losvaloresde lascolumnaspuedenrecuperarseen cualquierorden,pero para asegurarlamáximaportabilidad,deberíanextraerselascolumnasdeizquierdaaderechayleer los valores de las columnas una única vez. Puede usarse o bien el nombre de la columna o el número de columna para referirse a esta. Por ejemplo: si la columna segunda de un objeto RecordSet rs se denomina “title” y almacena valores de cadena, cualquiera de los dos ejemplos siguientes nos devolverá el valor almacenado en la columna. String s = rs.getString("title"); String s = rs.getString(2); Nótese que lascolumnasse numerandeizquierdaaderechacomenzandoconlacolumna1.Además los nombres usados como input en los métodos getXXX son insensibles a las mayúsculas. La opción de usar el nombre de columna fue provista para que el usuario que especifica nombres de columnasenuna‘query’puedausaresosnombrescomoargumentosde losmétodosgetXXX.Si, por otro lado, la sentencia select no especifica nombres de columnas (tal como en “select * from table1”oencasosdonde unacolumnaes derivada),debenusarse losnúmerosde columna.Enestas situaciones , no hay forma de que el usuario sepa con seguridad cuales son los nombres de las columnas. En algunoscasos,esposibleparaunaquerySQLdevolverunresultsetconmásde unacolumna con el mismo nombre. Si se usa el nombre de columna como argumento en un método getXXX, éste devolverá el valor de la primera columna que coincida con el nombre. Por eso, si hay múltiples columnas con el mismo nombre, se necesita usar un índice de columna para asegurarse que se recupera el valor de la columna correcta. Esto puede ser ligeramente más eficiente que usar los números de columna. Información acerca de las columnas en un ResultSet es accesible mediante el método ResultSet.getMetaData. El objeto ResultSetMetaData devuelto nos da el numero, tipo y propiedades de las columnas de los objetos ResultSet. Si se conoce el nombre de unacolumna,peronosuindice,puedeusarse elmétodofindColumnpara encontrar el número de columna. La clase PreparedStatement La interfase PreparedStatement hereda de Statement y difiere de esta en dos maneras. • Las instanciasde PreparedStatementcontienenunasentenciaSQLque yaha sidocompilada.Esto es lo que hace que se le llame ‘preparada’.
  • 10. • La sentenciaSQLcontenidaenunobjetoPreparedStatementpuedentenerunoomásparámetros IN.Un parámetroIN esaquel cuyovalornose especificaenlasentenciaSQLcuandose crea. En vez de ello la sentencia tiene un interrogante (‘?’) como un ‘encaje’ para cada parámetro IN. Debe suministrarse un valor para cada interrogante mediante el método apropiado setXXX antes de ejecutar la sentencia. Como los objetos PreparedStatement están precompilados, su ejecución es más rápida que los objetosStatement. Consecuentemente,unasentenciaSQLque se ejecute muchasvecesamenudo se crea como PreparedStatement para incrementar su eficacia. Siendounasubclase de Statement,PreparedStatementheredatodalafuncionalidadde Statement. Además , se añade un set completo de métodos necesarios para fijar los valores que van a ser enviadosalabase de datosenellugarde los‘encajes’paralosparámetrosIN.Tambiénsemodifican lostres métodosexecute,executeQueryyexecuteUpdatede tal formaque no toman argumentos. Los formatos de Statement de estos métodos (los formatos que toman una sentencia SQL como argumento) no deberían usarse nunca con objetos PreparedStatement. Creación de objetos PreparedStatement El siguiente ejemplo, donde con es un objeto Connection, crea un objeto PreparedStatement conteniendo una sentencia SQL con dos ‘encajes’ para parámetros IN. PreparedStatement pstmt = con.prepareStatement( "UPDATE table4 SET m = ? WHERE x = ?"); El objetopstmtcontiene ahoralasentencia“UPDATEtable4SETm= ? WHERE x = ? “, que yaha sido enviada a la base de datos y ha sido preparada para su ejecución. Bibliografía http://users.dcc.uchile.cl/~lmateu/CC60H/Trabajos/jfernand/ http://www.euskalnet.net/jaoprogramador/j2ee/JDBC/jdbc16.htm