Download Cap8JDBC - DCC - Universidad de Chile

Document related concepts
no text concepts found
Transcript
Módulo ECI - 11: Fundamentos de Redes de Computadores
Java Database Connectivity 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 (externa).
Ofrece un estándar de conexión a cualquier base
de datos disponible en el mercado.
Permite obtener los datos en forma fácil y
cómoda en ambientes cliente-servidor a través de
Internet/Intranet.
Universidad de Chile - Tupper 2007, Santiago - Fono/Fax: (56 2) 698 8427 - Email: hthiemer @ cec.uchile.cl
Módulo ECI - 11: Fundamentos de Redes de Computadores
¿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)
Universidad de Chile - Tupper 2007, Santiago - Fono/Fax: (56 2) 698 8427 - Email: hthiemer @ cec.uchile.cl
Módulo ECI - 11: Fundamentos de Redes de Computadores
Modelos de acceso a BD
 De 2 capas
Cliente
 La aplicación “habla” directamente con
Aplicación
la base de datos.
Java
 Controlador JDBC se comunica con el
JDBC
sistema específico que maneja la base de
datos.
Protocolo
BD
 La base de datos puede estar en otra
máquina, con lo que el cliente se
DBMS
comunica por red. Esta es la
configuración llamada cliente/servidor.
Servidor BD
3
Universidad de Chile - Tupper 2007, Santiago - Fono/Fax: (56 2) 698 8427 - Email: hthiemer @ cec.uchile.cl
Módulo ECI - 11: Fundamentos de Redes de Computadores
Modelos de acceso a BD
Cliente
(GUI)
 De 3 capas
 Los comandos son enviados a la capa
intermedia de servicios, la cual envía
Llamadas HTTP,
RMI,CORBA
sentencias SQL a la base de datos. Ésta
Aplicación Servlets las procesa y envía los resultados de
vuelta a la capa intermedia, para luego
JSP
Java
ser enviados al cliente.
EJB
JDBC
 Permite un control de acceso y de
Protocolo
actualización.
BD
 Provee ventajas de performance.
Applet en Java o
Navegador HTML
DBMS
Servidor
BD
4
Universidad de Chile - Tupper 2007, Santiago - Fono/Fax: (56 2) 698 8427 - Email: hthiemer @ cec.uchile.cl
Módulo ECI - 11: Fundamentos de Redes de Computadores
Arquitectura JDBC
 Hay 4 formas distintas de establecer una conexión
entre un programa java y una base de datos
 Usando la ODBC (creado por microsoft para brindar una
API estándar para comunicarse con bases de datos en una
plataforma windows
 Usando un driver JDBC que se comunica con un driver
desarrollado por la compañía que desarrollo el DBMS (que
puede estar en cualquier lenguaje)
 Lo mismo, pero con el driver desarrollado por la compañía
en java
 Lo mismo, pero el driver desarrollado por la compañía se
comunica con uno “nativo” y este con la base de datos
5
Universidad de Chile - Tupper 2007, Santiago - Fono/Fax: (56 2) 698 8427 - Email: hthiemer @ cec.uchile.cl
Módulo ECI - 11: Fundamentos de Redes de Computadores
Arquitectura JDBC
Programa
Java
API
JDBC
Base de Datos
Punete
JDBCODBC
Api del
proveedor
En el cliente
Driver
JDBC
Driver
Servidor
JDBC
En elservidor
6
Universidad de Chile - Tupper 2007, Santiago - Fono/Fax: (56 2) 698 8427 - Email: hthiemer @ cec.uchile.cl
Módulo ECI - 11: Fundamentos de Redes de Computadores
Categorías de los controladores JDBC
Puente JDBC-ODBC.
Parte API Nativa-Parte Java. Se convierte las
llamadas JDBC al sistema de la Base de datos.
JDBC-Red. Es sólo Java. Las llamadas JDBC son
convertidas a un protocolo de red independiente
del sistema de la base de datos. Este protocolo es
convertido en un servidor
Protocolo Nativo. Es sólo Java. Se usa un
protocolo de red con la BD.
7
Universidad de Chile - Tupper 2007, Santiago - Fono/Fax: (56 2) 698 8427 - Email: hthiemer @ cec.uchile.cl
Módulo ECI - 11: Fundamentos de Redes de Computadores
Cargando el Driver
Es necesario primero cargar una clase con el
driver de la base de datos (esto lo provee el
vendedor de la DBMS)
Ejemplo:
Class c =
Class.forName(“com.informix.jdbc.IfxDriver");
Calss.forName(“com.novell.sql.LDAPDriver”);
Class.forName("com.mysql.jdbc.Driver");
Esto es particular según la base de datos que
se usa
Luego hay que crear una instancia de la clase
c.newInstance();
8
Universidad de Chile - Tupper 2007, Santiago - Fono/Fax: (56 2) 698 8427 - Email: hthiemer @ cec.uchile.cl
Módulo ECI - 11: Fundamentos de Redes de Computadores
Estableciendo la Conexión
Connection con = DriverManager.getConnection (
url,"login", "password");
En los ejemplos omitiremos login y
password
Un objeto “Connection” representa una
conexión a una base de datos.
La clase “DriverManager” intenta ubicar
el controlador que pueda conectarse a la
base de datos representada en la URL.
9
Universidad de Chile - Tupper 2007, Santiago - Fono/Fax: (56 2) 698 8427 - Email: hthiemer @ cec.uchile.cl
Módulo ECI - 11: Fundamentos de Redes de Computadores
Conexión
Ejemplos de URL:
 jdbc:mysql://localhost/test (para ejemplos)
 jdbc:oracle://oraserver
 jdbc:odbc:mydatabase
 jdbc:informixsqli://hostname:port/dbname:INFORMIXSER
VER=serverName (para las bases CGE)
 jdbc:ldap://server;baseDN=baseDN;useClearte
xt=true
10
Universidad de Chile - Tupper 2007, Santiago - Fono/Fax: (56 2) 698 8427 - Email: hthiemer @ cec.uchile.cl
Módulo ECI - 11: Fundamentos de Redes de Computadores
...Conexión
Sintáxis de una URL JDBC:
 jdbc:<subprotocolo>:<subnombre>
 <subprotocolo> es el nombre del controlador o
del mecanismo de conexión. Ejemplo: odbc.
 <subnombre> es la identificación de la base de
datos. El formato varia según el controlador
especificado. Ejemplo: //servidor:puerto/bd y
parámetros
11
Universidad de Chile - Tupper 2007, Santiago - Fono/Fax: (56 2) 698 8427 - Email: hthiemer @ cec.uchile.cl
Módulo ECI - 11: Fundamentos de Redes de Computadores
Enviando sentencias SQL
JDBC permite enviar cualquier tipo de
sentencia SQL. Aunque ésta fuera
dependiente de la base de datos sólo se
correría el riesgo de incompatibilidad al
cambiar de base de datos.
12
Universidad de Chile - Tupper 2007, Santiago - Fono/Fax: (56 2) 698 8427 - Email: hthiemer @ cec.uchile.cl
Módulo ECI - 11: Fundamentos de Redes de Computadores
...Enviando 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.
13
Universidad de Chile - Tupper 2007, Santiago - Fono/Fax: (56 2) 698 8427 - Email: hthiemer @ cec.uchile.cl
Módulo ECI - 11: Fundamentos de Redes de Computadores
La clase Statement
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), usada 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
14
Universidad de Chile - Tupper 2007, Santiago - Fono/Fax: (56 2) 698 8427 - Email: hthiemer @ cec.uchile.cl
Módulo ECI - 11: Fundamentos de Redes de Computadores
Ejemplos de excuteUpdate
 stmt.executeUpdate(“create table alumno
(nombre varchar(32), matricula integer,
direccion varchar(40), añonac integer,
...);
 stmt.executeUpdate(“insert into alumnos
(‘Valeria Valencia ’, 00998852678,
‘Calle bonita 223 Vitacura Stgo’, 1974,
...);
 stmt.executeUpdate(“update alumnos set
direccion = ‘?????’ where nombre =
‘Valeria Valencia’ ”);
15
Universidad de Chile - Tupper 2007, Santiago - Fono/Fax: (56 2) 698 8427 - Email: hthiemer @ cec.uchile.cl
Módulo ECI - 11: Fundamentos de Redes de Computadores
Ejemplos de excuteUpdate
• CreateCoffees: crea tabla Coffees en base de datos
test
• CreateSuppliers: igual pero tabla Suppliers
• DropCoffees: Borra ambas tablas
• MyConnection: encapsula la conexión a la base de
datos (para usarla en los otros programas)
• InsertCoffees: inserta filas en la tabla
• InsertSupliers: inserta filas en la tabla
• InsertCoffeesDatos: inserta filas a partir de datos
leidos desde un archivo
• ListCoffes, ListSuppliers: muestran el contenido
(usan executeQuery)
16
Universidad de Chile - Tupper 2007, Santiago - Fono/Fax: (56 2) 698 8427 - Email: hthiemer @ cec.uchile.cl
Módulo ECI - 11: Fundamentos de Redes de Computadores
Retorno de excuteUpdate
• El método excuteUpdate retorna un valor entero
correspondiente al número de filas que la sentencia
SQL modificó
• Si se trataba de una creación de tablas el valor de
retorno es 0
• Si se trata de insertar una fila el valor es 1
• El resultado es interesante cuando se usa en una
sentencia SQL con la instrucción “update tabla set
campo = <expresión> where <condicion>
17
Universidad de Chile - Tupper 2007, Santiago - Fono/Fax: (56 2) 698 8427 - Email: hthiemer @ cec.uchile.cl
Módulo ECI - 11: Fundamentos de Redes de Computadores
Ejemplos de excuteQuery
 stmt.executeQuery(“select * from
alumnos “ + “where añonac = 1974”);
Los resultados de una consulta se reciben en un
objeto de la clase ResultSet
ResultSet rs = stmt.executeQuery(....);
Un ResultSet se puede ver como una enumeración
de filas que representan el resultado
Existen métodos adecuados para recorrer los
elementos de esta enumeración y recuperar los
valores de las columnas (campos)
18
Universidad de Chile - Tupper 2007, Santiago - Fono/Fax: (56 2) 698 8427 - Email: hthiemer @ cec.uchile.cl
Módulo ECI - 11: Fundamentos de Redes de Computadores
El ResultSet
ResultSet rs = stmt.executeQuery(“select
nombre where direccion like Santiago”);
while (rs.next()) {
String s = rs.getString(“nombre”);
int y = rs.getInt(“año”);
System.out.println(s+”
“+y);
}
 ResultSet rs contiene una colección de filas con los
resultados de la pregunta. La instrucción 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 primera19
Universidad de Chile - Tupper 2007, Santiago - Fono/Fax: (56 2) 698 8427 - Email: hthiemer @ cec.uchile.cl
Módulo ECI - 11: Fundamentos de Redes de Computadores
La instrucción getXXX
Se puede usar con 2 tipos de parámetros:
 getXXX(“nombre de columna en la tabla”) ej
getString(“nombre”)
 getXXX(número de columna en la tabla) ej
getString(1)
getXXX trata de leer lo que hay en la
columna y convertirlo al tipo Java
especificado en XXX
20
Universidad de Chile - Tupper 2007, Santiago - Fono/Fax: (56 2) 698 8427 - Email: hthiemer @ cec.uchile.cl
Módulo ECI - 11: Fundamentos de Redes de Computadores
La instrucción getXXX
Hay veces en que 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)
Otras, en que la conversión es posible pero con
pérdida de información o con posible problema
de formateo (ej getByte para un numeric o un
longvarchar
Otras, es simplemente imposible (un getLong
para Time)
21
Universidad de Chile - Tupper 2007, Santiago - Fono/Fax: (56 2) 698 8427 - Email: hthiemer @ cec.uchile.cl
Módulo ECI - 11: Fundamentos de Redes de Computadores
Prepared Statements
 Donde se ha usado Satement es generalmente posible usar
PreparedStatement para hacer más eficientes 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
 La 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
 PreparedStatement us =
con.prepareSatatement(“update alumnos set
comuna = ? where direccion like = ?);
 us.setString(1,’Vitacura’)
us.setString(2,’Hualtatas’);
22
Universidad de Chile - Tupper 2007, Santiago - Fono/Fax: (56 2) 698 8427 - Email: hthiemer @ cec.uchile.cl
Módulo ECI - 11: Fundamentos de Redes de Computadores
Prepared Statements: 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();
}
23
Universidad de Chile - Tupper 2007, Santiago - Fono/Fax: (56 2) 698 8427 - Email: hthiemer @ cec.uchile.cl
Módulo ECI - 11: Fundamentos de Redes de Computadores
Transacciones
Una transacción consiste en una o más
sentencias que han sido ejecutadas y luego
confirmadas (commit) o deshechas (rolled
back)
Auto-commit está preseteado.
Si Auto-commit está desactivado se debe
usar los métodos “commit” o “rollback”
explícitamente.
24
Universidad de Chile - Tupper 2007, Santiago - Fono/Fax: (56 2) 698 8427 - Email: hthiemer @ cec.uchile.cl
Módulo ECI - 11: Fundamentos de Redes de Computadores
Transacciones
Para hacer uso de transacciones debe
primero dessetearse elauto-commit
 con.setAutoCommit(false)
 PreparedStatement ps = .....
 ....
 ps.executeUpdate() ....
 ps.excecuteUpdate() ...
 con.commit();
25
Universidad de Chile - Tupper 2007, Santiago - Fono/Fax: (56 2) 698 8427 - Email: hthiemer @ cec.uchile.cl
Módulo ECI - 11: Fundamentos de Redes de Computadores
Stored Procedures
Es un grupo de sentencias SQL que se agrupan
lógicamente en una unidad para efectuar una
determinada tarea
Existen en la mayoría de los DBMS pero son
dependientes de estas (no es muy estándar la
forma cómo se escriben/ejecutan)
Generalmente reciben parámetros
Se “escriben” con un Update y se ejecutan con un
Query
26
Universidad de Chile - Tupper 2007, Santiago - Fono/Fax: (56 2) 698 8427 - Email: hthiemer @ cec.uchile.cl
Módulo ECI - 11: Fundamentos de Redes de Computadores
Un ejemplo
Para crear el Stored Procedure
String crearSP = “create prodcedure 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.executeQuery(createSP);
Para llamar el Stored Procedure
CallableStatement cs;
cs = con.prepareCall(“{call SHOW_SUPPLIERS}”);
ResultSet rs = cs.executeQuery();
27
Universidad de Chile - Tupper 2007, Santiago - Fono/Fax: (56 2) 698 8427 - Email: hthiemer @ cec.uchile.cl
Módulo ECI - 11: Fundamentos de Redes de Computadores
Usando los 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++;
}
28
Universidad de Chile - Tupper 2007, Santiago - Fono/Fax: (56 2) 698 8427 - Email: hthiemer @ cec.uchile.cl
Módulo ECI - 11: Fundamentos de Redes de Computadores
Usando los metadatos
 Ejemplo para conocer las tablas de una Base de Datos
DatabaseMetaData dbmd = con.getMetaData();
String dbmsName = dbmd.getDatabaseProductName();
ResultSet rs = dbmd.getTableTypes();
System.out.print("The following types of tables are ");
System.out.println("available in " + dbmsName + ": ");
while (rs.next()) {
String tableType = rs.getString("TABLE_TYPE");
System.out.println("
" + tableType);
}
29
Universidad de Chile - Tupper 2007, Santiago - Fono/Fax: (56 2) 698 8427 - Email: hthiemer @ cec.uchile.cl