LPI

-1-

Prof. Ing. Alberto Moreno C.

CONEXIONES CON BASES DE DATOS EN JAVA BASE DE DATOS
Conjunto de datos relacionados entre si y organizados en tablas. Los datos no son redundantes y guardan una integridad referencial entre ellos.La información debe ser: • • • Exacta Relevante Oportuna

DBMS=Database Management System DBA=Database Administrator
Para manejar una BD se ejecutan SCRIPTS=una ó más Sentencias SQL. .CREATE .INSERT .DELETE .UPDATE .SELECT SQL=Structured Query Language

Java & Conexión a Base de Datos
üJDBC (Java DataBase Connectivity) es la tecnología Java que permite a las aplicaciones interactuar directamente con motores de base de datos relacionales. üLa API JDBC es una parte integral de la plataforma Java, por lo tanto no es necesario descargar ningún paquete adicional para usarla. üJDBC provee una interface única, que independiza a las aplicaciones del motor de base de datos usado y del mecanismo de conexión. üJDBC generaliza las funciones de acceso a datos más comunes. Los métodos están contenidos en los paquetes: java.sql y java.txt. üUn driver JDBC es usado por la JVM para traducir las invocaciones JDBC genéricas en invocaciones que la bd propietaria entiende. Los drivers son clases Java que se cargan en ejecución. üExisten drivers JDBC para la mayoría de los motores de base de datos más populares. Típicamente, los fabricantes de bases de datos proveen el driver JDBC para su motor, aunque también es posible encontrarlos en Internet. Tipos de Driver JDBC Los drivers JDBC se clasifican en cuatro categorías: üDrivers Tipo 1

LPI

-2-

Prof. Ing. Alberto Moreno C.

oEl driver JDBC-ODBC es parte de la pataforma Java. No es un driver 100 % Java. oTraduce invocaciones JDBC a invocaciones ODBC a través de librerías ODBC del sistema operativo. oNo es una solución buena, pero en algunas situaciones es la única, tal es el caso de Microsoft Access. Desventajas
oSe requieren múltiples capas de software para hacer las llamadas a la BD. oSe requiere la instalación de software adicional (configuración ODBC).

Las clases e interfaces de la API JDBC están en los paquetes java.sql y java.text. En estos paquetes se encuentran definidos métodos que permiten: conectarse a una BD, recuperar información acerca de la BD, realizar queries SQL a la BD y ejecutar Stored Procedures. Instalación. ODBC: se instala manualmente en cada máquina. JDBC: Sus drivers están escritos en Java por lo tanto es auto instalable, portable y seguro. JDBC especifica clases y métodos que permiten a cualquier programa en Java un acceso homogéneo a las BD a través de drivers. Es necesario JDBC a pesar de la existencia de ODBC por su portabilidad, seguridad e instalabilidad. La conectividad de BD se basa en sentencias SQL que a través de JDBC realizan la conexión, consultas y reciben los resultados JDBC permite ciertas facilidades: Actualizar múltiples registros con un solo comando Acceder a múltiples servidores de BD dentro de una transacción simple Reutiliza las conexiones a la BD (“connection pooling”) Escribir aplicaciones que accedan a datos a través de sistemas de BD incompatibles corriendo en plataformas distintas

PUENTE JDBC-ODBC
Construir aplicaciones de bases de datos que no dependan de la plataforma en la que esta corriendo la base de datos.

LPI

-3-

Prof. Ing. Alberto Moreno C.

Crear aplicaciones que se ejecuten en muchas plataformas de bases de datos .

Establecer una Conexión a la BD vía JDBC
La conexión se establece a través del driver, que se carga en ejecución mediante el método: Class.forName(String nombredelDriver) Una vez cargado el driver, la conexión a la BD se realiza invocando a alguno de los siguientes métodos de la clase java.sql.DriverManager public static synchronized Connnection getConnection(String url, java.util.Properties info) throws SQLException public static synchronized Connnection getConnection(String url, String usr, String pwd) throws SQLException public static synchronized Connnection getConnection(String url) throws SQLException El objeto Connection que se devuelve al programa se usa para realizar todas las operaciones sobre la BD.. .
Connection miConexion; try { Class.forName( sun.jdbc.odbc.JdbcOdbcDriver ); miConexion = DriverManager.getConnection( jdbc:odbc:empleadosDB ); ... } catch (ClassNotFounException e1) { // captura el error: no se encontró el driver } catch (SQLException e2) { // captura el error: no se pudo conectar a la BD

LPI
}

-4-

Prof. Ing. Alberto Moreno C.

Se deben manejar dos excepciones. Una es para controlar si el Driver no es encontrado y la otra para verificar si se realizó la conexión.

Ejecución de sentencias SQL y Recuperación de Resultados
Para realizar una consulta SQL a la BD se requiere de la creación de un objeto: Statement, PreparedStatement o CallableStatement usando uno de los métodos del objeto Connection. Statement createStatement() throws SQLException Statement createStatement(int resultSetType, int resultSetConcurrency) throws SQLException PreparedStatement preparedStatement(String sql) throws SQLException PreparedStatement preparedStatement(String sql, int resultSetType, int resultSetConcurrency) throws SQLException CallableStatement prepareCall(String sql) throws SQLException PreparedStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency) throws SQLException Clase Statement Sobre el objeto Statement que devuelve el método createStatement() se ejecuta la sentencia SQL, que puede devolver o no resultados: void executeUpdate(String sql) throws SQLExceptionResulSet executeQuery(String

sql) throws SQLException
Se usa para ejecutar las sentencias SQL: SELECT El objeto ResulSet puede ser recorrido y actualizado El resultado de un executeQuery(), es devuelto en un objeto ResultSet. Este objeto contiene un cursor que puede manipularse para hacer referencia a una fila particular del

LPI

-5-

Prof. Ing. Alberto Moreno C.

resultset. Inicialmente se ubica en la posición anterior a la primera fila. El método next() avanza una fila. Cada invocación a next() retorna true si se trata de una fila válida y false cuando se llega al fin del resultset. Recorrer el ResultSet boolean next() throws SQLException Recuperar campos del ResultSet Los campos de cada fila del resultset puede obtenerse mediante su nombre o posición. El método a usar depende del tipo de dato almacenado String getString(int indiceColum) El dato a leer es cadena String getString(String nombreCol) throws SQLException int getInt(int indiceCol) Si el dato a leer es entero int getInt(String nombreCol) throws SQLException ….double getDouble(int indice) .´si el dato a leer es real

¿Dónde cerrar la conexión a la Base de Datos?Es importante cerrar/liberar
las conexiones una vez que ya no son usadas. De esta manera el objeto Connection será marcado para ser recolectado por el Garbage Collector y, además teniendo en cuenta que la cantidad de conexiones disponibles a una BD es limitada, es importante cerrar las conexiones que no son más usadas. El método destroy() es el apropiado para llevar a cabo esta acción. Prepared

StatementsUn sentencia preparada (prepared statement) es un tipo de sentencia que mejora la performance de las consultas. Una sentencia preparada se precompila antes de ser usada. La versión precompilada acepta diferente número de parámetros. A diferencia de las sentencias tradicionales cuando se crean requieren de la sentencia SQL como argumento del constructor. Esta sentencia es enviada al motor de BD para su compilación y cuando se ejecuta el motor de BD la corre sin previa compilación. Las sentencias preparadas manejan parámetros, con lo cual pueden ejecutares muchas veces con distintos parámetros. üCreación de una sentencia preparada PreparedStatement p_sent = miConexion.prepareStatement(“SELECT FROM Empledos”+ “Apellido, Nombre WHERE edad >?”)
üConfiguración de los parámetros antes de la ejecución de la sentencia p_sent.setInt(1, 55); p_sent.executeQuery();

Callable Statement
Se usan para invocar a stored procedures. Los Stored Procedures son programas almacenados en el motor de BD y que se ejecutan en el servidor de BD. Típicamente se escriben en el lenguaje propio de la BD, aunque es posible hacerlo en Java. Invocar a un SP consiste en proveerle parámetros. Los SP se parametrizan a través de los métodos set<datatype>() de la misma manera que las sentencias preparadas. Ejecución de un procedimiento almacenado (SP) CallableStatement miSP =miConexion. prepareCall ( call SP_CONSULTA ); ResultSet resul = miSP.executeQuery(); Resumen:

LPI

-6-

Prof. Ing. Alberto Moreno C.

Metodo asociados a la conexión:

LPI

-7-

Prof. Ing. Alberto Moreno C.

Obtener el origen de datos ODBC

LPI

-8-

Prof. Ing. Alberto Moreno C.

APLICACIONES:.- Se tiene la base de datos Bdnotas:

Realizar el ingreso de nuevos alumnos

Paso2.- Crear los paquetes correspondientes para almacenar las clases adecuadas:

LPI

-9-

Prof. Ing. Alberto Moreno C.

package Data; import java.sql.*; import javax.swing.JOptionPane; public class DataBase { public static Connection GetConnection(){ Connection cn=null; try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); cn=DriverManager.getConnection("jdbc:odbc:Universidad","sa",""); System.out.print("conexion ok!"); } catch(Exception ex){ JOptionPane.showMessageDialog(null,ex.getMessage()); //System.out.print("conexion incorrecta !!"+ex.getMessage()); } return cn; } La clase alumno.java package List; public class Alumno { private String coda; private String noma; private String apellido; private String code; private String proce; public Alumno() { } public String getCoda() { return coda; } public void setCoda(String coda) { this.coda = coda; } public String getNoma() { return noma; } public void setNoma(String noma) {

La Clase Especialidad.java package List; public class Especialidad { private String code; private String nomes;

public Especialidad() { } public String getCode() { return code; } public void setCode(String code) { this.code = code; } public String getNomes() { return nomes; } public void setNomes(String nomes) { this.nomes = nomes; } }

LPI this.noma = noma; } public String getApellido() { return apellido; }

-10-

Prof. Ing. Alberto Moreno C.

public void setApellido(String apellido) { this.apellido = apellido; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } public String getProce() { return proce; } public void setProce(String proce) { this.proce = proce; } } La clase AlumnoData package List; import Data.DataBase; import java.sql.*; import java.util.*; import java.text.DecimalFormat; public class AlumnoData { public static ArrayList ListaAlumno(){ Connection cn; ArrayList lista=new ArrayList(); try{ cn= DataBase.GetConnection(); Statement cmd=cn.createStatement(); ResultSet rs=cmd.executeQuery(" select Idalumno, nomAlumno,Apealumno from Alumno order by idalumno"); while(rs.next()){ Alumno a=new Alumno(); a.setCoda(rs.getString(1)); a.setNoma(rs.getString(2));

LPI

-11a.setApellido(rs.getString(3)); lista.add(a); } }catch(SQLException ex){ ex.printStackTrace(); }

Prof. Ing. Alberto Moreno C.

return lista; } public static ArrayList FiltraAlu(String ap){ Connection cn; ArrayList lista=new ArrayList(); try{ cn= DataBase.GetConnection(); Statement cmd=cn.createStatement(); ResultSet rs=cmd.executeQuery(" select Idalumno, nomAlumno,Apealumno from Alumno where apealumno like '"+ap+"%'"); while(rs.next()){ Alumno a=new Alumno(); a.setCoda(rs.getString(1)); a.setNoma(rs.getString(2)); a.setApellido(rs.getString(3)); lista.add(a); } }catch(SQLException ex){ ex.printStackTrace(); } return lista; } public static boolean Inserta(Alumno a){ boolean sw=false; Connection cn=null; PreparedStatement cmd=null; try{ cn=DataBase.GetConnection(); cmd=cn.prepareStatement("insert into alumno values(?,?,?,?,?)"); cmd.setString(1,a.getCoda()); cmd.setString(2,a.getApellido()); cmd.setString(3,a.getNoma()); cmd.setString(4,a.getCode()); cmd.setString(5,a.getProce()); cmd.executeUpdate();

LPI cmd.close(); cn.close(); sw=true; } catch(SQLException ex){ sw=false; ex.printStackTrace(); } return sw;

-12-

Prof. Ing. Alberto Moreno C.

} public static String GeneraCod(){ Alumno ax; int nro; int indice=ListaAlumno().size()-1; String coda=((Alumno)( ListaAlumno().get(indice))).getCoda(); nro=Integer.parseInt(coda.substring(1))+1; DecimalFormat sd=new DecimalFormat("0000"); coda="A"+sd.format(nro); return coda; }

} La clase EspecialData.java package List; import com.sun.crypto.provider.RSACipher; import java.util.*; import Data.DataBase; import java.sql.*; public class EspecialData { public static ArrayList ListaEsp(){ Connection cn; ArrayList lista=new ArrayList(); try{ cn=DataBase.GetConnection(); Statement cmd=cn.createStatement(); ResultSet rs=cmd.executeQuery("select idesp, nomesp from especialidad"); while(rs.next()){ Especialidad es=new Especialidad(); es.setCode(rs.getString(1)); es.setNomes(rs.getString(2)); lista.add(es); }

LPI }catch(SQLException ex){ ex.printStackTrace(); } return lista; }

-13-

Prof. Ing. Alberto Moreno C.

public static String BuscaEsp(int num){ Especialidad es; es=(Especialidad) ListaEsp().get(num); return es.getCode(); }

} El formulario

El Codigo se Genera

El combo se llena con la tabla especialidad muestra su nombre pero se almacena su código

El codigo del formulario: package GUI; import javax.swing.JOptionPane; import javax.swing.table.DefaultTableModel; import List.*; import java.util.*; public class JDaddAlu extends javax.swing.JDialog { DefaultTableModel dt=new DefaultTableModel(); /** Creates new form JDaddAlu */

LPI

-14-

Prof. Ing. Alberto Moreno C.

public JDaddAlu(java.awt.Frame parent, boolean modal) { super(parent, modal); initComponents(); } private void JbtnNuevoActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: String coda=AlumnoData.GeneraCod(); this.txtcod.setText(coda);

} private void cbeActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: int indice=cbe.getSelectedIndex(); String code=EspecialData.BuscaEsp(indice); JOptionPane.showMessageDialog(this,code); } private void formWindowOpened(java.awt.event.WindowEvent evt) { this.tabla1.setModel(dt); dt.addColumn("Codigo"); dt.addColumn("Apelldio"); dt.addColumn("Nombre"); dt.addColumn("Especialidad"); dt.addColumn("Procedencia"); LlenaCombo(); } void LlenaCombo(){ Especialidad es; //this.cbe. ArrayList lista=(ArrayList) EspecialData.ListaEsp(); for(int f=0; f<lista.size();f++){ es=(Especialidad)lista.get(f); this.cbe.addItem(es.getNomes()); } TRABAJO PRACTICO 3.- Elaborar un formulario que ingresando su Código Muestre todos sus datos
Desarrollar los siguientes formularios: 1.- Consulta de Notas

LPI

-15-

Prof. Ing. Alberto Moreno C.

2.- Consulta En Cascada Alumnos con sus cursos llevados

3.-Realizar la consulta de alumnos por curso , en una tabla colocar la lista de cursos(idcurso, nomcurso) y al seleccionar un curso que muestre la relación de alumnos de dicho curso con sus exámenes , promedio y observación , además debe mostrar la cantidad de alumnos aprobados y desaprobados.

LPI

-16-

Prof. Ing. Alberto Moreno C.

Direcciones: Java en Castellano. (http://www.programacion.com/java/jdbc1.html) nJDBC´s por Felipe Fernández (http://www.dcc.uchile.cl/~lmateu/CC60H/Trabajos/jfernand/) Bibliografía: Java 2 Manual de Usuario y Tutorial, 2ª edición, Agustin Froufe, Alfaomega Ra-Ma Manual Avanzado de JAVA 2, edición 2005, Lima Díaz, Anaya Multimedia. Fundamentos de bases de datos con JAVA, Mukhar Kevin, Lauinger Todd, Anaya Multimedia. Conectividad de la Base de Datos de Java (http//:www.acm.org/crossroads/espanol/xrds7-3/ovp_marzo2001.html)

Master your semester with Scribd & The New York Times

Special offer for students: Only $4.99/month.

Master your semester with Scribd & The New York Times

Cancel anytime.