07 conexion a_datos

24
Prof. Renny Batista Lenguaje Java 1 Conexión a bases de datos (JDBC) Conexión a bases de datos (JDBC)

Upload: instituto-universitario-de-tecnologia-antonio-jose-de-sucre

Post on 12-Jun-2015

756 views

Category:

Education


6 download

TRANSCRIPT

Page 1: 07 conexion a_datos

Prof. Renny Batista Lenguaje Java 1

Conexión a bases de datos (JDBC) Conexión a bases de datos (JDBC)

Page 2: 07 conexion a_datos

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.

Page 3: 07 conexion a_datos

Prof. Renny Batista Lenguaje Java 3

JDBC (Java DataBase Connectivity)

Page 4: 07 conexion a_datos

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.

Page 5: 07 conexion a_datos

Prof. Renny Batista Lenguaje Java 5

java.sql

Clases e interfaces de java vinculadas con java.sql

Page 6: 07 conexion a_datos

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

Page 7: 07 conexion a_datos

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……

Page 8: 07 conexion a_datos

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……

Page 9: 07 conexion a_datos

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.

Page 10: 07 conexion a_datos

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.

Page 11: 07 conexion a_datos

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

Page 12: 07 conexion a_datos

Prof. Renny Batista Lenguaje Java 12

Aplicación java con JDBC

Page 13: 07 conexion a_datos

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>

Page 14: 07 conexion a_datos

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…)

Page 15: 07 conexion a_datos

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.

Page 16: 07 conexion a_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..

Page 17: 07 conexion a_datos

Prof. Renny Batista Lenguaje Java 17

Tratar el resultado (Métodos del getXXX)

Page 18: 07 conexion a_datos

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);

}...

Page 19: 07 conexion a_datos

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

Page 20: 07 conexion a_datos

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());

}

Page 21: 07 conexion a_datos

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.

Page 22: 07 conexion a_datos

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(); 

}

}

Page 23: 07 conexion a_datos

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

Page 24: 07 conexion a_datos

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”);