Está en la página 1de 27

Bases de Datos

Bases de Datos desde JAVA

MSc Iván Amón Uribe


Coordinador Especialización en Inteligencia de
Negocios
Java DataBase Connectivity (JDBC)

 Java cuenta con un marco de


programación para desarrolladores
llamado JDBC.
 JDBC es una API, formada por conjunto de
clases e interfaces en el lenguaje de
programación Java, para ejecutar
sentencias SQL sobre una base de datos.
 Ofrece un estándar de conexión a
cualquier base de datos disponible en el
mercado.

Universidad de Chile - Departamento de Ciencias de la Computación Enrique Pastene A.


Java DataBase Connectivity (JDBC)

 JDBC ofrece un puente JDBC-ODBC creado para


permitir que los programas Java se conecten con
el software compatible ODBC.

 ODBC: Open DataBase Connectivity es un


estándar de Windows para Bases de Datos, de
forma que un programa corriendo bajo Windows
pueda acceder a BD genéricas.
¿Qué hace JDBC?

 Permite establecer una conexión a una


base de datos.
 Permite enviar sentencias SQL.
 Permite procesar los resultados de estas
sentencias.
 Las clases que permiten esto están en
el paquete java.sql (hay que
importarlo):
import java.sql;

Universidad de Chile - Departamento de Ciencias de la Computación Enrique Pastene A.


Modelos de Acceso a BD

De 2 capas
Cliente
Aplicación  La aplicación "habla" directamente
Java con la base de datos.
JDBC  Controlador JDBC se comunica
Protocolo
con el sistema específico que
BD maneja la base de datos.
 La base de datos puede estar en
DBMS otra máquina, con lo que el cliente
se comunica por red. Esta es la
Servidor BD configuración llamada
cliente/servidor.

Universidad de Chile - Departamento de Ciencias de la Computación Enrique Pastene A.


Modelos de Acceso a BD

Cliente (GUI) De 3 capas


Navegador – Los comandos son enviados a
Web la capa intermedia de
Protocolo HTTP
servicios, la cual envía
sentencias SQL a la base de
datos. Ésta las procesa y
Aplicación Servlets, JSP envía los resultados de vuelta
Java en servidor
WEB
a la capa intermedia, para
JDBC luego ser enviados al cliente.
– Permite un control de acceso
Protocolo BD
y de actualización.
– Provee ventajas de
Servidor performance.
DBMS
BD

Universidad de Chile - Departamento de Ciencias de la Computación Enrique Pastene A.


Interactuando con una BD - Pasos

1. Importar las clases necesarias.


2. Cargar el driver JDBC a utilizar.
3. Crear un objeto del tipo Connection,
encargado de la conexión.
4. Crear un objeto Statement para poder
ejecutar instrucciones.
5. Ejecutar la instrucción.
6. Cerrar los objetos abiertos.
Cargando el Driver

 Primero debe cargarse una clase con el driver de la


base de datos (esto lo provee el vendedor de la DBMS)
Class.forName("DriverXYZ");

 Ejemplos:

Class.forName("com.mysql.jdbc.driver");

Class.forName("oracle.jdbc.driver.OracleDriver");

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

Class.forName("org.postgresql.Driver");

Universidad de Chile - Departamento de Ciencias de la Computación Enrique Pastene A.


Creando la Conexión

 Un objeto "Connection" representa una conexión a


una base de datos.
 La clase "DriverManager" ubica el controlador que
pueda conectarse a la base de datos representada
en la URL.
La url se debe indicar de la siguiente manera :
jdbc:subprotocolo//servidor:puerto/base de datos

Connection con = DriverManager.getConnection

(url, login, password);


Universidad de Chile - Departamento de Ciencias de la Computación Enrique Pastene A.
Ejemplo de Conexión
import java.sql.*;
import com.mysql.jdbc.*;
java.sql.Connection getConnection(String usr, String pass)
{
url = "jdbc:mysql://localhost/test";
driver = "com.mysql.jdbc.Driver";
try {
Class.forName(driver).newInstance();
con = DriverManager.getConnection(url, usr, pass);
return con;
} catch(Exception e2) {
System.err.println("Problems");
return null;
}
}

Universidad de Chile - Departamento de Ciencias de la Computación Enrique Pastene A.


Ejecutando Sentencias SQL

JDBC provee 3 clases:


 "Statement": Este objeto es usado para enviar
sentecias SQL simples. Es creado por el método
"createStatement".
 "PreparedStatement": Este objeto es usado
para sentencias que requieren uno o más
parámetros. La sentencia es precompilada y
guardada para uso futuro.
 "CallableStatement": Es usado para ejecutar
procedimientos almacenados en la base de
datos.

Universidad de Chile - Departamento de Ciencias de la Computación Enrique Pastene A.


La Clase Statement
Connection con = getConnection(…);
Statement stmt= con.createStatement();

En este momento la statement existe pero no


tiene una sentencia SQL para ejecutar. Esta se
puede pasar con los métodos:
 executeUpdate(String) para crear/modificar
tablas (no hay resultados), típicamente para
create, update, delete...
 executeQuery(String) para hacer consultas,
retornan resultados en un objeto de la clase
ResultSet, típicamente para select

Universidad de Chile - Departamento de Ciencias de la Computación Enrique Pastene A.


La Clase Statement – Creación de una tabla

Statement stmt = con.createStatement();


stmt.executeUpdate("... ");

1) stmt.executeUpdate ("CREATE TABLE alumnos " +


"(rol VARCHAR(32) NOT NULL, nombre VARCHAR(32)
NOT NULL," + "carrera VARCHAR(32), PRIMARY KEY
(rol))");

2) stmt.executeUpdate("créate table libros ("+" id


char(20)," + " titulo char(50), " + " autor char(50,) "
+
" editorial char(20)," + " fecha char(8), " +
" primary key(id)) ");

Universidad de Chile - Departamento de Ciencias de la Computación Enrique Pastene A.


La Clase Statement – Inserción de un registro

Statement stmt = con.createStatement();


stmt.executeUpdate ("... ");

1) stmt.executeUpdate( "INSERT INTO alumnos " +


"VALUES ('9821000-0', 'Armando Casas',
'Electrónica')");

2) stmt.executeUpdate(" insert into libros values("


+ "'JA1', 'Java', 'Alvarez', 'ACME', '20060906') ");

Universidad de Chile - Departamento de Ciencias de la Computación Enrique Pastene A.


La Clase Statement – Borrado de un registro

Statement stmt = con.createStatement();


stmt.executeUpdate ("... ");

1) stmt.executeUpdate(
" delete from prestamos where idLibro='JA1' ");
 
2) stmt.executeUpdate(
" delete from libros where idLibro=' " +
idLIbro.getText()+ " ' ");

Universidad de Chile - Departamento de Ciencias de la Computación Enrique Pastene A.


La Clase Statement – Actualizar registros

Statement stmt = con.createStatement();


stmt.executeUpdate ("... ");

1) stmt.executeUpdate(
" update lectores set email= ' rm@hotmail.com ' "
+ " where id= ' 123 ' ");
 
2) stmt.executeUpdate(
" update from prestamos set fecha='20060913' "
+ "where idLibro= ' JA1 ' ");

Universidad de Chile - Departamento de Ciencias de la Computación Enrique Pastene A.


La Clase Statement – Ejecutando consultas
 Los resultados de una consulta se reciben en un
objeto de la clase ResultSet
 ResultSet rs = stmt.executeQuery(....);
 Un ResultSet contiene una colección de filas con los
resultados de la pregunta.
 Existen métodos para recorrer los elementos de esta
enumeración y recuperar los valores de los campos
 Next: avanza un puntero que indica en qué fila
estamos actualmente. Al principio está antes de la
primera fila, por lo cual se hace necesario ejecutar
un next() para situarse en la primera
 getXXX: para obtener la información (donde XXX
es el tipo de datos a recuperar), por ejemplo
getString, getInt, getFloat, …)

Universidad de Chile - Departamento de Ciencias de la Computación Enrique Pastene A.


La Clase Statement – Métodos getXXX

 Se puede usar con 2 tipos de parámetros:


– getXXX(nombre de columna en la tabla")
ejemplo: getString("nombre ")

– getXXX(número de columna en la tabla)


Ejemplo: getString(1)

 getXXX trata de leer lo que hay en la columna y


convertirlo al tipo Java especificado en XXX

Universidad de Chile - Departamento de Ciencias de la Computación Enrique Pastene A.


La Clase Statement – Métodos getXXX

 En ocasiones, si bien el tipo SQL no es el mismo


que el tipo XXX, una conversión es posible sin
problemas (por ejemplo, con getString y
getObject se puede recuperar sin problemas
cualquier cosa).
 En otras, la conversión es posible pero con pérdida
de información o con posible problema de
formateo (ejemplo: getByte para un numeric o un
longvarchar
 Otras, es simplemente imposible (un getLong para
Time) y se lanza una Exception

Universidad de Chile - Departamento de Ciencias de la Computación Enrique Pastene A.


La Clase Statement – Ejemplo consulta

Statement stmt = con.createStatement();


stmt.executeQuery ("... ");

String query = "SELECT rol, nombre FROM alumnos";


String r, n;
ResultSet rs = stmt.executeQuery(query);
while (rs.next())
{
r = rs.getString("rol");
n = rs.getString("nombre");
System.out.println(r + " " + n);
}

Salida : shell> 9821000-0 Armando Casas

Universidad de Chile - Departamento de Ciencias de la Computación Enrique Pastene A.


La Clase Statement – Ejemplo consulta 2
ResultSet r=stmt.executeQuery(
"select * from libros where titulo like '%Java%'");
String mayor="";
while(r.next()){
String fecha=r.getString("fecha");
if (fecha.compareTo(mayor)>0) mayor=fecha;
}
//posicionar antes de primera fila
r.beforeFirst();
//recorrer libros de Java
while(r.next()) {
if( r.getString("fecha").equals(mayor) ) {
System.out.println(
r.getString("id")+r.getString("titulo")); }
}
Universidad de Chile - Departamento de Ciencias de la Computación Enrique Pastene A.
La Clase Prepared Statement

 En lugar de Statement es generalmente posible usar


PreparedStatement para hacer más eficientes y
seguras las consultas.
 Una instrucción con PreparedStatement va a ser, en
la mayoría de los casos, traducida a una consulta
SQL nativa de la base de datos en tiempo de
compilación.
 Otra ventaja es que es posible usar parámetros
dentro de ella, pudiendo hacer más flexibles las
consultas o hacer varias consultas distintas dentro
de un ciclo cambiando el valor de algunas variables .

Universidad de Chile - Departamento de Ciencias de la Computación Enrique Pastene A.


La Clase Prepared Statement

PreparedStatement us =
con.prepareStatement ("update alumnos set
comuna = ? where direccion like = ?");

// Se completan las sentencias, esto es, se “llenan” las ?

us.setString(1,'Santiago')
us.setString(2,'Portugal');

Universidad de Chile - Departamento de Ciencias de la Computación Enrique Pastene A.


La Clase Prepared Statement - Ejemplo
PreparedStatement updateSales;
String updateString =
"update COFFEES set SALES = ? where COF_NAME like ?";
updateSales = con.prepareStatement(updateString);
int [] salesForWeek = {175, 150, 60, 155, 90};
String [] coffees = {"Colombian", "French_Roast",
"Espresso", "Colombian_Decaf", French_Roast_Decaf"};
int len = coffees.length;
for(int i = 0; i < len; i++) {
updateSales.setInt(1,salesForWeek[i]);
updateSales.setString(2, coffees[i]);
updateSales.executeUpdate();
}

Universidad de Chile - Departamento de Ciencias de la Computación Enrique Pastene A.


Usando Procedimientos Almacenados

// Crear el Stored Procedure


String crearSP = "create procedure SHOW_SUPPLIERS"+
" as select SUPPLIERS.SUP_NAME, COFFEES.COF_NAME
from SUPPLIERS, COFFEES "+
"where SUPPLIERS.SUP_ID = COFFEES.SUP_ID"

Statement stmt = con.CreateStatement();


stmt.executeUpdate(createSP);

// Llamar el Stored Procedure


CallableStatement cs;
cs = con.prepareCall("{call SHOW_SUPPLIERS}");
ResultSet rs = cs.executeQuery();
Universidad de Chile - Departamento de Ciencias de la Computación Enrique Pastene A.
Usando Metadatos

• Los metadatos son la información acerca de la


estructura de una Base de Datos o un ResultSet
• Se obtiene con el método getMetaData()
stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(query);
ResultSetMetaData rsmd = rs.getMetaData();
int numberOfColumns = rsmd.getColumnCount();
int rowCount = 1;
while (rs.next()) {
System.out.println("Row " + rowCount + ": ");
for (int i = 1; i <= numberOfColumns; i++) {
System.out.print(" Column " + i + ": ");
System.out.println(rs.getString(i));
}
System.out.println(""); rowCount++;
}

Universidad de Chile - Departamento de Ciencias de la Computación Enrique Pastene A.


Usando Metadatos – Ejemplo 2

// Conocer las tablas de una Base de Datos

DatabaseMetaData dbmd = con.getMetaData();


String dbmsName = dbmd.getDatabaseProductName();
ResultSet rs = dbmd.getTableTypes();
System.out.print
("Tipos de tablas disponibles en " + dbmsName + ": ");

while (rs.next()) {
String tableType = rs.getString("TABLE_TYPE");
System.out.println(" " + tableType);
}

Universidad de Chile - Departamento de Ciencias de la Computación Enrique Pastene A.

También podría gustarte