Publicado el 5 de Octubre del 2020
862 visualizaciones desde el 5 de Octubre del 2020
628,9 KB
25 paginas
Creado hace 13a (16/05/2011)
Federico Peinado
www.federicopeinado.es
Depto. de Ingeniería del Software e
Inteligencia Artificial
disia.fdi.ucm.es
Facultad de Informática
www.fdi.ucm.es
Universidad Complutense de Madrid
www.ucm.es
Base de datos (BBDD)
• Conjunto de información organizada de forma independiente a su
tratamiento y a los detalles de su almacenamiento físico
Modelo de datos
• Estructura lógica de los datos y conjunto de operaciones que
permiten crearlos, consultarlos y modificarlos
• El más utilizado es el relacional (datos organizados en tablas)
Lenguaje de acceso
• El más utilizado es SQL (creación, consulta y modificación de
BBDD relacionales)
Sistema gestor de bases de datos (SGBD)
• Aplicación para crear, mantener y consultar BBDD
• El código de las aplicaciones que usan BBDD no debería depender
de los detalles particulares de los SGBDs
Necesidad de algún API estándar para conectar con SGBDs
Laboratorio de Programación de Sistemas – Acceso a bases de datos
2
Existen muchas, habitualmente cada proveedor de
SGBDs ofrece una propia para acceder a sus BBDD
Protocolos propietarios
• Dependen del proveedor del SGBD
• Dependen del lenguaje de programación que se quiera utilizar
Plataforma Microsoft
• ODBC (Open DataBase Connectivity)
Protocolo de conexión basado en parte del estándar SQL/CLI (API en C)
• OLE/ADO DB
• ADO .NET
• ADO .NET + LINQ
Plataforma Java
• JDBC (Java DataBase Connectivity)
Laboratorio de Programación de Sistemas – Acceso a bases de datos
3
Laboratorio de Programación de Sistemas – Acceso a bases de datos
4
Paquete Java ubicado en java.sql
• Versiones 1.0, 2.0, 3.0 y 4.0
(la actual, ya incluida en el JDK 6)
• Proporciona una pasarela JDBC ODBC
Mecanismos básicos
1. Conectarse a una fuente de datos
Para ello la fuente de datos debe incluir un driver JDBC
(u ODBC, necesitando entonces usar la pasarela)
2. Consultar/cambiar tablas en las BBDD de la fuente
Se usa SQL “embebido” en los parámetros (Strings) de
ciertos métodos definidos en las clases de este paquete
El resultado son objetos Java, definidos en el paquete
Laboratorio de Programación de Sistemas – Acceso a bases de datos
5
Cliente BD Servidor BD BD
• El cliente no necesita saber nada sobre como
funcionan los controladores de BBDD
Programación independiente de la plataforma
• JDBC tiene dos capas
1. API de JDBC
2. API del Administrador de Controladores JDBC
Los distribuidores de BBDD deben construir sus
controladores (drivers) siguiendo los requisitos de
esta segunda API
Laboratorio de Programación de Sistemas – Acceso a bases de datos
6
Debido a su diseño, los programadores
sólo necesitan conocer la capa Java/JDBC
Esquema de comunicación
(entre JDBC y una base de datos)
• Aplicación Java Administrador de
Controladores de JDBC
1. Pasarela JDBC/ODBC Controlador ODBC
Base de datos
2. Controlador JDBC suministrado por el fabricante
Base de datos
Laboratorio de Programación de Sistemas – Acceso a bases de datos
7
Controlador Tipo 1
• Traduce JDBC a ODBC y utiliza el controlador ODBC
para comunicar con la base de datos
• Oracle incluye uno de estos controladores en el JDK:
la pasarela JDBC/ODBC
• Requiere la configuración específica de un
controlador ODBC…
Controlador Tipo 2
• Escrito parcialmente en Java y en código nativo
• Comunica la API del cliente con la base de datos
• Requiere instalación previa de software específico de
la plataforma junto con una librería Java asociada…
Laboratorio de Programación de Sistemas – Acceso a bases de datos
8
Controlador Tipo 3
• Librería cliente de Java puro
• Usa protocolo independiente de la BD para enviar
peticiones al servidor (y luego éste traduce)
Controlador Tipo 4
• Librería de Java puro
• Traduce peticiones JDBC a un protocolo de base
de datos específico
Las distribuidores de bases de datos más
habituales suministran controladores tipo 3 ó
4 con sus productos
• Otras compañías también los desarrollan
• Estudiaremos cómo utilizar los de tipo 1 y 3
Laboratorio de Programación de Sistemas – Acceso a bases de datos
9
Hay varias alternativas, cada una con sus requisitos
Oracle
• Añadir librería con el controlador al proyecto
ojdbc14_g.jar (Oracle Instant Client)
MySQL
• Añadir librería con el controlador al proyecto
mysql-connector-java-xx.jar (MySQL Connector/J)
Access
• Configurar el controlador ODBC para poder acceder a la
base de datos (nombreControlador)
1.
Panel de Control Herramientas administrativas Orígenes de
datos (ODBC) ODBC Data Source Administrator
2. Añadir [Microsoft Access Driver (*.mdb)]
3.
Seleccionar base de datos
Laboratorio de Programación de Sistemas – Acceso a bases de datos
10
En el programa
• Registrar el controlador cargando su clase
System.setProperty(“jdbc.drivers”, driver);
Se pueden registrar varios drivers separados por “:”
Class.forName(String driver)
Registro manual
• Ejemplos
sun.jdbc.odbc.JdbcOdbcDriver
oracle.jdbc.driver.OracleDriver
Laboratorio de Programación de Sistemas – Acceso a bases de datos
11
Para conectar con la base de datos hay que
especificar la fuente de datos mediante una
sintaxis similar a una URL
• jdbc:nombreSubprotocolo:otrosElementos
nombreSubprotocolo selecciona el controlador concreto
otrosElementos depende del subprotocolo
• Ejemplos
jdbc:oracle:thin:@ipServidor:puerto:nombreBD
jdbc:odbc:nombreControlador
Laboratorio de Programación de Sistemas – Acceso a bases de datos
12
ODBC
• Connection conn =
DriverManager.getConnection(String url)
Oracle
• Connection conn = DriverManager.getConnection
(String url, String user, String password)
conn.close()
• Cierra la conexión
• Es necesario cerrar las conexiones una vez que se
han terminado de utilizar para liberar recursos
(tanto en la aplicación como en el servidor)
Laboratorio de Programación de Sistemas – Acceso a bases de datos
13
Usa archivos de configuración (tipo Properties)
• Fichero database.properties
jdbc.drivers, jdbc.url, jdbc.username,
jdbc.password
• Ejemplo Oracle
jdbc.drivers=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@localhost:1521:test
jdbc.username=test
jdbc.password=test
• Ejemplo Access
jdbc.drivers=sun.jdbc.odbc.JdbcOdbcDriver
jdbc.url=jdbc:odbc:TEST
jdbc.username=
jdbc.password=
Laboratorio de Programación de Sistemas – Acceso a bases de datos
14
Primero, hay que crear un objeto Statement
(sentencia SQL)
• Statement stmt = conn.createStatement ();
Después podemos hacer consultas
• ResultSet executeQuery(String sql)
Realiza“select”
Devuelve los registros en un ResultSet
• int executeUpdate(String sql)
Realiza “insert, update, delete, create, drop…”
Devuelve num de registros afectados de o a 1
• boolean execute(String sql)
• El modo “auto-commit” funciona por defecto, es decir, cada
sentencia se ejecuta dentro de una única transacción
Laboratorio de Programación de Sistemas – Acceso a bases de datos
15
java.sql.ResultSet
• Tabla de resultados por filas
• cursor entre filas, inicialmente antes de la primera
• boolean next()
Pasa el cursor a la siguiente fila
false, si se llega al final de la tabla
true, caso contrario
• Tipo getTipo(int numColumna)
• Tipo getTipo(String nombreColumna)
Laboratorio de Programación de Sistemas – Acceso a bases de datos
16
/**
* Tabla "Prueba" con columna "cadena" de tipo VARCHAR.
* Seleccionar las columnas de la tabla prueba
*/
ResultSet rset = stmt.executeQuery ("SELECT * FROM
Prueba");
/**
* Iterar a lo largo de la tabla obtenida,
* imprimiendo las tuplas
*/
while (rset.next ()){
System.out.println (rset.getString (1));
//System.out.println (rset.getString ("cadena"));
}
// Liberación de recursos, tanto ResultSet como Connection
rset.close();
stmt.close();
Laboratorio de Programación de Sistemas – Acceso a bases de datos
17
Información sobre objetos java.sql.ResultSet
• Interfaz java.sql.ResultSetMetaData
getColumCount() numColumnas 1..n
getColumnName(i), getColumTypeName(i)
Información sobre tablas de usuario
DatabaseMetaData dbmd = conn.getMetaData();
// MySQL, Access y HSQLDB
ResultSet rs = dbmd.getTables( null, null,
null, new
String[]{"TABLE"});
// Oracle
ResultSet rs = dbmd.getTables( null,
"NombreUsuario",
null, new
String[]{"TABLE"});
Laboratorio de Programación de Sistemas – Acceso a bases de datos
18
En lugar de construir una sentencia cada vez que el
usuario lanza una consulta, se puede preparar una
vez y usarla muchas veces
• Se gana en rendimiento ya que el servidor puede “cachear”
el plan de ejecución de la consulta
• Se gana en seguridad ya que los drivers habitualmente se
encargan de procesar los parámetros de la consulta
preparada para evitar ataques del tipo “SQL Injection”
String consulta = "SELECT precio FROM libros
WHERE autor = ?";
PreparedStatement stmtCP =
conn.prepareStatement(consulta);
stmtCP.setString(1, "Pepe");
ResultSet rs = stmtCP.executeQuery();
Laboratorio de Programación de Sistemas – Acceso a bases de datos
19
Para moverse hacia adelante y hacia atrás a
través de los datos, e incluso, saltar a una
posición concreta del conjunto de resultados
• Statement stat =
conn.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY)
• ResultSet rs = stat.executeQuery(query);
rs.previous() fila anterior
rs.relative(n) incremento relativo
rs.absolute(n) posición n
int n = rs.getRow() fila actual
Laboratorio de Programación de Sistemas – Acceso a bases de datos
20
Se pueden actualizar los datos obtenidos con
executeQuery
• Statement stat =
conn.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE)
• ResultSet rs = stat.executeQuery(query);
double precio = rs.getDouble("precio");
rs.updateDouble("precio", precio + incr
Comentarios de: LPS: Acceso a Bases de Datos (0)
No hay comentarios