Documente Academic
Documente Profesional
Documente Cultură
Libro 1:
Ttulo: Fundamentos de bases de datos con Java.
Autores: Varios
Ao de publicacin: 2001
Editorial en espaol: Ediciones Anaya Multimedia (Grupo
Anaya, S.A.)
Editorial original: Wrox
Libro 2:
Ttulo: Java 6.
Autor: Felipe Daz Lima
Ao de publicacin: 2010
Editorial en espaol: Ediciones Anaya Multimedia (Grupo
Anaya, S.A.)
Captulo 1: Introduccin
Cuando se trabaja con Java y se necesita trabajar con bases de datos,
se puede hacer a travs de la API JDBC. Este mecanismo o interfaz,
proporciona muchos objetos de Java para enviar datos entre las clases
Java y la BD. Aqu se conocern las clases e interfaces ms importantes
de JDBC.
Podra decirse que JDBC en Java es anlogamente igual a ADO.NET en
.NET.
1.1
Persistencia en Java
Ejemplos:
Envi de la salida de un programa a un archivo del disco o a una
conexin de red con otro ordenador. Cuando definimos clases,
solo ser necesario que esas clases implementen el interfaz
java.io.Serializable
c. Bases de datos relacionales
Es un conjunto de objetos, de entidades. Estos objetos controlan
la forma en la que se almacenan y gestionan los datos.
1.2
SQL
1.3
EJB
Las Enterprise Java Beans o EJBs, ofrecen otra forma de acceder a
la informacin de una base de datos en un entorno corporativo. Las
EJBs son un importante componente de Java2 Enterprise Edition.
Los dos tipos principales son:
Session beans:
Interactan con el usuario, reciben sus peticiones y devuelven
lo que pidi o envan la peticin a otra bean para acte.
Entity beans:
Se emplean para interactuar con la base de datos. Existen dos
implementaciones de entitybeans:
Container-ManagedPersistence (CMP)
Bean-managedPersistence (BMP)
Captulo 2: JDBC
El objetivo de este captulo en adelante es mostrar a grandes rasgos
que es y cmo funciona el API JDBC as como la forma de emplearlo para
conectar Java con bases de datos relaciones.
En este captulo, aprenderemos a conectarnos con una base de datos
mediante JDBC, a obtener informacin de una tabla de una base de
datos e incluso la forma de incluir sencillos mecanismos de control de
errores en el cdigo. Los puntos que se trataran son los siguientes:
Las distintas versiones de JDBC y las caractersticas principales de
cada uno.
Como cargar una clase Driver y registrarla con DriverManager.
Como realizar una conexin con base de datos Cloudscape y
Oracle con el mtodo getConnection().
Enviar una consulta a la base de datos con el objeto Statement.
Recibir los datos de la base de datos con un objeto Resultset
Como obtener metadatos de la base de datos con el mtodo
getMetaData().
Como reunir todos estos elementos en un sencillo programa para
obtener datos de columnas seleccionadas de una tabla de la base
de datos y tambin como obtener todos los datos de la tabla.
Tcnicas bsicas de gestin de errores en el cdigo JDBC.
2.1 SQL y JDBC
La librera o el API JDBC est implementada en el paquete java.sql y
javax.sql. Es decir en esos paquetes radican el conjunto de clases e
interfaces relacionadas a JDBC.
JDBC
Sybase
Oracle
SQL Server
...
Figura 2.1: Como es que interacta una aplicacin Java con su API
JDBC y finalmente con las bases de datos.
2.2
2.3
Versiones de JDBC
a. JDBC 1.x
b. JDBC 2.0 ao 2001
Con esta versin, el API se ofrece en dos partes:
El ncleo del API JDBC 2.0, implementado en el paquete
java.sql, que se incluye con java 2 SDK Standard Edition.
El paquete opcional del API JDBC 2.0, implementado en el
paquete javax.sql o que esta como parte del Java 2 SDK
Enterprise Edition.
El ncleo del API JDBC 2.0
Las nuevas caractersticas de JDBC 2.0 se pueden dividir en dos
categoras: nuevas capacidades y soporte para tipos de datos
avanzados. Las nuevas capacidades incluyen:
2.4
jdbc:<subprotocol>:<subname>
jdbc: Indica el protocolo. Adems indica que el URL
se refiere a un origen de datos JDBC.
<subprotocol> Identifica al motor de BD como SQL
Server, Oracle, MySQL. Adems identifica el driver JDBC
a usar.
<subname> Identifica la BD.
Por ejemplo:
String sourceURL =
"jdbc:sqlserver://localhost:1433;databaseName=BD_X;
<subprotocol> En este caso es SQL Server. Si
trabajamos con un driver Oracle, el subprotocol ser
Oracle.
<subname> Le dice al driver que la BD est ubicada
en el localhost por el puerto 1433y se llama BD_X
El contenido de la variable sourceURL se puede obtener como se
ve en la figura 2.7.
La mayora de los mtodos JDBC gestionan los errores lanzando
una
excepcin
del
tipo
SQLException.
El
mtodo
getConnection() hace exactamente esto por eso lo metemos
siempre en un bloque try y catch. En general todos los mtodos
definidos por JDBC, al hacer uso de ellos deben de estar dentro de
un bloque try e incluir una sentencia catch para una
SQLException.
Para ver cmo sera una conexin a Oracle, ver el mtodo
obtenerConexionOracle(), de la clase Conexin del paquete
ConexinTest en el aplicativo Sistema_MusicStore_JDBC.
Nota:
Podramos tener declarada una sentencia SQL como por
ejemplo un INSERT y en la parte de VALUES colocar valores
entre comillas simples y comillas dobles.
Comillas simples indican que le estoy ingresando un valor de
cadena de caracteres. En cuanto a las comillas dobles no
forman parte de la sentencia SQL por tanto no se envan a la
BD. (Captulo 9, pag. 316 del libro de BD con Java)
El objeto ResultSet encapsula los datos devueltos por una
consulta, adems contiene un cursor o puntero que puede
manipularse para acceder a cualquier fila del resultado. El mtodo
next() del objeto ResultSet desplazar el cursor a la prxima
posicin. El cursor es vlido hasta que el objeto Statement se
cierre.
Adems los mtodos next() y previous() devuelven el valor
true si el movimiento les lleva a una fila vlida, y false si se
salen de la tabla, condiciones que se pueden controlar en un bucle
while. Se podra procesar todas las filas de un ResultSet con el
siguiente bucle:
While (objResultSet.next())
{
// procesar los datos de la fila
}
El objResultSet empieza con su cursor una fila antes del
comienzo de la tabla. Tambien podemos usar los mtodos
isLast() o isFirst() para comprobar si ha llegado al final o al
comienzo de los resultados.
Acceder a datos en un ResultSet
getFoat()
getTime()
getString()
getDouble()
getShort()
getBigDecimal()
En resmen:
Las clases e interfaces Connection, Statement y ResultSet son
los componentes de JDBC que usaremos con mayor frecuencia.
DriverManager
+registerDriver(Driver)
Registrado
+getConnection(String)
+getConnection(String,
Properties)
+getConnection(String,String,St
ring)
cre
+getDriver(String)
+setLoginTimeout(int)
+setLoginTimeout()
+setLogWriter(PrintWriter)
+getLogWriter()
+println()
<<misc>>
Concrete
Connection
Implements
Connection
+close()
+commit()
+createStatement()
+roolback()
+setAutoCommit(boole
an)
<<misc>>
3.2
Conexiones
preparedStatement
4.1
4.2
Utilizar un RowSet
4.3
4.4
4.6
Como vemos ambas sentencias SQL son las mismas y ambas insertan
datos en las mismas columnas en la misma tabla. Lo que cambia tan
solo es el valor del dato que se inserta (vemos que el valor para las
columnas Id_TipoTienda y Ciudad no cambian). Sin embargo, cada vez
que un nuevo dato es insertado, el cdigo enviar la sentencia SQL
completa a la BD en donde esta sentencia es procesada y ejecutada. Si
(?, ?, ?, ?)
// 1 2 3 4
Los signos de pregunta se les denominan placeholder que representan
los datos que sern asignados ms tarde (variables en la BD). Los
nmeros que estn debajo son los ndices de cada placeholder
Las sentencias preparadas son el mtodo preferido de ejecucin de
consultas SQL cuando usan valores que introducen los usuarios.
El cdigo necesario para crear una PreparedStatement con las
sentencias SQL insert anteriormente descritas quedara de la siguiente
manera:
String comandoSQL = "INSERT INTO Tienda"
+ "(Descripcion, Id_TipoTienda,Direccion,Ciudad)"
+ "VALUES"
+ "(?, ?, ?, ?)";
PreparedStatement pst = objConexion.prepareStatement(comandoSQL);
Notas:
Tener en cuenta que tambin puedo usar PreparedStatement si
necesito usar select * From
Los valores de los datos se pueden asignar en cualquier orden,
siempre que obtengamos el ndice correcto.
Estamos obligados a asignar todos los parmetros antes de
ejecutar el cdigo SQL, de lo contrario se lanzar una
SQLException.
Si deseamos asignar un valor null para algn placeholder, haremos
uso de uno de los mtodos setNull() que aparece en la figura 5.2.
En algunas ocasiones y para algunos motores de BD, es necesario
establecer el parmetro useServerPrepStmts = true. Esto sera de
la siguiente manera:
Connection conexion = DriverManager.getConnection
("jdbc:mysql://servidor/basedatos?useServerPrepStmts=true",
"usuario", "password");
Una vez que asignamos un valor para un placeholder, ese valor
permanece asignado para ese placeholder hasta que el cdigo cambie
ese valor explcitamente. Por tanto mientras usemos la misma sentencia
preparada, no tenemos que estar asignando valor al mismo placeholder
cada vez que queramos ejecutar la misma sentencia SQL. Solo se asigna
valor al placeholder la primera vez.
Para cambiar el valor del placeholder, hacemos una llamada a uno de
los mtodos setXXX() otra vez con el ndice apropiado:
pst.setString(4,"Chiclayo");
pst.executeUpdate();
// En algn sitio ms alejado del cdigo:
pst.executeUpdate(); // Parmetro 6 ya fue asignado y es Chiclayo.
//En algn sitio ms alejado del cdigo, necesitamos insertar
//otra ciudad:
pst.setString(4,"Puno");
Como vemos para ejecutar la sentencia SQL hacemos uso del mtodo
executeUpdate(). Es decir, podemos hacer uso de los mismos
mtodos que al ejecutar un Statement as como podemos usar
tambin executeQuery() y execute(). Pero en este caso ya no se
toma como argumento la query ya que no necesita ser enviada con uno
de esos 3 mtodos ya que ya fue enviada a la BD con la llamada al
mtodo prepareStatement(). Si hacemos lo contrario a esto se
lanzar una SQLException.
En resmen:
Cuando hay que ejecutar varias veces la misma instruccin SQL con
valores diferentes, las instrucciones preparadas suelen ejecutarse
mucho ms rpido dado que estn precompiladas. Por tanto Las
sentencias preparadas aportan mejor eficacia de nuestra aplicacin
JDBC.
Ejemplo de uso:
PreparedStatement pstmt = objCon.preparedStatement(comandoSQL);
pstmt.setString(1,"C-9732");
pstmt.setString(2,"Navacerrada");
pstmt.setInt(3,1200);
pstmt.executeUpdate();
pstmt.setString(1,"C-9733");
pstmt.executeUpdate();
Procedimientos almacenados
PrepareCall (
String sql,
int resultSetType,
int resultSetConcurrency )
PrepareCall (
String sql,
int resultSetType,
Descripcin
Crea
un
objeto
CallableStatement para el sql
dado. Si el CallableStatement
devuelve un objeto ResultSet,
el ResultSet tiene un tipo
forward
only,
no
es
actualizable y no es holdable.
Crea
un
objeto
CallableStatement para el sql
dado. Si el CallableStatement
devuelve un ResultSet, el
ResultSet
tiene
el
tipo
ResultSet dado y concurrencia
y no es holdable.
Crea
un
objeto
CallableStatement para el sql
int resultSetConcurrency,
int resultSetHoldability )
dado. Si el CallableStatement
devuelve un ResultSet, el
ResultSet
tiene
el
tipo
ResultSet dado, concurrencia y
holdability.
(int
parameterIndex,
int
(int
parameterIndex,
int
6.3
7.1
API JDBC
Gestor de drivers JDBC Objeto DataSource
Driver JDBC
7.2
DataSources
import javax.sql.*;
import com.microsoft.sqlserver.jdbc.SQLServerDataSource
La ltima importacin la brinda el fabricante del driver y es
necesaria para crear una instancia especfica de DataSource.
Del lado del cliente, este solo necesita los paquetes java.sql y
javax.sql. Cuando el cliente busca el DataSource, la variable que
referencia a ese objeto es una variable tipo DataSource aunque el
objeto real sea una clase especfica cmo SQLServerDataSource.
Es algo similar al uso de:
List<Cliente> listaDeClientes;
listaDeClientes = new ArrayList<Cliente>();
En el ejemplo, la variable listaDeClientes hace referencia a un
objeto de tipo List aunque el objeto real sea una clase especifica
como ArrayList.
Tipos de DataSource
Existen 3 formas de implementar un DataSource:
a. Implementacin bsica:
Produce un objeto DataSource bsico, estndar, que
implementar la interfaz javax.sql.DataSource.
Una implementacin bsica de DataSource produce objetos
Connection que no se usan en un pool ni en una transaccin
distribuida.
Esta es la forma ms costosa en trminos de procesamiento, ya
que los objetos Connection deben establecerse desde cero cada
vez y se utilizan en entornos de una sola capa en los que la
aplicacin y la base de datos no estn separados.
b. Implementacin de pool de conexin (Connection pooling
implementation):
Produce un objeto Connection que participar automticamente
en un pool de conexin.
Adems, una clase DataSource con soporte a pool de
conexiones permite reutilizar los objetos Connection, ofreciendo
por tanto un mejor rendimiento. Este tipo de DataSource
implementar la interfaz javax.sql.ConnectionPoolDataSource
Figura 7.2
7.3
PENDIENTES
Diseo de BD:
Revisar reglas normalizacin. Ver pag 176.
Repasar temas importantes de la pag. 324 a 330 y documentar
si fuera necesario.
Dejar indicado y con corta referencia acerca de los movimientos
a travs de un resultset de la pag. 330 a 336. Documentar.
Revisar de pag. 437 y hacer ejemplo de 439. Revisar explicacin
de 440 a 442. (SP con metadatos.)
Ver ms ejemplos de aplicacin con batch().
Libro Java 6:
Falta revisar el uso de factory segn la pg. 109, 110, 111, 112.