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.