Actualizado el 22 de Diciembre del 2019 (Publicado el 7 de Marzo del 2019)
1.506 visualizaciones desde el 7 de Marzo del 2019
108,6 KB
12 paginas
Creado hace 11a (20/05/2013)
Acceso a bases de datos con JDBC
Aplicaciones Web/Sistemas Web
Juan Pavón Mestras
Dep. Ingeniería del Software e Inteligencia Artificial
Facultad de Informática
Universidad Complutense Madrid
Material bajo licencia Creative Commons, Juan Pavón 2013
JDBC
Java Database Connectivity
API Java para conectar las aplicaciones a bases de datos
Arquitectura modular
• La misma interfaz para distintos tipos de bases de datos
• Implementa un gestor de drivers de bases de datos
Aplicación Java
JDBC API (aplicación)
JDBC
Driver
MySQL
Driver
Oracle
Driver
Sybase
Driver
DB2
JDBC API (controlador)
MySQL
Oracle
Sybase
DB2
Juan Pavón - UCM 2012-13
JDBC
2
Paquete java.sql
Uso de controladores de las BD
Clase DriverManager
• Permite establecer y gestionar conexiones a las BD
Clase SQLPermission
• Proporciona los permisos para poder usar el DriverManager a código
en ejecución dentro de un Security Manager (por ejemplo applets)
Interfaz Driver
• Metodos para registrar y conectar controladores basados en
tecnología JDBC
Clase DriverPropertyInfo
• Propiedades de un controlador
Excepciones
SQLException
SQLWarning
Juan Pavón - UCM 2012-13
JDBC
Paquete java.sql
Interfaz con la aplicación
Envío de instrucciones SQL a la BD
• Connection
• Métodos para crear instrucciones y para gestionar conexiones y sus
propiedades
• Statement
• Permite enviar instrucciones a la BD
• PreparedStatement
• Permite usar instrucciones preparadas o SQL básicas
• CallableStatement
• Llamada a procedimientos almacenados en la BD
• Savepoint
• Puntos de recuperación en una transacción
Recuperación de los resultados de la consulta a la BD
• ResultSet
• Conjunto de resultados que se devuelven de una query
• ResultSetMetaData
• Información sobre las columnas del objeto ResultSet
Juan Pavón - UCM 2012-13
JDBC
3
4
Paquete java.sql
Interfaz con la aplicación
Correspondencia de tipos SQL con clases e interfaces de Java
• Array SQL ARRAY
• Blob SQL BLOB
• Clob SQL CLOB
• Date SQL DATE
• NClob SQL NCLOB
• Ref SQL REF
• RowId SQL ROWID
• Struct SQL STRUCT
• SQLXML SQL XML
• Time SQL TIME
• Timestamp SQL TIMESTAMP
• Clase Types constantes para tipos SQL
Correspondencia de tipos SQL definidos por el usuario a Java
• SQLData
• SQLInput
• SQLOutput
Juan Pavón - UCM 2012-13
JDBC
Correspondencia de tipos SQL Java
boolean
Types.BIT
byte
Types.TINYINT
short
Types.SMALLINT
int
Types.INTEGER
long
Types.BIGINT
double
Types.FLOAT
float
Types.REAL
double
Types.DOUBLE
java.math.BigDecimal
Types.NUMERIC
java.math.BigDecimal
Types.DECIMAL
java.lang.String
Types.CHAR
Types.VARCHAR
java.lang.String
Types.LONGVARCHAR java.lang.String
Types.DATE
Types.TIM
Types.BINARY
Types.VARBINARY
java.sql.Date
java.sql.Time
byte []
byte []
Juan Pavón - UCM 2012-13
JDBC
5
6
Paquete java.sql
Interfaz con la aplicación
Para obtener información de la BD (metadatos)
• DatabaseMetaData
• Información sobre la BD
try {
DatabaseMetaData infoBD= conexion.getMetaData();
System.out.println("Base de datos: " + infoBD.getDatabaseProductName());
System.out.println("Version: " + infoBD.getDatabaseProductVersion());
} catch (Exception ex) {
// Tratar el error
}
Juan Pavón - UCM 2012-13
JDBC
Programación con JDBC
Secuencia normal:
Establecer la conexión con la BD
• Cargar controladores (si se usa una versión de Java inferior a la 6)
• Establecer la conexión
Crear un objeto Statement para hacer petición a la BD
• Asociar una sentencia SQL al objeto Statement
• Proporcionar valores de los parámetros
• Ejecutar el objeto Statement
Procesar los resultados
Liberar recursos (cerrar la conexión)
Si es necesario, se pueden ejecutar varias instrucciones dentro
de una transacción (propiedades ACID)
Abrir transacción
• Crear y ejecutar instrucciones
• Procesar resultados
Cerrar transacción
Juan Pavón - UCM 2012-13
JDBC
7
8
Establecimiento de conexión con la BD
Registrar un controlador
Los DriverManager se encargan de gestionar la conexión y todas las
comunicaciones con la BD
Necesitan conocer los controladores específicos para las BD que se
vayan a utilizar
Registro de un controlador para MySQL
Utilizar el controlador MySQL Connector/J
Disponible en: http://dev.mysql.com/downloads/connector/j
• Cómo instalarlo:
http://dev.mysql.com/doc/refman/5.7/en/connector-j-installing.html
El controlador se puede registran con el Class loader de Java
La clase a cargar viene dada en la documentación del controlador
try {
Class.forName("com.mysql.jdbc.Driver").newInstance();
} catch (Exception ex) {
// Tratar el error
}
Juan Pavón - UCM 2012-13
JDBC
9
Establecimiento de conexión con la BD
Los controladores se identifican con un URL JDBC de la forma
jdbc:subprotocolo:localizadorBD
• El subprotocolo indica el tipo de base de datos específico
• El localizador permite referenciar de forma única una BD
• Host y opcionalmente puerto
• Nombre de la base de datos
La conexión a la BD se hace con el método getConnection()
public static Connection getConnection(String url)
public static Connection getConnection(String url, String user, String
password)
public static Connection getConnection(String url, Properties info)
• Todos pueden lanzar la excepción SQLException
try {
conexion = DriverManager.getConnection(
"jdbc:mysql://localhost/tienda","pruebas", "pruebas");
} catch (SQLException ex) {
// Tratar el error
}
Juan Pavón - UCM 2012-13
JDBC
10
Crear y ejecutar operaciones en la BD
Statement
Encapsula las instrucciones SQL a la BD
Se crea a partir de la conexión
instruccion = conexion.createStatement();
Métodos
• executeQuery(String sql)
• Ejecución de consultas: SELECT
• Devuelve un objeto ResultSet
• executeUpdate(String sql)
• Modificaciones en la BD: INSERT, UPDATE, DELETE
• Devuelve el número de columnas afectadas
• execute(String sql)
• Ejecución de instrucciones que pueden devolver varios conjuntos de
resultados
• Requiere usar luego getResultSet() o getUpdateCount() para recuperar los
resultados, y getMoreResults() para ver los siguientes resultados
Juan Pavón - UCM 2012-13
JDBC
11
Crear y ejecutar operaciones en la BD
ResultSet
Encapsula el conjunto de resultados
Para obtener el valor de cada campo hay que usar el método
getX("campo") correspondiente al tipo del valor SQL:
• getInt
• getLong
• getFloat
• getDouble
• getBignum
• getBoolean
• getString
• getString
• getDate
• getTime
• getTimesstamp TIME STAMP
• getObject
INTEGER
BIG INT
REAL
FLOAT
DECIMAL
BIT
VARCHAR
CHAR
DATE
TIME
cualquier otro tipo
Para pasar al siguiente registro se usa el método next()
• Devuelve false cuando no hay más registros
Juan Pavón - UCM 2012-13
JDBC
12
Crear y ejecutar operaciones en la BD
Ejemplo (se usa la BD tienda del tema de PHP y MySQL)
try {
Statement instruccion = conexion.createStatement();
String query = "SELECT * FROM clientes WHERE nombre LIKE \"Empresa%\"";
ResultSet resultados = instruccion.executeQuery(query);
System.out.println("Listado de clientes: ");
while (resultados.next()) {
System.out.println("Cliente "+resultados.getString("nif")
+", Nombre: "+resultados.getString("nombre")
+", Teléfono: " +resultados.getString("telefono") );
}
} catch (Exception ex) {
e.printStackTrace();
}
Juan Pavón - UCM 2012-13
JDBC
13
Crear y ejecutar operaciones en la BD
ResultSet
Por defecto solo se puede recorrer hacia delante
Se pueden prever otras formas de utilizarlo al crear el objeto
Statement:
createStatement(int resultSetType, int resultSetConcurrency)
• resultSetType:
• TYPE_FORWARD_ONLY: sólo hacia delante con next()
• TYPE_SCROLL_INSENSITIVE: métodos de posicionamiento habilitados
• TYPE_SCROLL_SENSITIVE: métodos de posicionamiento habilitados pero
sensible a las operaciones que se puedan hacer a los datos del ResultSet
• Movimiento hacia atrás: afterLast(), previous()
• Posicionamiento absoluto: first(), last(), absolute(numFila)
• Posicionamiento relativo: relative(num)
Recupera fila actual: getRow()
• resultSetConcurrency
• ResultSet.CONCUR_READ_ONLY: El objeto ResultSet no se puede modificar
• ResultSet.CONCUR_UPDATABLE: El objeto ResultSet se puede modificar
Juan Pavón - UCM 2012-13
JDBC
14
Crear y ejecutar operaciones en la BD
ResultSetMetaData
Permite obtener información sobre un ResultSet: metadatos
try {
Statement instruccion = conexion.createStatement();
String query = "SELECT * FROM clientes";
ResultSet resultados = instruccion.executeQuery(query);
ResultSetMetaData infoResultados = resultados.getMetaData();
int col = infoResultados.getColumnCount();
System.out.println("Estructura de la tabla clientes: ");
for (int i = 1; i <= col; i++) {
System.out.println("Campo " + infoResultados.getColumnLabel(i) + "\t"
+"Tipo: " + infoResultados.getColumnTypeName(i));
}
} catch (Exception ex) {
e.printStackTrace();
}
Juan Pavón - UCM 2012-13
JDBC
15
Crear y ejecutar operaciones en la BD
Se pueden consultar de forma genérica los resultados sin conocer
su estructura previamente
try {
Statement instruccion = conexion.createStatement();
String query = "SELECT * FROM clientes";
ResultSet resultados = instruccion.executeQuery(query);
ResultSetMetaData infoResultados = resultados.getMetaData();
int col = infoResultados.getColumnCount();
while (resultados.next()) {
for (int i = 1; i <= col; i++)
System.out.print(resultados.getString(i) + "\t");
System.out.println("");
}
} catch (Exception ex) {
e.printStackTrace();
}
Juan Pavón - UCM 2012-13
JDBC
16
Instrucciones preparadas
PreparedStatement
Cuando se van a ejecutar instrucciones repetidamente, se puede
precompilar en la BD y ganar eficiencia
Primero se define el modelo de instrucción preparada
PreparedStatement ps =
conexion.prepareStatement("INSERT INTO clientes VALUES (?,?,?,?) ");
Comentarios de: Acceso a bases de datos con JDBC - Aplicaciones Web/Sistemas Web (0)
No hay comentarios