SlideShare una empresa de Scribd logo
1 de 90
Descargar para leer sin conexión
Samuel Marrero Lorenzo -
smarlor@iespana.es 1
Acceso a base de datos con
Java desde aplicaciones web
con la tecnología JDBC
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.
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/Open
CLI (implementada en lenguaje C).
La filosofía de estas APIs es que permitan
acceder de la misma forma a distintas BD.
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.
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
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.
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
DriverPropertyInfo
CallableStatement
<<Interface>>
PreparedStatement
<<Interface>>
ResultSetMetaData
<<Interface>>
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.
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.
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.
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
12
Registrar el controlador (3)
Averiguar el nombre de la clase provista por
el paquete a ser usado.
Localizar la clase en el directorio apropiado
para que pueda ser cargado.
Alternativamente se puede cargar la clase en
el programa usando el comando:
Class.forName(“sun.jdbcJdbcOdbcDriver”);
DriverManager.registerDriver(new
oracle.jdbc.driver.OracleDriver() ).
13
Código fuente de carga/registro
del controlador de la BD
try
{
//Ejemplo para Oracle
DriverManager.registerDriver(new
oracle.jdbc.driver.Oracledriver());
//Ejemplo para MySQL
Class.forName("com.mysql.jdbc.Driver").newInstance();
}
catch (ClassNotFoundException e)
{
System.out.println("Error en la carga del driver
JDBC");
return;
}
14
:
DriverManager
Cliente
getConnection( )
:
Connection
Conexión a la BD
Obtener conexión BD
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
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.
17
Código fuente de conexión
try
{
//Oracle
Connection con=
DriverManager.getConnection("jdbc:oracle:thin:curso_java@10
.1.1.36:1521:DESA",
"","");
//MySQL
Connection con=
DriverManager.getConnection("jdbc:odbc:agenda",
"","");
}
catch (SQLException e)
{
System.out.println(e);
}
url de la BD
Usuario, password
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.
19
:
DriverManager
Cliente
getConnection( )
:
Connection
createStatement( )
: Statement
Obtener el objeto
Statement
Crear sentencia de
BD
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.
21
Objetos involucrados en el
acceso a datos (diagrama de
colaboración)
Programa
Java
Objeto Driver
JDBC BD
Base de
datos
Objeto
Connection
Objeto
Statement
SQL
Resultados
Objeto
ResultSet
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);
}
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.
24
:
DriverManager
Cliente
getConnection( )
:
Connection
createStatement( )
: Statement
executeQuery( )
: ResultSet
Ejecutar la consulta
Ejecutar
consulta
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.
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)
...
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
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 getXXX
que permiten recuperar valores de distintos
tipos.
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);
}
30
:
DriverManager
Cliente
getConnection( )
:
Connection
createStatement( )
: Statement
executeQuery( )
: ResultSet
next( )
getInt( )
getString( )
getBigDecimal( )
close( )
close( )
Liberar el objeto
Connection
Liberar el objeto
Statement Librerar
objetos
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)
...
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.
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:javaJDBC1Bd.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
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.
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().
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.
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
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.
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
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 Java
JDBCODBC
Serv.
ODBC
BD
Protocolo ODBC
Serv.
ODBC
BDProtocolo ODBC
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 Java
JDBC
API
nativa
Serv.
nativo
BD
Protocolo nativo
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 Java
JDBC
Serv.
nativo
BD
BD
Serv.
JDBC
Serv.
nativo
Serv.
JDBC
Protocolo estándar
Protocolo estándar
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 Java
JDBC
Serv.
nativo
BD
Protocolo nativo
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().
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.
46
Código fuente de sentencias
preparadas
PreparedStatement 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,“pedro.rodriguez@laspalmasgc.es");//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,“nico@hotmail.com"); // Email
pstmt.setString(3,“928246538"); // Teléfono
int insCount= pstmt.executeUpdate();
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:javaBDCliente.java
48
Conjunto de resultados
desplazable
Recorrido básico del ResultSet: cursor
hacia 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.
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
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().
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).
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.
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().
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().
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.
56
Metadatos para SQL
Types simplemente contiene constantes con los tipos de datos.
DatabaseMetadata, proporciona información sobre la BD.
Object
DatabaseMetaData
<<Interface>>
Types
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.
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");
}
...
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");
}
}
...
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:javaJDBC2Bd.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
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.
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);
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().
64
Código de ejemplo de manejo
de una transacción
con.setAutoCommit(false); Iniciamos la transacción
PreparedStatement 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 ejecuta
PreparedStatement 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 acciones
con.setAutoCommit(true); Volvemos al modo auto-entrega
65
Acceso a base de datos desde
Servlets y JSP
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.
67
JDBC en un Servlet
Para emplear JDBC en un Servlet
simplemente 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.
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.
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
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.
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.
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.
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.
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.
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:javaServlet3.java
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:javaServlet4-JDBC-ClientesClientesWEB-INFsrcInsertarCliente.java
EliminarCliente: servlet que elimina el contacto del cliente y envía el
resultado de la acción
c:javaServlet4-JDBC-ClientesClientesWEB-INFsrcEliminarCliente.java
VerCliente: servlet que muestra los datos del contacto del cliente
c:javaServlet4-JDBC-ClientesClientesWEB-INFsrcVerCliente.java
MostrarClientes: servlet que muestra todos los contactos de clientes de la
tabla ‘contactos’
c:javaServlet4-JDBC-ClientesClientesWEB-INFsrcMostrarClientes.java
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.
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).
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
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.
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.
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
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>
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">
…
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>
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 caso
10 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>
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 MySQL
value>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
88
Crear un pool de conexiones
Copiar el driver JDBC de la base de
datos en el directorio
TOMCAT_HOMEcommonlib
Esto hace que el driver esté disponible
para Tomcat
Reiniciar Tomcat
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
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:javaServlet5-JDBC-CliPoolCliPoolWEB-INFsrcFormInsertarCliente.java
InsertarCliente: servlet que inserta el contacto y envía el resultado de la
acción
c:javaServlet5-JDBC-CliPoolCliPoolWEB-INFsrcInsertarCliente.java
EliminarCliente: servlet que elimina el contacto del cliente y envía el
resultado de la acción
c:javaServlet5-JDBC-CliPoolCliPoolWEB-INFsrcEliminarCliente.java
VerCliente: servlet que muestra los datos del contacto del cliente
c:javaServlet5-JDBC-CliPoolCliPoolWEB-INFsrcVerCliente.java
MostrarClientes: servlet que muestra todos los contactos de clientes de la
tabla ‘contactos’
c:javaServlet5-JDBC-CliPoolCliPoolWEB-INFsrcMostrarClientes.java

Más contenido relacionado

La actualidad más candente (19)

Bases Datos en java
Bases Datos en javaBases Datos en java
Bases Datos en java
 
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
 
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
 
Java.sql.*
Java.sql.*Java.sql.*
Java.sql.*
 
Jdbc
JdbcJdbc
Jdbc
 
Jdbc
JdbcJdbc
Jdbc
 
JDBC
JDBCJDBC
JDBC
 
Jdbc
JdbcJdbc
Jdbc
 
Jdbc Mysql
Jdbc MysqlJdbc Mysql
Jdbc Mysql
 
T2 - JDBC
T2 - JDBCT2 - JDBC
T2 - JDBC
 
Persistencia de datos en Java
Persistencia de datos en JavaPersistencia de datos en Java
Persistencia de datos en Java
 
Jdbc
JdbcJdbc
Jdbc
 
Java DataBase Connectivity
Java DataBase ConnectivityJava DataBase Connectivity
Java DataBase Connectivity
 
JDBC
JDBCJDBC
JDBC
 
JDBC
JDBCJDBC
JDBC
 
Conexion a bases de datos
Conexion a bases de datosConexion a bases de datos
Conexion a bases 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)
 
Java con base de datos
Java con base de datosJava con base de datos
Java con base de datos
 

Destacado (20)

Manual hibernate v2
Manual hibernate v2Manual hibernate v2
Manual hibernate v2
 
Bases De Datos Mysql Con Java
Bases De Datos Mysql Con JavaBases De Datos Mysql Con Java
Bases De Datos Mysql Con Java
 
Bbdd en java
Bbdd en javaBbdd en java
Bbdd en java
 
Clase n°2 3-4 java
Clase n°2 3-4 javaClase n°2 3-4 java
Clase n°2 3-4 java
 
Clase No.2 Preparando el Ambiente de Java
Clase No.2 Preparando el Ambiente de Java Clase No.2 Preparando el Ambiente de Java
Clase No.2 Preparando el Ambiente de Java
 
Gestiondered 100222091702-phpapp01
Gestiondered 100222091702-phpapp01Gestiondered 100222091702-phpapp01
Gestiondered 100222091702-phpapp01
 
Jdb ccompleto
Jdb ccompletoJdb ccompleto
Jdb ccompleto
 
Java con bd
Java con bdJava con bd
Java con bd
 
Hibernate reference
Hibernate referenceHibernate reference
Hibernate reference
 
Pasos para Instalar MySQL server
Pasos para Instalar MySQL server Pasos para Instalar MySQL server
Pasos para Instalar MySQL server
 
Introducción práctica a JPA2
Introducción práctica a JPA2Introducción práctica a JPA2
Introducción práctica a JPA2
 
Conexión de Base de Datos
Conexión de Base de DatosConexión de Base de Datos
Conexión de Base de Datos
 
Bases de Datos en Java - Intro a Hibernate
Bases de Datos en Java - Intro a HibernateBases de Datos en Java - Intro a Hibernate
Bases de Datos en Java - Intro a Hibernate
 
Curso Java Inicial 7 Excepciones
Curso Java Inicial   7 ExcepcionesCurso Java Inicial   7 Excepciones
Curso Java Inicial 7 Excepciones
 
Tema 10 excepciones
Tema 10 excepcionesTema 10 excepciones
Tema 10 excepciones
 
Excepciones en java
Excepciones en javaExcepciones en java
Excepciones en java
 
Excepciones
ExcepcionesExcepciones
Excepciones
 
Unidad 5: Excepciones Ejercicio 2
Unidad 5: Excepciones Ejercicio 2Unidad 5: Excepciones Ejercicio 2
Unidad 5: Excepciones Ejercicio 2
 
Unidad 5: Excepciones Ejercicio 1
Unidad 5: Excepciones Ejercicio 1Unidad 5: Excepciones Ejercicio 1
Unidad 5: Excepciones Ejercicio 1
 
Java exceptions
Java exceptionsJava exceptions
Java exceptions
 

Similar a 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006

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 javadevsco63
 
Tema 15 aplicaciones de dos capas por gio
Tema 15   aplicaciones de dos capas por gioTema 15   aplicaciones de dos capas por gio
Tema 15 aplicaciones de dos capas por gioRobert Wolf
 
Clase conexion java - Analisis de Sistemas
Clase conexion java - Analisis de SistemasClase conexion java - Analisis de Sistemas
Clase conexion java - Analisis de SistemasJose Bustamante Romero
 
Tema 9 aplicaciones de dos capas por gio
Tema 9   aplicaciones de dos capas por gioTema 9   aplicaciones de dos capas por gio
Tema 9 aplicaciones de dos capas por gioRobert Wolf
 
Uso java jdbc
Uso java jdbcUso java jdbc
Uso java jdbcjbersosa
 
Uso java jdbc
Uso java jdbcUso java jdbc
Uso java jdbcjbersosa
 
Notas clase java ii
Notas clase java iiNotas clase java ii
Notas clase java ii1 2d
 
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 datosDavid
 
Notas clase
Notas claseNotas clase
Notas clase1 2d
 
Notas clase java ii
Notas clase java iiNotas clase java ii
Notas clase java ii1 2d
 
Notas clase
Notas claseNotas clase
Notas clase1 2d
 
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 datosJyoc X
 
Java con base de datos
Java con base de datosJava con base de datos
Java con base de datosJhosy2404
 

Similar a 3. Curso Java JDBC (Bases de datos) - Curso 2005-2006 (20)

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
 
Tema 15 aplicaciones de dos capas por gio
Tema 15   aplicaciones de dos capas por gioTema 15   aplicaciones de dos capas por gio
Tema 15 aplicaciones de dos capas por gio
 
Clase conexion java - Analisis de Sistemas
Clase conexion java - Analisis de SistemasClase conexion java - Analisis de Sistemas
Clase conexion java - Analisis de Sistemas
 
5 a bd_servidor
5 a bd_servidor5 a bd_servidor
5 a bd_servidor
 
Tema 9 aplicaciones de dos capas por gio
Tema 9   aplicaciones de dos capas por gioTema 9   aplicaciones de dos capas por gio
Tema 9 aplicaciones de dos capas por gio
 
Uso java jdbc
Uso java jdbcUso java jdbc
Uso java jdbc
 
Uso java jdbc
Uso java jdbcUso java jdbc
Uso java jdbc
 
Notas clase java ii
Notas clase java iiNotas clase java ii
Notas clase java ii
 
Java con base de datos
Java con base de datosJava con base de datos
Java con base de datos
 
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
 
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
 
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
 
Coneccion
ConeccionConeccion
Coneccion
 
Ado.Net
Ado.NetAdo.Net
Ado.Net
 
Java con base de datos
Java con base de datosJava con base de datos
Java con base de datos
 
Connection
ConnectionConnection
Connection
 
Trabajo de jdbc
Trabajo de jdbcTrabajo de jdbc
Trabajo de jdbc
 
Trabajo de jdbc
Trabajo de jdbcTrabajo de jdbc
Trabajo de jdbc
 

Último

4° SES COM MAR 09 Leemos una noticia del dengue e identificamos sus partes (1...
4° SES COM MAR 09 Leemos una noticia del dengue e identificamos sus partes (1...4° SES COM MAR 09 Leemos una noticia del dengue e identificamos sus partes (1...
4° SES COM MAR 09 Leemos una noticia del dengue e identificamos sus partes (1...MagalyDacostaPea
 
05 Fenomenos fisicos y quimicos de la materia.pdf
05 Fenomenos fisicos y quimicos de la materia.pdf05 Fenomenos fisicos y quimicos de la materia.pdf
05 Fenomenos fisicos y quimicos de la materia.pdfRAMON EUSTAQUIO CARO BAYONA
 
4º SOY LECTOR PART2- MD EDUCATIVO.p df PARTE
4º SOY LECTOR PART2- MD  EDUCATIVO.p df PARTE4º SOY LECTOR PART2- MD  EDUCATIVO.p df PARTE
4º SOY LECTOR PART2- MD EDUCATIVO.p df PARTESaraNolasco4
 
MODELO DE INFORME DE INDAGACION CIENTIFICA .docx
MODELO DE INFORME DE INDAGACION CIENTIFICA .docxMODELO DE INFORME DE INDAGACION CIENTIFICA .docx
MODELO DE INFORME DE INDAGACION CIENTIFICA .docxRAMON EUSTAQUIO CARO BAYONA
 
Secuencia didáctica.DOÑA CLEMENTINA.2024.docx
Secuencia didáctica.DOÑA CLEMENTINA.2024.docxSecuencia didáctica.DOÑA CLEMENTINA.2024.docx
Secuencia didáctica.DOÑA CLEMENTINA.2024.docxNataliaGonzalez619348
 
Tarea 4_ Foro _Incorporar habilidades de Siglo XXI
Tarea 4_ Foro _Incorporar habilidades de Siglo XXI Tarea 4_ Foro _Incorporar habilidades de Siglo XXI
Tarea 4_ Foro _Incorporar habilidades de Siglo XXI Manuel Molina
 
DIDÁCTICA DE LA EDUCACIÓN SUPERIOR- DR LENIN CARI MOGROVEJO
DIDÁCTICA DE LA EDUCACIÓN SUPERIOR- DR LENIN CARI MOGROVEJODIDÁCTICA DE LA EDUCACIÓN SUPERIOR- DR LENIN CARI MOGROVEJO
DIDÁCTICA DE LA EDUCACIÓN SUPERIOR- DR LENIN CARI MOGROVEJOLeninCariMogrovejo
 
Fichas de MatemáticA QUINTO DE SECUNDARIA).pdf
Fichas de MatemáticA QUINTO DE SECUNDARIA).pdfFichas de MatemáticA QUINTO DE SECUNDARIA).pdf
Fichas de MatemáticA QUINTO DE SECUNDARIA).pdfssuser50d1252
 
PÉNSUM ENFERMERIA 2024 - ECUGENIUS S.A. V2
PÉNSUM ENFERMERIA 2024 - ECUGENIUS S.A. V2PÉNSUM ENFERMERIA 2024 - ECUGENIUS S.A. V2
PÉNSUM ENFERMERIA 2024 - ECUGENIUS S.A. V2Eliseo Delgado
 
VOLUMEN 1 COLECCION PRODUCCION BOVINA . SERIE SANIDAD ANIMAL
VOLUMEN 1 COLECCION PRODUCCION BOVINA . SERIE SANIDAD ANIMALVOLUMEN 1 COLECCION PRODUCCION BOVINA . SERIE SANIDAD ANIMAL
VOLUMEN 1 COLECCION PRODUCCION BOVINA . SERIE SANIDAD ANIMALEDUCCUniversidadCatl
 
GUIA DE TEXTOS EDUCATIVOS SANTILLANA PARA SECUNDARIA
GUIA DE TEXTOS EDUCATIVOS SANTILLANA PARA SECUNDARIAGUIA DE TEXTOS EDUCATIVOS SANTILLANA PARA SECUNDARIA
GUIA DE TEXTOS EDUCATIVOS SANTILLANA PARA SECUNDARIAELIASPELAEZSARMIENTO1
 
Uses of simple past and time expressions
Uses of simple past and time expressionsUses of simple past and time expressions
Uses of simple past and time expressionsConsueloSantana3
 
IV SES LUN 15 TUTO CUIDO MI MENTE CUIDANDO MI CUERPO YESSENIA 933623393 NUEV...
IV SES LUN 15 TUTO CUIDO MI MENTE CUIDANDO MI CUERPO  YESSENIA 933623393 NUEV...IV SES LUN 15 TUTO CUIDO MI MENTE CUIDANDO MI CUERPO  YESSENIA 933623393 NUEV...
IV SES LUN 15 TUTO CUIDO MI MENTE CUIDANDO MI CUERPO YESSENIA 933623393 NUEV...YobanaZevallosSantil1
 
EJEMPLO MODELO DE PLAN DE REFUERZO ESCOLAR.docx
EJEMPLO MODELO DE PLAN DE REFUERZO ESCOLAR.docxEJEMPLO MODELO DE PLAN DE REFUERZO ESCOLAR.docx
EJEMPLO MODELO DE PLAN DE REFUERZO ESCOLAR.docxFabianValenciaJabo
 
Técnicas de grabado y estampación : procesos y materiales
Técnicas de grabado y estampación : procesos y materialesTécnicas de grabado y estampación : procesos y materiales
Técnicas de grabado y estampación : procesos y materialesRaquel Martín Contreras
 

Último (20)

4° SES COM MAR 09 Leemos una noticia del dengue e identificamos sus partes (1...
4° SES COM MAR 09 Leemos una noticia del dengue e identificamos sus partes (1...4° SES COM MAR 09 Leemos una noticia del dengue e identificamos sus partes (1...
4° SES COM MAR 09 Leemos una noticia del dengue e identificamos sus partes (1...
 
05 Fenomenos fisicos y quimicos de la materia.pdf
05 Fenomenos fisicos y quimicos de la materia.pdf05 Fenomenos fisicos y quimicos de la materia.pdf
05 Fenomenos fisicos y quimicos de la materia.pdf
 
VISITA À PROTEÇÃO CIVIL _
VISITA À PROTEÇÃO CIVIL                  _VISITA À PROTEÇÃO CIVIL                  _
VISITA À PROTEÇÃO CIVIL _
 
La luz brilla en la oscuridad. Necesitamos luz
La luz brilla en la oscuridad. Necesitamos luzLa luz brilla en la oscuridad. Necesitamos luz
La luz brilla en la oscuridad. Necesitamos luz
 
4º SOY LECTOR PART2- MD EDUCATIVO.p df PARTE
4º SOY LECTOR PART2- MD  EDUCATIVO.p df PARTE4º SOY LECTOR PART2- MD  EDUCATIVO.p df PARTE
4º SOY LECTOR PART2- MD EDUCATIVO.p df PARTE
 
MODELO DE INFORME DE INDAGACION CIENTIFICA .docx
MODELO DE INFORME DE INDAGACION CIENTIFICA .docxMODELO DE INFORME DE INDAGACION CIENTIFICA .docx
MODELO DE INFORME DE INDAGACION CIENTIFICA .docx
 
Secuencia didáctica.DOÑA CLEMENTINA.2024.docx
Secuencia didáctica.DOÑA CLEMENTINA.2024.docxSecuencia didáctica.DOÑA CLEMENTINA.2024.docx
Secuencia didáctica.DOÑA CLEMENTINA.2024.docx
 
Tarea 4_ Foro _Incorporar habilidades de Siglo XXI
Tarea 4_ Foro _Incorporar habilidades de Siglo XXI Tarea 4_ Foro _Incorporar habilidades de Siglo XXI
Tarea 4_ Foro _Incorporar habilidades de Siglo XXI
 
DIDÁCTICA DE LA EDUCACIÓN SUPERIOR- DR LENIN CARI MOGROVEJO
DIDÁCTICA DE LA EDUCACIÓN SUPERIOR- DR LENIN CARI MOGROVEJODIDÁCTICA DE LA EDUCACIÓN SUPERIOR- DR LENIN CARI MOGROVEJO
DIDÁCTICA DE LA EDUCACIÓN SUPERIOR- DR LENIN CARI MOGROVEJO
 
Fichas de MatemáticA QUINTO DE SECUNDARIA).pdf
Fichas de MatemáticA QUINTO DE SECUNDARIA).pdfFichas de MatemáticA QUINTO DE SECUNDARIA).pdf
Fichas de MatemáticA QUINTO DE SECUNDARIA).pdf
 
PÉNSUM ENFERMERIA 2024 - ECUGENIUS S.A. V2
PÉNSUM ENFERMERIA 2024 - ECUGENIUS S.A. V2PÉNSUM ENFERMERIA 2024 - ECUGENIUS S.A. V2
PÉNSUM ENFERMERIA 2024 - ECUGENIUS S.A. V2
 
VOLUMEN 1 COLECCION PRODUCCION BOVINA . SERIE SANIDAD ANIMAL
VOLUMEN 1 COLECCION PRODUCCION BOVINA . SERIE SANIDAD ANIMALVOLUMEN 1 COLECCION PRODUCCION BOVINA . SERIE SANIDAD ANIMAL
VOLUMEN 1 COLECCION PRODUCCION BOVINA . SERIE SANIDAD ANIMAL
 
GUIA DE TEXTOS EDUCATIVOS SANTILLANA PARA SECUNDARIA
GUIA DE TEXTOS EDUCATIVOS SANTILLANA PARA SECUNDARIAGUIA DE TEXTOS EDUCATIVOS SANTILLANA PARA SECUNDARIA
GUIA DE TEXTOS EDUCATIVOS SANTILLANA PARA SECUNDARIA
 
Uses of simple past and time expressions
Uses of simple past and time expressionsUses of simple past and time expressions
Uses of simple past and time expressions
 
IV SES LUN 15 TUTO CUIDO MI MENTE CUIDANDO MI CUERPO YESSENIA 933623393 NUEV...
IV SES LUN 15 TUTO CUIDO MI MENTE CUIDANDO MI CUERPO  YESSENIA 933623393 NUEV...IV SES LUN 15 TUTO CUIDO MI MENTE CUIDANDO MI CUERPO  YESSENIA 933623393 NUEV...
IV SES LUN 15 TUTO CUIDO MI MENTE CUIDANDO MI CUERPO YESSENIA 933623393 NUEV...
 
PPTX: La luz brilla en la oscuridad.pptx
PPTX: La luz brilla en la oscuridad.pptxPPTX: La luz brilla en la oscuridad.pptx
PPTX: La luz brilla en la oscuridad.pptx
 
EJEMPLO MODELO DE PLAN DE REFUERZO ESCOLAR.docx
EJEMPLO MODELO DE PLAN DE REFUERZO ESCOLAR.docxEJEMPLO MODELO DE PLAN DE REFUERZO ESCOLAR.docx
EJEMPLO MODELO DE PLAN DE REFUERZO ESCOLAR.docx
 
Técnicas de grabado y estampación : procesos y materiales
Técnicas de grabado y estampación : procesos y materialesTécnicas de grabado y estampación : procesos y materiales
Técnicas de grabado y estampación : procesos y materiales
 
DIA INTERNACIONAL DAS FLORESTAS .
DIA INTERNACIONAL DAS FLORESTAS         .DIA INTERNACIONAL DAS FLORESTAS         .
DIA INTERNACIONAL DAS FLORESTAS .
 
Aedes aegypti + Intro to Coquies EE.pptx
Aedes aegypti + Intro to Coquies EE.pptxAedes aegypti + Intro to Coquies EE.pptx
Aedes aegypti + Intro to Coquies EE.pptx
 

3. Curso Java JDBC (Bases de datos) - Curso 2005-2006

  • 1. Samuel Marrero Lorenzo - smarlor@iespana.es 1 Acceso a base de datos con Java desde aplicaciones web con la tecnología JDBC
  • 2. 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.
  • 3. 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/Open CLI (implementada en lenguaje C). La filosofía de estas APIs es que permitan acceder de la misma forma a distintas BD.
  • 4. 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.
  • 5. 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
  • 6. 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.
  • 7. 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 DriverPropertyInfo CallableStatement <<Interface>> PreparedStatement <<Interface>> ResultSetMetaData <<Interface>>
  • 8. 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.
  • 9. 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.
  • 10. 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.
  • 11. 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
  • 12. 12 Registrar el controlador (3) Averiguar el nombre de la clase provista por el paquete a ser usado. Localizar la clase en el directorio apropiado para que pueda ser cargado. Alternativamente se puede cargar la clase en el programa usando el comando: Class.forName(“sun.jdbcJdbcOdbcDriver”); DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver() ).
  • 13. 13 Código fuente de carga/registro del controlador de la BD try { //Ejemplo para Oracle DriverManager.registerDriver(new oracle.jdbc.driver.Oracledriver()); //Ejemplo para MySQL Class.forName("com.mysql.jdbc.Driver").newInstance(); } catch (ClassNotFoundException e) { System.out.println("Error en la carga del driver JDBC"); return; }
  • 15. 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
  • 16. 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.
  • 17. 17 Código fuente de conexión try { //Oracle Connection con= DriverManager.getConnection("jdbc:oracle:thin:curso_java@10 .1.1.36:1521:DESA", "",""); //MySQL Connection con= DriverManager.getConnection("jdbc:odbc:agenda", "",""); } catch (SQLException e) { System.out.println(e); } url de la BD Usuario, password
  • 18. 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.
  • 19. 19 : DriverManager Cliente getConnection( ) : Connection createStatement( ) : Statement Obtener el objeto Statement Crear sentencia de BD
  • 20. 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.
  • 21. 21 Objetos involucrados en el acceso a datos (diagrama de colaboración) Programa Java Objeto Driver JDBC BD Base de datos Objeto Connection Objeto Statement SQL Resultados Objeto ResultSet
  • 22. 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); }
  • 23. 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.
  • 24. 24 : DriverManager Cliente getConnection( ) : Connection createStatement( ) : Statement executeQuery( ) : ResultSet Ejecutar la consulta Ejecutar consulta
  • 25. 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.
  • 26. 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) ...
  • 27. 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
  • 28. 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 getXXX que permiten recuperar valores de distintos tipos.
  • 29. 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); }
  • 30. 30 : DriverManager Cliente getConnection( ) : Connection createStatement( ) : Statement executeQuery( ) : ResultSet next( ) getInt( ) getString( ) getBigDecimal( ) close( ) close( ) Liberar el objeto Connection Liberar el objeto Statement Librerar objetos
  • 31. 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) ...
  • 32. 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.
  • 33. 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:javaJDBC1Bd.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
  • 34. 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.
  • 35. 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().
  • 36. 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.
  • 37. 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
  • 38. 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.
  • 39. 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
  • 40. 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 Java JDBCODBC Serv. ODBC BD Protocolo ODBC Serv. ODBC BDProtocolo ODBC
  • 41. 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 Java JDBC API nativa Serv. nativo BD Protocolo nativo
  • 42. 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 Java JDBC Serv. nativo BD BD Serv. JDBC Serv. nativo Serv. JDBC Protocolo estándar Protocolo estándar
  • 43. 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 Java JDBC Serv. nativo BD Protocolo nativo
  • 44. 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().
  • 45. 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.
  • 46. 46 Código fuente de sentencias preparadas PreparedStatement 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,“pedro.rodriguez@laspalmasgc.es");//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,“nico@hotmail.com"); // Email pstmt.setString(3,“928246538"); // Teléfono int insCount= pstmt.executeUpdate();
  • 47. 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:javaBDCliente.java
  • 48. 48 Conjunto de resultados desplazable Recorrido básico del ResultSet: cursor hacia 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.
  • 49. 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
  • 50. 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().
  • 51. 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).
  • 52. 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.
  • 53. 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().
  • 54. 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().
  • 55. 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.
  • 56. 56 Metadatos para SQL Types simplemente contiene constantes con los tipos de datos. DatabaseMetadata, proporciona información sobre la BD. Object DatabaseMetaData <<Interface>> Types
  • 57. 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.
  • 58. 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"); } ...
  • 59. 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"); } } ...
  • 60. 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:javaJDBC2Bd.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
  • 61. 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.
  • 62. 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);
  • 63. 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().
  • 64. 64 Código de ejemplo de manejo de una transacción con.setAutoCommit(false); Iniciamos la transacción PreparedStatement 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 ejecuta PreparedStatement 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 acciones con.setAutoCommit(true); Volvemos al modo auto-entrega
  • 65. 65 Acceso a base de datos desde Servlets y JSP
  • 66. 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.
  • 67. 67 JDBC en un Servlet Para emplear JDBC en un Servlet simplemente 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.
  • 68. 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.
  • 69. 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
  • 70. 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.
  • 71. 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.
  • 72. 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.
  • 73. 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.
  • 74. 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.
  • 75. 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:javaServlet3.java
  • 76. 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:javaServlet4-JDBC-ClientesClientesWEB-INFsrcInsertarCliente.java EliminarCliente: servlet que elimina el contacto del cliente y envía el resultado de la acción c:javaServlet4-JDBC-ClientesClientesWEB-INFsrcEliminarCliente.java VerCliente: servlet que muestra los datos del contacto del cliente c:javaServlet4-JDBC-ClientesClientesWEB-INFsrcVerCliente.java MostrarClientes: servlet que muestra todos los contactos de clientes de la tabla ‘contactos’ c:javaServlet4-JDBC-ClientesClientesWEB-INFsrcMostrarClientes.java
  • 77. 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.
  • 78. 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).
  • 79. 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
  • 80. 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.
  • 81. 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.
  • 82. 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
  • 83. 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>
  • 84. 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"> …
  • 85. 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>
  • 86. 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 caso 10 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>
  • 87. 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 MySQL value>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
  • 88. 88 Crear un pool de conexiones Copiar el driver JDBC de la base de datos en el directorio TOMCAT_HOMEcommonlib Esto hace que el driver esté disponible para Tomcat Reiniciar Tomcat
  • 89. 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
  • 90. 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:javaServlet5-JDBC-CliPoolCliPoolWEB-INFsrcFormInsertarCliente.java InsertarCliente: servlet que inserta el contacto y envía el resultado de la acción c:javaServlet5-JDBC-CliPoolCliPoolWEB-INFsrcInsertarCliente.java EliminarCliente: servlet que elimina el contacto del cliente y envía el resultado de la acción c:javaServlet5-JDBC-CliPoolCliPoolWEB-INFsrcEliminarCliente.java VerCliente: servlet que muestra los datos del contacto del cliente c:javaServlet5-JDBC-CliPoolCliPoolWEB-INFsrcVerCliente.java MostrarClientes: servlet que muestra todos los contactos de clientes de la tabla ‘contactos’ c:javaServlet5-JDBC-CliPoolCliPoolWEB-INFsrcMostrarClientes.java