Download PROGRAMACIÓN CON ACCESO A DATOS
Document related concepts
no text concepts found
Transcript
PROGRAMACIÓN CON ACCESO A DATOS Parte 3 CARRERAS TÉCNICAS 2005 Universitario Autónomo del Sur Programación con Acceso a Datos IUAS Contenido 1. Capítulo 5: Acceso a Bases de Datos a. Introducción b. El paquete java.sql c. Consultas de selección sobre una Base de Datos d. Consultas de actualización sobre una Base de Datos e. Ejercicios Capítulo 5 – Acceso a Bases de Datos Introducción En este capítulo vamos a estudiar la manera en la cual podemos hacer que nuestros programas escritos en Java accedan a datos almacenados en una base de datos. Para ello, existe en Java un mecanismo conocido como JDBC (Java DataBase Connectivity) que nos permite utilizar un conjunto de interfaces predefinidas que debemos utilizar a efectos de poder acceder a datos contenidos en bases de datos de diferentes DBMS (manejadores de bases de datos). Recordemos que una interface en Java es un tipo especial de clase que sólo contiene cabezales de métodos que luego han de ser implementados por otras clases. Cada fabricante de un DBMS se encarga de proveer su propia implementación para las interfaces definidas por JDBC. De este modo, si nosotros deseamos que nuestro programa Java interactúe con, por ejemplo, una base de datos MySql, debemos obtener del fabricante de MySql las clases que implementan las interfaces dadas por JDBC e incorporarlas al conjunto de clases de nuestra aplicación. Típicamente, dichas clases vienen empaquetadas todas juntas en un archivo zippeado con una extensión propia de Java, denominada .jar. Este mecanismo de interacción con bases de datos es muy bueno en el sentido de que nos permite cambiar de DBMS con mucha facilidad. Dado que todos ellos deben implementar las mismas interfaces de JDBC, si el día de mañana deseamos que el mismo programa en Java acceda a datos almacenados en un DBMS diferente, lo único que debemos hacer es sustituir las clases implementadas por el viejo DBMS por sus equivalentes en el nuevo DBMS. En este curso, vamos a utilizar Microsoft Access como el DBMS elegido. No obstante, tener presente que podríamos llegar a utilizar cualquier otro DBMS sin tener que modificar el código de nuestro programa, gracias al mecanismo establecido para JDBC. En el caso concreto de Microsoft Access, no es necesario que obtengamos del fabricante las clases que implementan las interfaces dadas por JDBC, puesto que las mismas ya vienen incorporadas por defecto en el paquete de Java cuando lo instalamos. No obstante, es importante tener presente que este no es el caso de todos los DBMS. En el caso de Microsoft Access, podemos hacerlo así porque vamos a accederlo a través de las fuentes de datos ODBC de Microsoft Windows, para las cuales, la versión de Java para Windows ya tiene preincorporadas las clases necesarias que implementan las interfaces dadas por JDBC. Configurando la fuente de datos ODBC: Página 2 de 6. Programación con Acceso a Datos IUAS En forma previa a estudiar las interfaces concretas provistas por JDBC, vamos a detenernos a analizar los pasos necesarios para dejar una base de datos Access disponible en la fuente de datos ODBC de Windows, a efectos de poder ser accedida por nuestros programas Java: 1. 2. 3. 4. 5. 6. Ir al Panel de Control y abrir "Herramientas administrativas" Una vez allí, abrir "Fuentes de datos ODBC" Presionar el botón "Agregar" Elegir "Microsoft Access Driver (.mdb)" Presionar el botón "Terminar" Ingresar el nombre de la fuente de datos. Este es el nombre con el cual identificaremos a la base de datos (desde nuestro programa) correspondiente a dicha fuente de datos. 7. Elegir el archivo (.mdb) correspondiente a nuestra base de datos Access. El paquete java.sql A continuación vamos a especificar algunas de las interfaces provistas por el mecanismo de JDBC, las cuales están contenidas en el paquete java.sql predefinido por Java. Por mayor información, remitirse a la API de Java: • • • • • java.sql.Driver - Esta es la interfaz que define con qué manejador de bases de datos (DBMS) concreto vamos a interactuar desde nuestros programas en Java. java.sql.Connection - Esta es la interfaz que define con qué base de datos concreta vamos a interactuar desde nuestros programas en Java. java.sql.Statement - Esta es la interfaz que nos permite ejecutar consultas sin parámetros sobre una base de datos desde nuestros programas en Java. java.sql.PreparedStatement - Esta es la interfaz que nos permite ejecutar consultas con parámetros sobre una base de datos desde nuestros programas en Java. java.sql.ResultSet - Esta es la interfaz que nos permite acceder a los registros resultados de una consulta de selección hecha sobre una base de datos, sin importar si dicha consulta fue hecha con o sin parámetros. Un ResultSet es un objeto similar a los iteradores estudiados en el capítulo cuatro. En las secciones siguientes ilustraremos el uso de estas interfaces mediante ejemplos de programas que realizan consultas tanto de selección como de actualización, algunas de ellas con parámetros y otras de ellas sin parámetros. Consultas de selección sobre una base de datos El siguiente programa de prueba ilustra la realización de una consulta de selección. Se utiliza try/catch porque los métodos invocados son propensos a lanzar Excepciones que no son RunTime Exceptions. import java.sql.*; public class PruebaSeleccion { public static void main (String [] args) { try { /* indico con qué DBMS voy a interactuar. En nuestro caso indicamos concretamente que será vía ODBC */ Página 3 de 6. Programación con Acceso a Datos IUAS String driver = "sun.jdbc.odbc.JdbcOdbcDriver"; Class.forName(driver); /* indico cuál es la base de datos a utilizar */ String base = "jdbc:odbc:Prueba"; String usuario = ""; String password = ""; /* establezco la conexión con la base */ Connection con = DriverManager.getConnection (base, usuario, password); /* utilizo un Statement para hacer una consulta sin parámetros */ Statement stmt = con.createStatement(); /* redacto la consulta sin parámetros */ String query = "SELECT * FROM Personas"; /* ejecuto la consulta sin parámetros */ /* utilizo executeQuery() por tratarse de */ /* una consulta de selección */ ResultSet rs = stmt.executeQuery(query); /* accedo a los resultados y los despliego */ /* en este ejemplo, los campos de la tabla */ /* consultada se llaman cédula, nombre y edad */ while (rs.next()) { System.out.println (rs.getString("cédula")); System.out.println (rs.getString("nombre")); System.out.println (rs.getInt("edad")); } /* cierro el ResultSet, el Statement y la Connection */ rs.close(); stmt.close(); con.close(); } catch (SQLException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } } Consultas de actualización sobre una base de datos El siguiente programa de prueba ilustra la realización de una consulta de actualización. Se utiliza try/catch porque los métodos invocados son propensos a lanzar Excepciones que no son RunTime Exceptions. import java.sql.*; public class PruebaActualizacion { public static void main (String [] args) { try { /* indico con qué DBMS voy a interactuar. En nuestro caso indicamos concretamente que será vía ODBC */ Página 4 de 6. Programación con Acceso a Datos IUAS String driver = "sun.jdbc.odbc.JdbcOdbcDriver"; Class.forName(driver); /* indico cuál es la base de datos a utilizar */ String base = "jdbc:odbc:Prueba"; String usuario = ""; String password = ""; /* establezco la conexión con la base */ Connection con = DriverManager.getConnection (base, usuario, password); /* redacto una consulta con parámetros */ String query = "INSERT INTO Personas VALUES (?,?,?)"; /* utilizo un PreparedStatement para hacer una consulta con parámetros */ PreparedStatement pstmt = con.prepareStatement(query); /* le paso parámetros a la consulta */ /* el 1° parámetro es la cédula */ /* el 2° parámetro es el nombre */ /* el 3° parámetro es la edad */ pstmt.setString(1,"1234567"); pstmt.setString(2,"Juan"); pstmt.setInt(3,28); /* ejecuto la consulta con parámetros */ /* utilizo executeUpdate() por tratarse de */ /* una consulta de actualización */ pstmt.executeUpdate(); /* cierro el PreparedStatement y la Connection */ pstmt.close(); con.close(); } catch (SQLException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } } Ejercicios Ejercicio 1 Crear una base de datos en Access con las siguientes tablas: • • Dueños (cédula, nombre, apellido) Autos (matrícula, marca, modelo, cédula) La cédula en la tabla Autos referencia a la cédula en la tabla Dueños. Un mismo dueño puede tener muchos autos, pero cada auto puede ser tenido por un único dueño. Los campos cédula son numéricos, mientras que todos los demás son de tipo Texto. Página 5 de 6. Programación con Acceso a Datos IUAS Cargue algunos datos en la base directamente desde Microsoft Access y luego configure el origen de datos (ODBC) a efectos de dejar a la base de datos disponible para ser accedida desde Java. Ejercicio 2 Implemente una clase llamada Dueño con los siguientes atributos: cédula (int), nombre (String), apellido (String). La clase debe proveer un método constructor junto con los correspondientes métodos selectores y modificadores. Ejercicio 3 Implemente una clase llamada Auto con los siguientes atributos: matrícula (String), marca (String), modelo (String). La clase debe proveer un método constructor junto con los correspondientes métodos selectores y modificadores. Ejercicio 4 Implemente una clase llamada AccesoBaseDatos que tenga como único atributo un objeto llamado con de tipo Connection junto con los siguientes métodos: • • • • • • public AccesoBaseDatos (String driver, String base) throws SQLException, ClassNotFoundException - Este método establece la conexión con la base de datos a partir de los parámetros recibidos. public void agregarDueño (Dueño due) throws SQLException - Este método inserta en la base de datos los datos del nuevo dueño. public void agregarAuto (int, cédula, Auto au) throws SQLException - Este método inserta en la base de datos los datos del nuevo auto, vinculándolos con la cédula del dueño al cual pertenece. public Vector obtenerTodosLosDueños ( ) - Este método retorna un vector de Dueños conteniendo un listado de todos los dueños cuyos datos están almacenados en la base de datos. public Vector obtenerAutosDeDueño (int cédula) - Este método retorna un vector de Autos conteniendo un listado de todos los autos cuyos datos están almacenados en la base de datos y que pertenecen al dueño cuya cédula es la especificada. public void desconectar ( ) - Este método cierra la conexión con la base de datos. Cada método deberá utilizar los objetos Statement, PreparedStatement y/o ResultSet que sean necesarios. Luego haga un programa de prueba que invoque a los métodos de las clases anteriores y despliegue los resultados en la salida estándar. Página 6 de 6.