3. curso java jdbc (bases de datos) - curso 2005-2006
DESCRIPTION
Resumen de Tutorial o Curso de Java JDBC impartido durante el curso 2005-2006, sobre los principios de este lenguaje orientado a objetos y las bases de datos.TRANSCRIPT
![Page 1: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/1.jpg)
Samuel Marrero Lorenzo [email protected] 1
Acceso a base de datos con Java desde aplicaciones web con la tecnología JDBC
![Page 2: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/2.jpg)
2
Bases de Datos en aplicaciones
� Aplicación que procese información �base de datos.
� Normalmente se utilizan bases de datos relacionales.
� SQL: Lenguaje estándar para acceder a una base datos.
![Page 3: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/3.jpg)
3
Acceder a una base de datos desde una aplicación
� Cómo puede enviar una aplicación sentencias SQL a una BD.
� Interfaz procedural para ejecutar sentencias SQL.
� X/Open CLI (ISO 9075-3 “Call level interface”).
� ODBC es variante de Microsoft del X/OpenCLI (implementada en lenguaje C).
� La filosofía de estas APIs es que permitan acceder de la misma forma a distintas BD.
![Page 4: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/4.jpg)
4
JDBC
� Es un interfaz orientado a objetos de Java para SQL.
� Se utiliza para enviar sentencias SQL a un sistema gestor de BD (DBMS).
� Con JDBC tenemos que continuar escribiendo las sentencias SQL.
� No añade ni quita potencia al SQL.
![Page 5: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/5.jpg)
5
Arquitectura JDBC� La filosofía de JDBC es proporcionar transparencia al desarrollador frente al gestor de BD.
� JDBC utiliza un Gestor de Controladores o DriverManager que hace de interfaz con el controlador específico de la BD.
SGBD
Oracle
SGBD
MySQL
Driver Manager de JDBC
Controlador
Oracle
BD
Controlador
JDBC-ODBC
Controlador
MySQL
Aplicación Java
BDBD Access
![Page 6: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/6.jpg)
6
Clases e interfaces JDBC
� La especificación JDBC incluye 8 interfaces y 10 clases, en el paquete estándar java.sql.
� Podemos dividirlos en los siguientes grupos:� Nucleo de JDBC, interfaces y clases que todos los controladores deben implementar.
� Extensiones al paquete java.lang, extensiones para SQL.
� Extensiones al paquete java.util, son extensiones a java.util.Date.
� Metadatos para SQL, permiten examinar dinámicamente las propiedades de BD y controladores.
![Page 7: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/7.jpg)
7
Núcleo de JDBC� Estos interfaces se utilizarán el 90% de las veces que
trabajemos con una BD.
Driver
<<Interface>>
Connection
<<Interface>>
Statement
<<Interface>>
ResultSet
<<Interface>>
DriverManager
DriverPropertyInfoCallableStatement
<<Interface>>
PreparedStatement
<<Interface>>
ResultSetMetaData
<<Interface>>
![Page 8: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/8.jpg)
8
Invocar una consulta SQL
� Vamos a estudiar un escenario en el que realizaremos una consulta sobre una BD con JDBC.
� Mediante el seguimiento de un diagrama de secuencia veremos las clases en funcionamiento.
� Cliente, representa a la aplicación Java donde implementamos la consulta.
� Un buen ejercicio sería ir escribiendo el programa a la vez que vamos viendo cada una de las fases.
![Page 9: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/9.jpg)
9
Configuración de la conexión
con base de datos
� Antes de conectar con la base de datos y trabajar con ella debemos tener en cuenta dos cuestiones:
� Registrar un controlador.
� Convenciones de nombres para la base de datos.
![Page 10: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/10.jpg)
10
Registrar un controlador (1)
� Determinados controladores requerirán la instalación y configuración de software específico en el cliente. Ejemplo: el origen ODBC o la fuente de datos nativa.
� Otros controladores son simplemente una clase Java y bastará que la máquina virtual de Java las pueda localizar mediante el classpath.
![Page 11: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/11.jpg)
11
Registrar un controlador (2)
� Para que la JVM pueda localizar una clase de driver JDBC de Oracle, por ejemplo,� Situar la ruta a la clase en el CLASSPATH, o
� Añadir un JAR externo en el proyecto de Eclipse donde está nuestra aplicación
� En el menú contextual del proyecto Eclipse �Propiedades � Java Build Path � Add External JARs
� En el caso de Oracle añadir el fichero classes12.jar
� Más adelante se explicará cómo configurar esto para crear una asociación o pool de conexiones
![Page 12: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/12.jpg)
12
Registrar el controlador (3)
� Averiguar el nombre de la clase provista porel paquete a ser usado.
� Localizar la clase en el directorio apropiadopara que pueda ser cargado.
� Alternativamente se puede cargar la clase en el programa usando el comando:� Class.forName(“sun.jdbcJdbcOdbcDriver”);
� DriverManager.registerDriver(neworacle.jdbc.driver.OracleDriver() ).
![Page 13: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/13.jpg)
13
Código fuente de carga/registro del controlador de la BD
try
{
//Ejemplo para Oracle
DriverManager.registerDriver(neworacle.jdbc.driver.Oracledriver());
//Ejemplo para MySQLClass.forName("com.mysql.jdbc.Driver").newInstance();
}
catch (ClassNotFoundException e)
{
System.out.println("Error en la carga del driver JDBC");
return;
}
![Page 14: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/14.jpg)
14
:
DriverManager
Cliente
getConnection( )
:
Connection
Conexión a la BD
Obtener conexión BD
![Page 15: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/15.jpg)
15
Abrir una conexión
� La clase DriverManager es la responsable de:� seleccionar el driver� crear una nueva conexión a la base de datos
� Previamente habremos registrado el controlador en el DriverManager.
� Crear una conexión:� Connection con =
DriverManager.getConnection(url,user,pass)� El parámetro imprescindible es la url de la base de datos; para
especificar la base de datos que queremos utilizar.� También se puede especificar el usuario y la clave con los que
nos queremos conectar a la base de datos.� El DriverManager buscará un driver, entre los registrados, que
pueda usar el protocolo especificado en la url
![Page 16: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/16.jpg)
16
Nombres para las BD en JDBC
� En JDBC las bases de datos se designan mediante una URL.
� La forma de la url es la siguiente:jdbc:<subprotocolo>:<dominio>
� Subprotocolo: identifica el mecanismo de conexión o el controlador JDBC concreto.
� Dominio: Depende del subprotocolo, puede ser simplemente un nombre simple para la base de datos o una serie de parámetros que permiten encontrar la BD.
![Page 17: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/17.jpg)
17
Código fuente de conexióntry
{
//Oracle
Connection con=
DriverManager.getConnection("jdbc:oracle:thin:[email protected]:1521:DESA",
"","");
//MySQL
Connection con=
DriverManager.getConnection("jdbc:odbc:agenda",
"","");
}
catch (SQLException e)
{
System.out.println(e);
}
url de la BD
Usuario, password
![Page 18: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/18.jpg)
18
El objeto Connection
� Si no se producen excepciones el método getConnection nos devuelve un objeto que implementa la interfaz Connection.
� Podemos crear varias conexiones con distintas bases de datos o incluso con la misma.
� Cada conexión representa una sesión con la BD.
� El objeto Connection nos permitirá acceder a la base de datos para realizar operaciones sobre ella y obtener resultados.
![Page 19: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/19.jpg)
19
:
DriverManager
Cliente
getConnection( )
:
Connection
createStatement( )
: Statement
Obtener el objeto
Statement
Crear sentencia de BD
![Page 20: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/20.jpg)
20
Acceso a los datos
� Utilizamos la conexión con la base de datos creada anteriormente para enviar comandos y sentencias SQL.
� El objeto conexión funciona como un enlace directo con el controlador de la BD.
� Creamos un objeto de la clase Statement que servirá de envoltorio para las sentencias SQL.
� Cuando pasamos la SQL a la conexión este lo envía al controlador que a su vez lo redirecciona a la BD, que nos devolverá los resultados.
![Page 21: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/21.jpg)
21
Objetos involucrados en el acceso a datos (diagrama de colaboración)
Programa
Java
Objeto Driver
JDBC BD
Base de
datos
Objeto
ConnectionObjeto
Statement
SQL
Resultados
Objeto
ResultSet
![Page 22: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/22.jpg)
22
Código fuente de creación de una sentencia de consulta
try
{
// Creamos el objeto sentencia
Statement stmt= con.createStatement();
[...]
}
catch (Exception e)
{
System.out.prinln(e);
}
![Page 23: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/23.jpg)
23
Creación del objeto Statement
� La clase Connection tiene varios métodos que permiten crear un objeto Statement o una de sus variantes.
� createStatement, para crear sentencias simples.
� prepareStatement, para sentencias que pueden contener parámetros, optimiza la utilización repetida de estas sentencias.
� prepareCall.
![Page 24: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/24.jpg)
24
:
DriverManager
Cliente
getConnection( )
:
Connection
createStatement( )
: Statement
executeQuery( )
: ResultSet
Ejecutar la consulta
Ejecutar consulta
![Page 25: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/25.jpg)
25
Ejecución de la sentencia
� executeQuery(), ejecución de consultas, sentencia SELECT.
� executeUpdate(), actualizaciones de valores en al base de datos. INSERT, UPDATE, DELETE. Sólo devuelve la cuenta de las columnas afectadas.
� execute(), se usa para ejecutar sentencias que no se conocen a priori o que devuelven resultados no homogéneos.
![Page 26: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/26.jpg)
26
Código fuente de ejecución de una sentencia
try
{
[...]
// Ejecutamos una sentencia SQL
ResultSet rs=
stmt.executeQuery("SELECT id, nombre," +
" , email, telefono" +
" FROM Contactos" +
" WHERE nombre LIKE '%pepe%'");
}
catch (SQLException e)
...
![Page 27: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/27.jpg)
27
:
DriverManager
Cliente
getConnection( )
:
Connection
createStatement( )
: Statement
executeQuery( )
: ResultSet
next( )
getInt( )
getString( )
getBigDecimal( )
Posicionar el cursor
en la siguiente fila
Recuperar valores
de las columnas.Repetir mientras
haya filas que
procesar. Recuperación valores resultado
![Page 28: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/28.jpg)
28
Recuperación de datos� Cuando ejecutamos una consulta debemos emplear el método executeQuery(), que devuelve un objeto ResultSet, que nos permitirá acceder a los resultados.
� El ResultSet utiliza el concepto de cursor de base de datos para ir moviéndose por las filas de datos recuperadas.
� Las columnas pueden accederse en cualquier orden, utilizando su posición o su nombre.
� El objeto ResultSet incluye métodos getXXXque permiten recuperar valores de distintos tipos.
![Page 29: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/29.jpg)
29
Código fuente de recuperación de datos
...
while (rs.next())
{
// Se recupera cada columna por separado
String id= rs.getString(“id");
String nombre= rs.getDate(“nombre");
String email= rs.getInt(“email");
String telefono= rs.getDouble(“telefono");
// Operación que realizamos con cada fila
System.out.println(“Nombre: " + nombre + ", telefono:
" + telefono);
}
![Page 30: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/30.jpg)
30
:
DriverManager
Cliente
getConnection( )
:
Connection
createStatement( )
: Statement
executeQuery( )
: ResultSet
next( )
getInt( )
getString( )
getBigDecimal( )
close( )
close( )
Liberar el objeto
Connection
Liberar el objeto
Statement Librerarobjetos
![Page 31: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/31.jpg)
31
Código fuente de liberación de recursos de BD
try
{
[...]
// Liberamos objeto sentencia
stmt.close();
// Liberamos objeto conexión BD
con.close();
}
catch (SQLException e)
...
![Page 32: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/32.jpg)
32
Resumen proceso consulta simple
� Registrar controlador � Class.forName.
� Abrir conexión �DriverManager.getConnection.
� Crea sentencia � con.createStatement.
� Ejecuta la sentencia � stmt.executeQuery.
� Procesar resultados � while(rs.next()) ...
� Cerrar sentencia y conexión � close.
![Page 33: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/33.jpg)
33
Primer ejemplo de manejo de conexión JDBC
� El siguiente código muestra el acceso a una base de datos y ejecución de consultas de selección y acción a una base de datos utilizando un driver JDBC
� Código: c:\java\JDBC1\Bd.java� La recuperación de datos se realiza a la tabla ‘contactos’ de la base de datos ‘agenda’conociendo previamente la estructura de la tabla� Tabla ‘contactos’: id, nombre, ciud_id, email, telefono
![Page 34: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/34.jpg)
34
Profundizando en la utilización de JDBC
� Manejo de las excepciones de SQL
� Utilización de diferentes BD.
� Ejecución de distintas sentencias SQL.
� Sentencias preparadas.
� Conjuntos de resultados.
� Desplazamiento y actualización por programa.
� Metadatos.
![Page 35: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/35.jpg)
35
Manejo de las excepciones de SQL
� SQLException
� Es la principal forma que tiene JDBC de informar de errores, normalmente relacionadas con el acceso y recuperación de datos.
� Hereda de la clase Exception de java.lang.
� Proporciona la siguiente información sobre el error:
� Una cadena describiendo el error a la que se puede acceder con el método getMessage().
� La cadena de error SQLstate de acuerdo con el estándar X/Open a la que se puede acceder con el método getSQLState().
� Un código de error entero específico de la BD que se puede acceder con getErrorCode().
� Permite acceder a más errores con getNextException().
![Page 36: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/36.jpg)
36
Manejo de los avisos de SQL
� SQLWarning
� Permite informar de errores leves en distintos objetos de la BD: ResultSet, Statement, Connection.
� Al contrario que SQLException no es obligatorio capturar los SQLWarning.
� Para obtener un SQLWarning se llama al método getWarning() sobre el objeto.
� Para obtener SQLWarning adicionales se llama a getNextWarning().
� DataTruncation
� Informa de avisos de truncado de datos en las lecturas y al escribir datos.
![Page 37: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/37.jpg)
37
Extensiones JDBC al paquete java.lang
� Amplían envoltorio Number para permitir albergar grandes números.
� Crean clases Exception especializadas.
Number Exception
BigDecimal SQLException
SQLWarning
DataTruncation
![Page 38: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/38.jpg)
38
Utilización de diferentes BD
� JDBC permite utilizar distintas bases de datos sin cambiar el código o haciendo retoques mínimos (normalmente parámetros de conexión y, a veces, en las sentencias SQL)
� Cambios que implica la utilización de una BD diferente: � controlador,
� url de la BD.
� Otros posibles cambios.
![Page 39: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/39.jpg)
39
Tipos de controladores
� JDBC es una especificación que establece dos tipos de interfaces:� Interfaz de aplicación, que permite acceder a una base de datos independientemente de su fabricante.
� Interfaz del controlador, al cual se deben adaptar los desarrolladores de controladores.
� Actualmente en el mercado existen gran cantidad de controladores que varían en su arquitectura. Sun ha clasificado estos controladores en cuatro tipos.� http://industry.java.sun.com/products/jdbc/drivers
![Page 40: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/40.jpg)
40
Controlador Tipo 1
� Puente JDBC-ODBC
� Requieren que la máquina en la que corre la aplicación tenga instalada la librería de la API nativa (.dll)
Cliente
Servidor
Cliente
BD JavaJDBCODBC
Serv.
ODBCBD
Protocolo ODBC
Serv.
ODBCBDProtocolo ODBC
![Page 41: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/41.jpg)
41
Controlador Tipo 2
� Controlador utilizando APIs nativas
� Requieren que la máquina en la que corre la aplicación tenga instalada la librería de la API nativa (.dll)
Cliente
Servidor
Cliente
BD JavaJDBC
API
nativa
Serv.
nativoBD
Protocolo nativo
![Page 42: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/42.jpg)
42
Controlador Tipo 3
� Controlador JDBC-NET Java puro
� Permite que la aplicación se conecte a varias bases de datos
Cliente
Servidor
Cliente
BD JavaJDBC
Serv.
nativoBD
BD
Serv.
JDBC
Serv.
nativo
Serv.
JDBC
Protocolo estándar
Protocolo estándar
![Page 43: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/43.jpg)
43
Controlador Tipo 4
� Controlador Java puro y protocolo nativo
� En general el tipo más eficiente es el de tipo 2
Cliente
Servidor
Cliente
BD JavaJDBC
Serv.
nativoBD
Protocolo nativo
![Page 44: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/44.jpg)
44
Ejecución de distintas sentencias SQL
� Tipos de sentencias SQL:� Sentencias de definición de datos (DDL): CREATE TABLE, CREATE INDEX.
� Sentencias de manipulación de datos (DML): INSERT, UPDATE, DELETE.
� Sentencias de consulta: SELECT.
� Cada tipo devuelve resultados distintos y empleamos distintos métodos stmt.execute().
![Page 45: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/45.jpg)
45
Sentencias preparadas
� Optimiza rendimiento en las sentencias que se ejecutan repetidamente, por ejemplo la inserción de varios contactos de clientes en la agenda en un bucle
� Características:� Sentencias en las que no se ponen explícitamente determinados valores.
� Las sentencias escritas en el código por el programador son más propensas a errores, éstas mejoran ese aspecto ya que
� En éstas el formateo de los datos lo hace el driver
� La base de datos sólo tiene que interpretar la sentencia la primera vez.
� Optimizan la ejecución.
![Page 46: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/46.jpg)
46
Código fuente de sentencias preparadasPreparedStatement pstmt= con.prepareStatement(
"INSERT INTO Contactos VALUES (CUJA.nextval,?,?,?)");
// Establece valores para cada uno de los parametros
pstmt.setString(1,“Pedro Rodríguez"); // Nombre
pstmt.setString(2,“[email protected]");//email
pstmt.setString(3,”928543424”); // Telefono
int insCount= pstmt.executeUpdate();
// Establece valores para cada uno de los parametros
pstmt.setString(1,“Nicolás Pérez"); // Nombre
pstmt.setString(2,“[email protected]"); // Email
pstmt.setString(3,“928246538"); // Teléfono
int insCount= pstmt.executeUpdate();
![Page 47: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/47.jpg)
47
Ejemplo de código usando sentencias preparadas
� El siguiente ejemplo es el código fuente de una clase Java que utiliza JDBC con sentencias preparadas para acceder a la tabla ‘contactos’ de la base de datos ‘agenda’
� Código: c:\java\BDCliente.java
![Page 48: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/48.jpg)
48
Conjunto de resultados desplazable
� Recorrido básico del ResultSet: cursorhacia delante, de fila en fila y desde la primera fila � next().
� Podemos acceder a las filas del ResultSet de más formas (JDBC 2.0), como un índice de un array.
![Page 49: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/49.jpg)
49
Creación de la sentencia para Resultset desplazable
� Cambio en la creación del objeto sentencia:� createStatement(int tipoResultSet,
int concurrenciaResultSet)
� tipoResultSet es el que permite flexibilidad en el desplazamiento.
� Valores:
� TYPE_FORWARD_ONLY, sólo hacia delante
� TYPE_SCROLL_INSENSITIVE, TYPE_SCROLL_SENSITIVE, métodos de posicionamiento habilitados
![Page 50: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/50.jpg)
50
Métodos de desplazamiento del cursor
� Métodos
� Movimiento hacia atrás: afterLast(), previous().
� Posicionamiento absoluto: first(), last(), absolute(numFila).
� Posicionamiento relativo: relative(num).
� Recupera fila actual: getRow().
![Page 51: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/51.jpg)
51
Conjunto de resultados actualizable
� Para actualizar datos en la BD teníamos que recurrir a sentencias SQL: INSERT, UPDATE, DELETE.
� Podemos realizar actualizaciones por programa (JDBC 2.0).
![Page 52: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/52.jpg)
52
Creación de la sentencia para Resultset actualizable
� Cambio en la creación del objeto sentencia:� createStatement(int tipoResultSet,
int concurrenciaResultSet)
� concurrenciaResultSet es el que permite actualizar ResultSet por programa.
� Valores:� CONCUR_READ_ONLY, no se puede actualizar.
� CONCUR_UPDATABLE, permite la utilización de métodos para modificar filas.
![Page 53: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/53.jpg)
53
Métodos para actualizar filas
� Posicionarse en la fila para actualizar.
� Llamar a los métodos de actualización de campos:
� updateXXX(<campo>,<valor>)
� Para confirmar las actualizaciones sobre la tabla llamamos a: updateRow().
![Page 54: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/54.jpg)
54
Insertando y borrando por programa
� Métodos para insertar filas sin utilizar SQL:� moveToInsertRow(), mueve a fila vacía.
� updateXXX(<campo>,<valor>) sobre cada campo de la nueva fila.
� insertRow(), confirma inserción.
� Método para borrar filas sin utilizar SQL:� Posicionarnos sobre la fila a borrar.
� deleteRow().
![Page 55: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/55.jpg)
55
Información acerca de la base de datos (Metadatos)
� Cuando a priori no tenemos información sobre la estructura de la base de datos podemos acceder a ella mediante los metadatos.
� Esto permite adaptar el acceso que estárealizando nuestra aplicación a una BD concreta en tiempo de ejecución.
� Objeto Connection al que aplicamos el método getMetaData(), que devuelve un objeto que implementa la interfaz DatabaseMetaData.
![Page 56: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/56.jpg)
56
Metadatos para SQL� Types simplemente contiene constantes con los tipos de datos.
� DatabaseMetadata, proporciona información sobre la BD.
Object
DatabaseMetaData
<<Interface>>Types
![Page 57: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/57.jpg)
57
Información sobre el resultado de una consulta
� Muchas veces no conocemos lo que va a devolver una consulta: SELECT * FROM Contactos.
� JDBC permite obtener un objeto que implementa ResultSetMetaData al aplicar el método getMetada() a un objeto ResultSet.
� De esta forma podemos obtener datos como número de columnas devueltas y el nombre de una determinada columna.
� Esto permite la ejecución y recuperación de resultados de forma dinámica.
![Page 58: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/58.jpg)
58
Código fuente de recuperación de metadatos
ResultSet rs = stmt.executeQuery(sqlStr);
ResultSetMetaData rsmd= rs.getMetaData();
int columnCount= rsmd.getColumnCount();
// Vamos imprimiendo los nombres de cada columna
for(int x =1;x<=columnCount;x++)
{
String columnName= rsmd.getColumnName(x);
System.out.print(columnName +"\t");
}
...
![Page 59: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/59.jpg)
59
Código fuente de recuperación de metadatos (cont.)
// Recorremos filas e imprimimos los valores de cada
columna
while(rs.next())
{
for(int x =1;x<=columnCount;x++)
{
if (rsmd.getColumnTypeName(x).compareTo("CURRENCY") == 0)
System.out.print("$");
String resultStr = rs.getString(x);
System.out.print(resultStr +"\t");
}
}
...
![Page 60: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/60.jpg)
60
Ejemplo de uso de metadatos
� El siguiente código muestra el acceso a una base de datos y ejecución de consultas de selección y acción a una base de datos utilizando un driver JDBC
� Código: c:\java\JDBC2\Bd.java
� La recuperación de datos se realiza cualquiera de las tablas de la base de datos ‘agenda’ no conociendo previamente la estructura de la tabla
![Page 61: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/61.jpg)
61
Manejo de transacciones
� Hay veces que no queremos que una sentencia tenga efecto a menos que otra también suceda.
� Por ejemplo en una operación en la que hay que actualizar campos de varias tablas, en diferentes acciones SQL, no se querrá actualizar una sin actualizar la otra; de otro modo, los datos serían inconsistentes.
� La forma para asegurarnos que ocurren las dos acciones o que no ocurre ninguna es utilizar una transación. Una transación es un conjunto de una o más sentencias que se ejecutan como una unidad, por eso o se ejecutan todas o no se ejecuta ninguna.
![Page 62: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/62.jpg)
62
Manejo de transacciones (2)
� Cuando se crea una conexión, está en modo auto-entrega.
� Esto significa que cada sentencia SQL individual es tratada como una transación y será automáticamente entregada justo después de ser ejecutada.
� La forma de permitir que dos o más sentencia sean agrupadas en una transación es desactivar el modo auto-entrega. Esto se demuestra en el siguiente código, donde con es una conexión activa.
� con.setAutoCommit(false);
![Page 63: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/63.jpg)
63
Manejo de transacciones (3)
� Es el tratamiento conjunto de sentencias SQL. Operaciones básicas:� COMMIT: realizar la acción
� ROLLBACK: volver al paso anterior, revocar la acción
� Métodos para el tratamiento de transacciones, sobre el objeto conección:� commit(), roollback() y setAutoCommit().
![Page 64: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/64.jpg)
64
Código de ejemplo de manejo de una transacción
con.setAutoCommit(false); � Iniciamos la transacciónPreparedStatement psProd = con.prepareStatement( "UPDATE Productos
SET precio = ? WHERE nombreProducto LIKE ?");psProd.setInt(1, 500); psProd.setString(2, “Caja 10 cd’s"); psProd.executeUpdate(); � Todavia no se ejecutaPreparedStatement psInv = con.prepareStatement( "UPDATE Inventario
SET valorTotal = cantidad * ? WHERE Producto LIKE ?"); psInv.setInt(1, 500); psInv.setString(2, "Caja 10 cd’s");psInv.executeUpdate(); con.commit(); � Se ejecutan las dos accionescon.setAutoCommit(true); � Volvemos al modo auto-entrega
![Page 65: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/65.jpg)
65
Acceso a base de datos desde Servlets y JSP
![Page 66: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/66.jpg)
66
Acceso a base de datos desde Servlets
� La mayoría de las aplicaciones comerciales basadas en servlets utilizan bases de datos.
� El acceso a base de datos desde un servlet es igual al que se puede realizar desde cualquier aplicación java.
� Se utiliza la tecnología JDBC de Java.
![Page 67: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/67.jpg)
67
JDBC en un Servlet
� Para emplear JDBC en un Servletsimplemente hay que incluir los paquetes de java adecuados.
� Debemos tener en cuenta los distintos tipos de controladores JDBC y cual nos interesa emplear, como en otros entornos.
� Se utilizan exactamente las mismas interfaces y las mismas clases para conectarnos y extraer información de la base de datos que en cualquier otra aplicación Java.
![Page 68: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/68.jpg)
68
Escenario común servlets y BD
� Vamos a representar un escenario común en cualquier aplicación que utiliza servlets y BD.
� Tenemos un formulario HTML en el que el usuario introduce datos, en la tabla ‘contactos’.
� Con los datos del formulario construimos una consulta que realizamos sobre la BD.
� Los resultados se los devolvemos al usuario en otra página HTML.
![Page 69: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/69.jpg)
69
Conexión a la base de datos
� Respecto al rendimiento, el mayor cuello de botella se produce al crear un objeto Connection para conectarnos a la BD.
� Debemos evitar tener que hacerlo repetidamente.� Código de creación de la conexión con la BD en la inicialización del servlet que se produce sólo una vez �método init().
� El código de cierre de la conexión se realiza en el método destroy() del servlet
![Page 70: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/70.jpg)
70
Recuperar datos del formulario de consulta
� Una vez conectados, el resto del código de acceso a BD estará en los métodos doGet() o doPost().
� Recuperamos los valores de los campos que ha introducido en el formulario que lanza la consulta.
![Page 71: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/71.jpg)
71
Construcción de la consulta
� Construiremos la cadena que constituye la sentencia SQL que posteriormente ejecutaremos contra la base de datos.
� Normalmente habrá una parte fija que no varía y unos parámetros que crearemos a partir de la información del formulario.
![Page 72: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/72.jpg)
72
Ejecución de la consulta y devolución de resultados
� Una vez construida la consulta, la enviamos a la BD para su ejecución.
� Si existe algún problema debemos devolver un error al usuario.
� Si la ejecución fue correcta debemos devolver los resultados de la ejecución.
![Page 73: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/73.jpg)
73
Cierre de la conexión
� Debemos asegurarnos que en el método destroy() del servlet se cierren todas las conexiones.
� El recolector de basura podrá liberar todos los recursos.
![Page 74: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/74.jpg)
74
Resumen de acceso y manejo de una conexión a BD desde un servlet
� Conexión con la BD.
� Recuperar parámetros del formulario de consulta.
� Construir la sentencia.
� Ejecución de la consulta y devolución de resultados.
� Cierre de la conexión.
![Page 75: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/75.jpg)
75
Ejemplo de manejo de conexión de BD en un servlet
� El siguiente ejemplo implementa una búsqueda de datos en la tabla ‘contactos’ de la base de datos ‘agenda’por cualquier criterio.
� Código: c:\java\Servlet3.java
![Page 76: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/76.jpg)
76
Ejemplo de pequeña aplicación web
� En el siguiente ejemplo se implementa una pequeña aplicación web que permite: insertar, mostrar y eliminar registros de la tabla ‘contactos’
� Código:
� InsertarCliente: servlet que inserta el contacto y envía el resultado de la acción
� c:\java\Servlet4-JDBC-Clientes\Clientes\WEB-INF\src\InsertarCliente.java
� EliminarCliente: servlet que elimina el contacto del cliente y envía el resultado de la acción
� c:\java\Servlet4-JDBC-Clientes\Clientes\WEB-INF\src\EliminarCliente.java
� VerCliente: servlet que muestra los datos del contacto del cliente � c:\java\Servlet4-JDBC-Clientes\Clientes\WEB-INF\src\VerCliente.java
� MostrarClientes: servlet que muestra todos los contactos de clientes de la tabla ‘contactos’
� c:\java\Servlet4-JDBC-Clientes\Clientes\WEB-INF\src\MostrarClientes.java
![Page 77: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/77.jpg)
77
Sentencias preparadas en la construcción de sentencias
� Principal uso de las sentencias preparadas: mejorar rendimiento.
� También permiten evitar errores sintácticos en la construcción de la sentencia SQL en el servlet.
� El usuario podría meter caracteres reservados (ej.: ’) en el parámetro.
� El uso de setString() evita la confusión del analizador de sentencias de la BD.
![Page 78: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/78.jpg)
78
Asociaciones de conexiones
� La creación y destrucción de conexiones es un proceso costoso, en consultas pequeñas, nos podemos tardar más en abrir una conexión, que en ejecutar la propia consulta.
� En el caso de los servlets, como hemos visto, la conexión a la base de datos se mantiene abierta de acuerdo al tiempo y ciclo de vida del servlet, y esto puede afectar la eficiencia y la escalabilidad, debido al gran número de conexiones abiertas durante mucho tiempo, muchas de las cuales no se estarán usando en determinados momentos.
� Además, las variables de instancia Connection y Statement no son seguras en modo multi-thread, y el servlet debe implementar el SingleThreadModel, lo cual degrada la eficiencia y la escalabilidad del servlet.
� Para corregir este tipo de problemas, debemos usar lo que se conoce como asociación de conexiones o pool de conexiones(connection pooling).
![Page 79: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/79.jpg)
79
Asociaciones de conexiones (2)
� La asociación de conexiones es una técnica que se utiliza para que una aplicación pueda reusar las conexiones que ya han sido establecidas en lugar de crear nuevas conexiones cada vez.
� Esta técnica está basada en el hecho de que la mayoría de las aplicaciones solo necesita tener acceso a una conexión JDBC cuando se estáprocesando una consulta, lo cual toma sólo algunos milisegundos en completarse.
� En las aplicaciones que se conectan continuamente a una misma base de datos tiene mucho sentido volver a reciclar las conexiones que ya están abiertas y que no se están utilizando
� Mejora la eficiencia
![Page 80: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/80.jpg)
80
Creación de asociaciones de conexiones
� Para ello usamos una fuente JDBC representado en la interfaz DataSource
� Utilizar la interface DataSource en vez de DriverManager es mejor por dos razones importantes, se hace el código más portable y más fácil de mantener.
� La información relativa a la seguridad, nombres y contraseñas, son almacenados en ficheros de configuración y no en el código.
![Page 81: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/81.jpg)
81
Creación de asociaciones de conexiones (2)
� DataSource es referenciado usando la interfaz JNDI
� JNDI es un servicio de nombres y directorios
� JNDI proporciona una manera uniforme para que una aplicación pueda acceder a servicios remotos sobre una red, como una base de datos.
![Page 82: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/82.jpg)
82
Pasos para la creación de asociaciones de conexiones (3)
� Definir una referencia a un recurso dentro de nuestro archivo descriptor de despliegue de la aplicación web (web.xml).
� Establecer la relación entre la referencia al recurso y una referencia real para el contexto de nuestra aplicación.
� A continuación se comentan todos los pasos
![Page 83: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/83.jpg)
83
Definir una referencia a un recurso: web.xml
� web.xml: añadir este fragmento al final, antes de la etiqueta </web-app>. Esto indica que se va a usar un recurso referenciado como dsAgenda
<resource-ref> <res-ref-name> jdbc/dsAgenda </res-ref-name> <res-type> javax.sql.DataSource </res-type> <res-auth> Container </res-auth>
</resource-ref>
![Page 84: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/84.jpg)
84
Definición del recurso en el servidor de aplicaciones (Tomcat)
� server.xml: añadir algo parecido a esto entre las etiquetas <host> del server.xml
<Context path="/Servlet5-JDBC-CliPool" docBase="/Servlet5-JDBC-CliPool/CliPool" debug="0">
<Resource name="jdbc/dsAgenda"
auth="Container"
type="javax.sql.DataSource"/>
<ResourceParams name="jdbc/dsAgenda">
…
![Page 85: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/85.jpg)
85
Definición del recurso en el servidor de aplicaciones (Tomcat) (2)
<!– Número máximo de conexiones BD en la asociación. --><parameter><name>maxActive</name><value>100</value>
</parameter>
<!– Número máximo de conexiones ociosas en la asociación.Poner a -1 para ningún límite. -->
<parameter><name>maxIdle</name><value>30</value>
</parameter>
![Page 86: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/86.jpg)
86
Definición del recurso en el servidor de aplicaciones (Tomcat) (3)
<!– Tiempo de espera máximo para que una conexion esté disponible. En este caso10 segundos. Poner a -1 para esperar indefinidamente--><parameter><name>maxWait</name><value>10000</value>
</parameter>
<!– Nombres de usuario y password para la conexión a la BD --><parameter><name>username</name><value>curso_java</value></parameter><parameter><name>password</name><value>curso_java</value></parameter>
![Page 87: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/87.jpg)
87
Definición del recurso en el servidor de aplicaciones (Tomcat) (4)
<!– Nombre de la clase del driver --><parameter><name>driverClassName</name><!-- <value>com.mysql.jdbc.Driver</value> -- > � Para MySQL<value>oracle.jdbc.driver.OracleDriver</value> � Para Oracle
</parameter>
<!– La url para conectar con la BD. El autoReconnect=true asegura que se reconectaráautomáticamente si la BD cierra la conexion -->
<parameter><name>url</name><value>jdbc:mysql://localhost:3306/agenda</value> � Para MySQLvalue>jdbc:oracle:thin:@10.1.1.36:1521:DESA</value> � Para Oracle
</parameter></ResourceParams>
</Context> � Si se define este recurso en la etiqueta <DefaultContext> el recurso estará
disponible para todas las aplicaciones que corran en el servidor
![Page 88: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/88.jpg)
88
Crear un pool de conexiones
� Copiar el driver JDBC de la base de datos en el directorio TOMCAT_HOME\common\lib
� Esto hace que el driver esté disponible para Tomcat
� Reiniciar Tomcat
![Page 89: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/89.jpg)
89
Acceder a la base de datos a través de una asociación de conexiones
� El siguiente código muestra como recuperar el objeto DataSource asociado con el nombre jdbc/dsAgenda para entonces establecer una conexión a la base de datos.
� Las tres primeras líneas usan el API JNDI para obtener el objeto DataSource, la última línea usa el API JDBC para establecer la conexión. Context init = new InitialContext(); Context context = (Context) init.lookup("java:comp/env"); DataSource ds = (DataSource) context.lookup("jdbc/dsAgenda");
Connection con = ds.getConnection();
� El objeto ‘con’ de conexión es idéntico a los anteriores y ya podemos utilizar la conexión con la BD
![Page 90: 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006](https://reader036.vdocuments.pub/reader036/viewer/2022062308/55889bebd8b42a17268b474e/html5/thumbnails/90.jpg)
90
Ejemplo de uso de una asociación de conexiones con servlets
� En el siguiente ejemplo se implementa una pequeña aplicación web que permite: insertar, mostrar y eliminar registros de la tabla ‘contactos’
� Código: � FormInsertarCliente: servlet de entrada que envía un formulario al cliente
para insertar un nuevo contacto� c:\java\Servlet5-JDBC-CliPool\CliPool\WEB-INF\src\FormInsertarCliente.java
� InsertarCliente: servlet que inserta el contacto y envía el resultado de la acción
� c:\java\Servlet5-JDBC-CliPool\CliPool\WEB-INF\src\InsertarCliente.java
� EliminarCliente: servlet que elimina el contacto del cliente y envía el resultado de la acción
� c:\java\Servlet5-JDBC-CliPool\CliPool\WEB-INF\src\EliminarCliente.java
� VerCliente: servlet que muestra los datos del contacto del cliente � c:\java\Servlet5-JDBC-CliPool\CliPool\WEB-INF\src\VerCliente.java
� MostrarClientes: servlet que muestra todos los contactos de clientes de la tabla ‘contactos’
� c:\java\Servlet5-JDBC-CliPool\CliPool\WEB-INF\src\MostrarClientes.java