Download Tema III. JDBC
Document related concepts
no text concepts found
Transcript
Tema 3 J2EE Java Database Connectivity Temas Selectos de Cómputo Grupo 912 JDBC • Java Database Connectivity es el servicio e interfases de programación para manipular bases de datos relacionales por medio del lenguaje de programación Java. • Para programar JDBC se necesita de clases proveedoras que realizan la conexión y manipulación del acceso a la base de datos. • El manejador de JDBC es proporcionado por el fabricante de bases de datos. Es común encontrar manejadores (drivers) JDBC para Oracle, MS SQL Server, Sybase, MySQL, Postgres, Informix, DB2. • La interfase de programación de aplicaciones (API) está definido en el paquete java.sql. DriverManager – Realiza la gestión de la conexión a la base de datos Estructuras de clases JDBC <<package>> java.sql DriverManager <<interface>> Statement <<interface>> Connection <<interface>> <<interface>> PreparedStatement ResultSet <<interface>> SQLException CallableStatement Se debe importar el paquete java.sql Connection – Configura la conexión a la base de datos; y permite crear objetos/sentencias SQL que son ejecutadas en el RDMBS Statement – Dada una sentencia SQL en forma de cadenas de caracteres, permite ejecutar consultas, inserciones, modificaciones, borrado; o instrucciones propia del RDBMS PreparedStatement – Permite manipular sentencias SQL por medio de parámetros y permite precompilar las instrucciones que se envían al manejador CallableStatement – Permite invocar a procedimientos almacenados ResultSet – Objeto que permite manipular en memoriar el resultado de una consulta, recorriendo renglones y sus columnas SQLException – Excepción disparada ante cualquier error del RDBMS Cargar al JDBC Driver • Cargar el Driver JDBC, cargando dinámicamente la clase que lo implementa //para conexión a HSQLDB Class.forName("org.hsqldb.jdbcDriver“); //para conexión a MySQL Class.forName(“com.mysql.jdbc.Driver“); //para conexión a Oracle Class.forName(“ oracle.jdbc.OracleDriver “); //para conexión a PostgreSQL Class.forName(“ org.postgresql.Driver”); //para conexión con ODBC Class.forName(“ sun.jdbc.odb.JdbcOdbcDriver”); • Cada driver es distinto, por base de datos • El Driver JDBC debe estar en la ruta de clases (CLASSPATH) Java Conectarse a la Base de datos • Por medio del método estático getConnection() de la clase DriverManager, se realiza la conexión a la base de datos. • Se debe proporcionar el URL de conexión a la base de datos. //Conexion a HSQLDB Connection c=DriverManager.getConnection(“jdbc:hsqldb:hsql://localhost/bookstore“,”sa”,””); //Conexión a MySQL Connection c=DriverManager.getConnection(“jdbc:mysql://localhost/bookstore“,”jim”,”s3cr3t”); //Conexión a PostgresSQL Connection c=DriverManager.getConnection(“jdbc:postgresql://localhost/mydatabase”,”myuser”,”secret”); //Conexión a Oracle Connection c=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:mydb“,”scott”,”tiger”); • Adicional, debe proporcionarse el usuario y password. • Toda conexión, debe cerrarse al concluir el procesamiento, por medio del método close() c.close(); Realizar un consulta SQL • Se utiliza la clase Statement; y los objetos de este tipo se obtienen por medio de createStatement final String query= "SELECT * FROM AUTHORS"; Statement stmt=this.conexion.createStatement(); ResultSet result=stmt.executeQuery(query); • Se puede utilizar la clase PreparedStatement; y los objetos de este tipo se obtienen por medio de prepareStatement final String query="SELECT * FROM TITLES WHERE ISBN=?"; PreparedStatement pstmt=this.conexion.prepareStatement(query); pstmt.setString(1,isbn); ResultSet result=pstmt.executeQuery(); Procesar los resultados de una consulta SQL • • • • • • Tanto Statement y PreparedStatement, al realizar consultas SQL, retornan un objeto de tipo ResultSet ResultSet contiene de 0 a más renglones que el resultado de la consulta Cada renglón contiene una o mas columnas Se puede recorrer al objeto ResultSet, por medio del método next(), que retorna false cuando no hay mas renglones. El resultado se puede almancenar en un arreglo, o en estructuras de datos List, Map o Set. Por ejemplo, el siguiente código guarda cada columna de un renglon en una estructura Map, y dicho Map se agrega a una estructrua List while (result.next()){ Integer id= new Integer(result.getInt(cols[0])); String firstname= result.getString(cols[1]); String lastname= result.getString(cols[2]); HashMap data= new HashMap(); data.put(cols[0],id); data.put(cols[1],firstname); data.put(cols[2],lastname); list.add(data); } • Al concluir el procesamiento, se debe cerrar al objeto ResultSet; y al objeto Statement o PreparedStatement result.close(); stmt.close(); Inserción, Modificación y Borrado • • • Para insertar, modificar o borrar se debe utilizar el método executeUpdate. En el caso de PreparedStatement, se puede hacer asi: Inserción final String query="INSERT INTO AUTHORS(AUTHORID,FIRSTNAME,LASTNAME) VALUES(?,?,?)"; PreparedStatement pstmt=this.conexion.prepareStatement(query); pstmt.setInt(1,id); pstmt.setString(2,firstName); pstmt.setString(3,lastName); int inserted= pstmt.executeUpdate(); • Modificación final String query="UPDATE AUTHORS SET FIRSTNAME= ?,LASTNAME=? WHERE AUTHORID=?"; PreparedStatement pstmt=this.conexion.prepareStatement(query); pstmt.setString(1,firstName); pstmt.setString(2,lastName); pstmt.setInt(3,id); int updated= pstmt.executeUpdate(); • Borrado final String query="DELETE FROM AUTHORS WHERE AUTHORID=?"; PreparedStatement pstmt=this.conexion.prepareStatement(query); pstmt.setInt(1,id); int deleted= pstmt.executeUpdate(); • El método executeUpdate retorna el número de elementos modfiicados Manejo de transacciones • Una transacción es una unidad lógica de trabajo que debe ser completada o abortada; y no acepta estados intermedios. • Una transacción a la base de datos consistente en la combinación de operaciones insert, update, delete; o cualquiera que altere a los datos. • Por omisión, cada operación realizada al RDBMS es aplicada como una transacción. • Se puede dermarcar un conjunto de transacciones, utilizando JDBC. Se debe apagar la opción de autoCommit y al concluir las operaciones, realizar un commit o rollback connection.setAutoCommit(false); //realizar múltiples operaciones insert, update, delete if (exito) connection.commit(); else connection.rollback();