Vous êtes sur la page 1sur 6

27/06/2015

Arquitectura de una aplicación


 Una aplicación Java que realiza accesos a bases de datos
Conexión a una Base de Datos funciona según una arquitectura que permite escribir los
programas abstrayéndose de los detalles de los niveles
inferiores (discos, drivers, sistema operativo, etc.).

 En el nivel superior se encuentran las aplicaciones que


realizamos; estas aplicaciones son interpretadas por la máquina
virtual de Java (JVM).
Curso: Tecnología de la Programación II.
Docente: Mg. Zoraida Yanet Vidal Melgarejo.

CLASE 13

•2

Arquitectura de una aplicación Arquitectura de una aplicación


Aplicación  El sistema operativo proporciona el nivel de entrada/salida, que
interactúa con los dispositivos físicos donde se encuentran las
bases de datos (que pueden ser de diferentes tipos). El sistema
JVM operativo también gestiona el nivel de ODBC (Open Data
Base Conectivity).

Sistema Operativo
 ODBC permite utilizar una interfaz única para los distintos
ODBC tipos de bases de datos, además de proporcionar nombres
lógicos que se relacionan con los nombres físicos que tendrán
los archivos.
Oracle Access MySQL
Figura 1. Niveles
del esquema de
funcionamiento con
bases de datos.

•3 •4

Arquitectura de una aplicación Arquitectura de una aplicación


ResultSet Statement  El “tubo” representa a la clase Connection, que proporciona el
Aplicación Select * from … “medio” para comunicarse con las bases de datos. Según cuál
sea el tipo de la base de datos, los drivers serán diferentes, por
lo que en primer lugar se crea un objeto de tipo DriverManager
JVM y, a través de él, el objeto Connection.

Sistema Operativo
Connection
 Una vez que se dispone de la conexión adecuada, se crea una
ODBC instancia de la clase Statement y se utiliza para definir las
sentencias SQL adecuadas en la aplicación. Estas sentencias
DriverManager SQL proporcionarán, en general, una serie de datos
Oracle Access MySQL provenientes de la base de datos, que se almacenan en una
Figura 2. Arquitectura instancia del objeto ResultSet.
del sistema vista desde el
nivel de aplicación,
usando Java.

•5 •6

1
27/06/2015

(JDBC) Java DataBase Connectivity (JDBC) Java DataBase Connectivity


 JDBC es una API estándar que implementa la estrategia  La API JDBC es una parte integral de la plataforma Java.
universal de acceso a datos de JAVA. Desde J2SE 1.4/J2EE 1.4. se incluye JDBC 3.0.

 La API JDBC provee acceso a bases de datos relacionales  JDBC es usado por aplicaciones de escritorio, applets y
(RDBMS), así como a fuentes de datos tabulares (planillas de servlets.
cálculo). El único requerimiento es disponer del driver JDBC
apropiado.

•7 •8

Pasos para el uso de JDBC para la ejecución de


El API JDBC comandos SQL

JDBC esta presente en el JDK de Java (desde el JDK 1.1).


Cargar/Registrar
 Class.forName(“driver”); 1
el Driver JDBC

 Los paquetes que lo conforman : DriverManager.getConnection(url,user,pwd);


Obtener
2
 java.sql
la Conexión

 javax.sql paquete opcional que se incluye en JDBC 2.0 o conn.createStatement();


conn.prepareStatement(sql); Crear
posterior el Comando
3
conn.prepareCall(sql);

 El código es independiente del gestor que utilizan stmt.executeQuery(); Ejecutar


4
 Portable stmt.executeUpdate(); el Comando
(select)
 Escalable
(create,alter,drop) DDL Procesar
4.1
(insert,update,delete) DML los Resultados

stmt.close();
Liberar Recursos 5
conn.close();
•9 •10

La clase java.sql.DriverManager 1. Cargar


 Provee servicios para administrar un conjunto de drivers  Instrucciones para la carga del driver
JDBC.
Class.forName(“NOMBRE_DRIVER”);
 Permite localizar un JDBC driver cargado en memoria
(mediante el método Class.forName()) y devolver una
conexión a la bd dada por la url. Para cargar el driver de MySQL colocaremos lo siguiente:

 Se usa el método getConnection(url, usuario, contraseña) para Class.forName("com.mysql.jdbc.Driver");


obtener una conexión a la bd, con lo cual se debe conocer su
url JDBC, usuario y contraseña.
 El driver es cargado a memoria y la clase DriverManager lo
 DriverManager es una clase (no una interface) que viene gestiona
con la API, con lo cual, un proveedor de bd no puede
optimizar esta clase.

•11 •12

2
27/06/2015

2. Obtener la Conexión 2. Obtener la Conexión

 Un objeto java.sql.Connection representa una  Una base de datos en JDBC es identificada por una
conexión con una Base de Datos. Sobre una URL (Uniform Resource Locator). Especifica el nombre
conexión pueden ser ejecutadas sentencias SQL y y la ubicación de la BD. La sintáxis recomendada para
obtenerse resultados. la URL JDBC es la siguiente:
jdbc:<subprotocolo>:<subnombre>
 La clase DriverManager provee el método
sobrecargado getConnection, que requiere la URL Class.forName("com.mysql.jdbc.Driver");
JDBC para especificar los detalles de la conexión. String url="jdbc:mysql://localhost:3306/eurekabank";
String user="root";
String password="sa";
Connection cn =
DriverManager.getConnection(url,user,password);

•13 •14

3 y 4 Crear y Ejecutar el Comando 3 y 4 Crear y Ejecutar el Comando


 java.sql.Statement  java.sql.PreparedStatement
 se utiliza el método createStatement de una instancia  se utiliza el método prepareStatement de una instancia
Connection para su creación. Connection para su creación.
 Permite la ejecución de una sentencia SQL, sus métodos  Extiende Statement para añadir sentencias precompiladas
principales son: SQL, que compila la sentencia SQL la primera vez. estas
executeQuery son llamadas más de una vez en el programa.
 Sentencias SELECT que devuelve un java.sql.ResultSet  Soporta parámetros de entrada: setInt, setFloat, setLong,
executeUpdate setString
 Sentencias INSERT, DELETE, UPDATE, CREATE, que
devuelve un entero
execute
 Sentencias desconocidas en tiempo de compilación o
sentencias que devuelven resultados complejos, devuelve
true/false.

•15 •16

3 y 4 Crear y Ejecutar el Comando 4.1 Procesar los Resultados


 java.sql.CallableStatement java.sql.ResultSet
 se utiliza el método prepareCall de una instancia  Los objetos ResultSet permiten recoger los resultados de la
Connection para su creación. ejecución de sentencias SQL; estos resultados
 Extiende la funcionalidad de PreparedStatement, permite
la invocación de procedimientos almacenados, si el proporcionan un número variable de columnas y de filas. En
manejador los soporta. definitiva, un ResultSet es un contenedor tabular de tamaño
variable.

 Cada objeto de tipo ResultSet contiene un cursor que


inicialmente se encuentra situado en la posición anterior a
la primera fila de la tabla. Existe una serie de métodos que
permiten mover el cursor a lo largo de la tabla.

•17 •18

3
27/06/2015

4.1 Procesar los Resultados 4.1 Procesar los Resultados


beforeFirst() isBeforeFirst()
DNI Nombre Apellido Edad DNI Nombre Apellido Edad
first() isFirst()
1 53033776 Pedro Rodríguez 18 1 53033776 Pedro Rodríguez 18
previous() 84609876 Ana Moreno 35 relative(-1) 2 84609876 Ana Moreno 35 relative(-1)
Cursor 34216533 Carmen Delgado 12 Cursor 34216533 Carmen Delgado 12
next() 83421438 Jorge Castillo 25 83421438 Jorge Castillo 25
last() isLast()

afterLast() getString(…) getInt(…) isAfterLast()

 Todos los métodos señalados devuelven un valor de tipo boolean,


que indica si el movimiento del cursor ha sido posible. Hay que  Una vez situado el cursor en la posición deseada, se dispone de
tener en cuenta que, por defecto, los objetos ResultSet una gran cantidad de métodos para conocer su posición (isXxx),
únicamente pueden ser recorridos incrementalmente, y que
consultar el valor de los atributos (getXxxx) o modificar los
además no son actualizables (no se pueden modificar sus
atributos). mismos (updateXxxx).

•19 •20

4.1 Procesar los Resultados 5. Liberar Recursos


java.sql.ResultSet  Las clases:
 Connection
 Tanto los métodos update como los métodos get están
 Statement, PreparedStatement,CallableStatement
sobrecargados para admitir dos tipos de argumentos: el
 ResultSet
nombre de la columna o la posición de la columna: de esta proveen el método close(), que activa la realización de
manera se dispone, por ejemplo, de un método getInt(String la instancia específica, que liberan todos los recursos
NombreColumna), y de otro método getInt(int IndiceColumna). JDBC que se ejecutan sobre el servidor de datos.
Las columnas se numeran empezando por 1.
 Se puede acceder a los datos de las columnas en cualquier  Cuando se invoca el método close() de un Statement,
orden por índice de posición o nombre del campo. En el los ResultSet asociados son cerrados
RecordSet de ejemplo, se produce el mismo resultado con automáticamente.
los siguientes métodos: getString(“Nombre”) y getString(2).
 El método next() sirve para avanzar una fila  La invocación al método close() de Connection, puede
provocar un SQLException si esta ya está cerrada.
 El método wasNull() indica si el campo contiene valores
nulos.
•21 •22

Cargar el Driver Conexión con la Base de Datos


public static void cargarDriver() { try {
try { String url="jdbc:mysql://localhost:3306/eurekabank";
Class.forName("com.mysql.jdbc.Driver"); String user="root";
} catch(ClassNotFoundException e) { String password=“sa";
System.out.println( "Error no se puede cargar el driver:“ + cn = DriverManager.getConnection(url, user, password);
e.getMessage()); } catch(SQLException e) {
} JOptionPane.showMessageDialog(null,
} "Error no se puede establecer la conexión“ +
e.getMessage());
}

•23 •24

4
27/06/2015

Insertar un Registro Consultar un Registro (1)


Se leen los datos : idproducto, descripcion, precio y stock y luego: // leemos el id del producto a buscar
try {
String sql="insert into producto(idproducto,descripcion,precio,stock) System.out.print("Id del Producto : ");
values (?,?,?,?)"; idproducto=br.readLine();
PreparedStatement ps=cn.prepareStatement(sql); try {
ps.setString(1,idproducto); String sql = "select * from producto where idproducto=?";
ps.setString(2,descripcion); PreparedStatement ps= cn.prepareStatement(sql);
ps.setDouble(3, precio); ps.setString(1, idproducto);
ps.setInt(4, stock); ResultSet rs = ps.executeQuery();
ps.executeUpdate();
} catch(SQLException e) {
JOptionPane.showMessageDialog(null,"Error en SQL "+e.getMessage());
}

•25 •26

Consultar un Registro (2) Eliminar un Registro


if(rs.next()) { System.out.print("Id del Producto : ");
descripcion=rs.getString(2); idproducto=br.readLine();
precio=rs.getDouble(3); try {
stock=rs.getInt(4); String sql = "delete from producto where idproducto=?";
System.out.println("Descripcion : "+descripcion); PreparedStatement ps= cn.prepareStatement(sql);
System.out.println("Precio : "+precio); ps.setString(1, idproducto);
System.out.println("Stock : "+stock); int nro=ps.executeUpdate();
} else if(nro>0)
System.out.println("el idproducto no existe"); System.out.println("Se elimino el registro ");
} catch(SQLException e) { else
System.out.println("Error en SQL "+e.getMessage()); System.out.println("no existe el id ");
} } catch(SQLException e) {
System.out.println("Error en SQL "+e.getMessage());
}

•27 •28

Actualizar un Registro (1) Actualizar un Registro (2)


System.out.print("Id del Producto a actualizar: "); sql="update producto set descripcion=?, precio=?, stock = ? where
idproducto=br.readLine(); idproducto=?";
try { ps=cn.prepareStatement(sql);
String sql = "select * from producto where idproducto=?"; ps.setString(1,descripcion);
PreparedStatement ps= cn.prepareStatement(sql); ps.setDouble(2, precio);
ps.setString(1, idproducto); ps.setInt(3, stock);
ResultSet rs = ps.executeQuery(); ps.setString(4,idproducto);
if(rs.next()) { ps.executeUpdate();
System.out.println("Nueva Descripcion : "); System.out.println("Se actualizo el producto");
descripcion=br.readLine(); } else
System.out.println("Nuevo precio : "); System.out.println("El idproducto no existe");
precio=Double.parseDouble(br.readLine()); } catch(SQLException e) {
System.out.println("Nuevo stock : "); System.out.println("Error en SQL "+e.getMessage());
stock=Integer.parseInt(br.readLine()); }

•29 •30

5
27/06/2015

Mostrar todos los Registros Resumen


try{  La clase DriverManager provee acceso a drivers JDBC
String sql = "select * from producto"; registrados y permite obtener conexiones (Connection) a una
PreparedStatement ps = cn.prepareStatement(sql); fuente de datos con el método getConnection.
ResultSet rs = ps.executeQuery();
 La clase Connection representa una sesión sobre una base de
while(rs.next()) {
datos y es usada para crear Comandos (Statement).
idproducto=rs.getString(1);
descripcion=rs.getString(2);  La clase Statement y sus derivados permiten la ejecución de
precio=rs.getDouble(3); comandos SQL ya sean DDL o DML, tanto para la
stock=rs.getInt(4); recuperación y actualización de datos.
System.out.println(idproducto+", "+descripcion+", "+precio+", "+stock);
 La clase ResultSet contiene los datos resultantes de una
}
consulta de selección, mantiene el cursor a una fila de datos.
} catch(SQLException e) {
El método next permite desplazarse a la siguiente fila. Los
JOptionPane.showMessageDialog(null,"Error en SQL "+e.getMessage()); métodos getXXX retornan el valor de las columnas de la fila
} actual, dado un índice o un nombre.

•31 •32

Vous aimerez peut-être aussi