07 conexion a_datos
TRANSCRIPT
Prof. Renny Batista Lenguaje Java 1
Conexión a bases de datos (JDBC) Conexión a bases de datos (JDBC)
Prof. Renny Batista Lenguaje Java 2
JDBC (Java DataBase Conectivito)
Protocolo para utilizar bases de datos relacionales desde Java.
Se basa en la utilización de drivers que implementan un API predefinido.
Una vez seleccionado el driver el resto del código es independiente del SGBD.
Prof. Renny Batista Lenguaje Java 3
JDBC (Java DataBase Connectivity)
Prof. Renny Batista Lenguaje Java 4
Paquetes Java para JDBC
Existen dos paquetes para JDBC
java.sqljavax.sql (más avanzado)
La mayor parte de las aplicaciones sólo requieren java.sql.
Prof. Renny Batista Lenguaje Java 5
java.sql
Clases e interfaces de java vinculadas con java.sql
Prof. Renny Batista Lenguaje Java 6
¿Cómo comunicar Java con un Gestor de Bases de Datos?
Hay que conocer:
Archivo que contiene el driver (jar/zip) (debe estar incluido en el CLASSPATH de la aplicación)Nombre de la clase driver de JavaURL de conexiónEstos valores dependen de cada SGBD, e incluso del driver concreto
Prof. Renny Batista Lenguaje Java 7
¿Cómo comunicar Java con un Gestor de Bases de Datos?
En Eclipse clic derecho sobre la carpeta que contiene el proyecto en Java, luego clic sobre la opción BuildBuild PathPath y en el submenú seleccionar Configure Configure BuildBuild PathPath……
Prof. Renny Batista Lenguaje Java 8
¿Cómo comunicar Java con un Gestor de Bases de Datos?
En la ventana emergente hacer clic en la pestaña LibrariesLibraries y a continuación en el botón AddAdd External External JARsJARs……
Prof. Renny Batista Lenguaje Java 9
¿Cómo comunicar Java con un Gestor de Bases de Datos?
En la ventana JarJar SelectionSelection ubicamos la carpeta donde se encuentra el archivo .jar o .zip que contiene el driverdriver, seleccione el archivo y haga clic en el botón abrirabrir.
Prof. Renny Batista Lenguaje Java 10
¿Cómo comunicar Java con un Gestor de Bases de Datos?
En el panel central de la ventana aparece la librería que se acaba de seleccionar. Sólo basta con hacer clic en el botón OK.
Prof. Renny Batista Lenguaje Java 11
Algunos driver JDBC
MySqlClase Driver : com.mysql.jdbc.DriverURL de Conexión: jdbc:mysql://<host>/<database>Fichero .jar/.zip: mysql-connector-java-5.0.4-bin.jar
OracleClase Driver : oracle.jdbc.driver.OracleDriverURL de Conexión: jdbc:oracle:thin:@ <host>:<port>:<sid>Fichero .jar/.zip: classes12.zip
SQLServerClase Driver : com.microsoft.jdbc.sqlserver.SQLServerDriverURL de Conexión: jdbc:microsoft:sqlserver://localhost:1433Fichero .jar/.zip: mssqlserver.jar, msbase.jar, msutil.jar
PostgreSQLClase Driver: org.postgresql.DriverURL de Conexión: jdbc:postgresql://<server>:<port>/<database>Fichero .jar/.zip: postgresql.jar
Prof. Renny Batista Lenguaje Java 12
Aplicación java con JDBC
Prof. Renny Batista Lenguaje Java 13
Cargar el driver y obtener la conexión (ejemplo)
Connection connection = null;Statement statement = null;ResultSet resultSet = null;try{
String driverClassName = "com.mysql.jdbc.Driver";String driverUrl = "jdbc:mysql://localhost/barcos";String user = "admin";String password = "1234";Class.forName(driverClassName);connection=DriverManager.getConnection(driverUrl,user,password);...
Si se produce una excepción debe comprobarse que el archivo existe y está en el CLASSPATH.La forma general de la conexión para MySQL es:
jdbc:mysql://<host>/<database>
Prof. Renny Batista Lenguaje Java 14
Ejecutar la sentencia (ejemplo)
Statement statement = null;ResultSet resultSet = null;try
{. . .
statement = (Statement) connection.createStatement();String query = "SELECT * FROM empleados;";resultSet = statement.executeQuery(query);
La sentencia depende del “dialecto” SQL del SGBD.La sentencia puede ser cualquier válida en SQL del SGBD (Insert, Delete, Create Table…)
Prof. Renny Batista Lenguaje Java 15
Ejecutar la sentencia
ResultSet executeQuery()Ejecuta una sentencia de tipo SELECT, INSERT, DELETE o UPDATE devuelve un objeto ResultSet con los resultados de la consulta.
int executeUpdate()Ejecuta una sentencia de tipo INSERT, DELETE O UPDATE, devuelve el número de registros insertados, borrados o actualizados.
boolean execute()Para la ejecución de procesos almacenados en la bases de datos.
Prof. Renny Batista Lenguaje Java 16
Tratar el resultado
El resultado de ejecutar un SELECT se devuelve en un objeto de tipo ResultSet.Métodos de la interfaz ResultSet:
next(): se utiliza para iterar por las filas del ResultSet (la primera llamada nos posiciona en la primera fila de los resultados)getXXX(s): devuelve el valor dentro de una fila, especificado por s (índice o nombre de la columna de la tabla).boolean isFirst(): devuelve true si el cursor apunta al primer registro.boolean isBeforeFirst(): Devuelve true si el cursor está situado antes del primer registro.boolean isLast(): devuelve true si el cursor esta apuntado al último registro.boolean isAfterLast(): devuelve true si el cursor se encuentra después del último registro.int getRow(): devuelve la posición del registro actual, siendo “1” la posición del primer registro..
Prof. Renny Batista Lenguaje Java 17
Tratar el resultado (Métodos del getXXX)
Prof. Renny Batista Lenguaje Java 18
Tratar el resultado (Ejemplo)
.
.
.ResultSet resultSet = null;try {
.
.
.
while (resultSet.next()) {// una forma de obtener una columna: por posiciónString nombre = resultSet.getString(1);// otra forma de obtener una columna: por su nombreDate fecha = resultSet.getDate("fecha");System.out.println("Nombre: " + nombre+ "| Fecha: "+fecha);
}...
Prof. Renny Batista Lenguaje Java 19
Manejo de los Errores
Se pueden producir errores por:Fallo en la conexión.No existe la base de datos o no se tienen permisos sobre ella.Error de sintaxis en la sentencia SQL.Operación no permitida.
Se producirá una excepción en el programa
Prof. Renny Batista Lenguaje Java 20
Manejo de los Errores
try {
// las fases o etapas descritas anteriormente
} catch (ClassNotFoundException e) {
System.out.println("No se encuentra el driver");
} catch (SQLException E) {
System.out.println("Excepcion SQL: "+E.getMessage());
System.out.println("Estado SQL: "+E.getSQLState());
System.out.println("Código del Error: "+E.getErrorCode());
}
Prof. Renny Batista Lenguaje Java 21
Liberar Recursos y cerrar la conexión
Aunque no se llame a Connection.close, cuando la conexión sea eliminada por el garbage collector, el método finalize de la clase que implementa Connection, invocará al método close.
Cuando se cierra una conexión, cierra todos sus Statementsasociados.Cuando se cierra un Statement, cierra todos sus ResultSetsasociados.
Se debe tener precaución al cerrar las conexiones en una aplicación multi-thread que solicita muchas conexiones por minuto (Ej.: una aplicación Internet).Puede haber bugs en algunos drivers, de manera que no cierren los Statements asociados a una conexión o los ResultSets asociados a un Statement.Es importante cerrar las conexiones tan pronto como se pueda.
Prof. Renny Batista Lenguaje Java 22
Manejo de los Errores
try {
// las fases o etapas descritas anteriormente
} catch
finally {
try {
if (resultSet != null) resultSet.close();
if (statement != null) statement.close();
if (connection != null) connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
Prof. Renny Batista Lenguaje Java 23
La interfaz PreparedStatement
Cada vez que se envía una query a la BD, ésta:
La analiza sintácticamente.
Construye un plan para ejecutarla.
Si tenemos un bucle en el que repetidamente se lanza la misma query con distintos parámetros es ineficiente usando Statement.
En este tipo de situaciones, es mejor usar PreparedStatement.
Con PreparedStatement:
Sólo se hace el análisis sintáctico una vez.
Se hace un único plan de ejecución
Mejor eficiencia con respecto a Statement
Prof. Renny Batista Lenguaje Java 24
PreparedStatement (Ejemplos)
PreparedStatement stmt = null;
String sql = "DELETE FROM clientes WHERE (clienteID = ? ) "; //Eliminación
stmt = conn.prepareStatement(sql); //conn es una conexión válida
stmt.setString(1, var_cliente_ID);
PreparedStatement stmt = null;
String sql = "SELECT * FROM Customer"; //Consulta
stmt = conn.prepareStatement(sql); //conn es una conexión válida
PreparedStatement stmt = null;
String sql = "INSERT INTO CUSTOMER (empresa_id, clienteID, nombre, apellido)
"+"VALUES (?, ?, ?, ?)"; // Inserción
stmt = conn.prepareStatement(sql);
stmt.setString(1, “0002”);
stmt.setString(2, “0010”);
stmt.setString(3, “Juan”);
stmt.setString(4, “Pérez”);