Conexiones Con Bases de Datos en Java

16
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

description

Conexiones a Bdd con java, espero que les sirva de AyudaIng. Alberto Motreno

Transcript of Conexiones Con Bases de Datos en Java

Page 1: Conexiones Con Bases de Datos en Java

LPI -1- Prof. Ing. Alberto Moreno C.

CONEXIONES CON BASES DE DATOS EN JAVA

BASE DE DATOSConjunto de datos relacionados entre si y organizados en tablas. Los datos no sonredundantes 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 BDse ejecutanSCRIPTS=una ó másSentencias SQL..CREATE.INSERT.DELETE.UPDATE.SELECTSQL=Structured Query Language

Java & Conexión a Base de DatosüJDBC (Java DataBase Connectivity) es la tecnología Java que permite a lasaplicaciones 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 necesariodescargar ningún paquete adicional para usarla.üJDBC provee una interface única, que independiza a las aplicaciones del motor debase de datos usado y del mecanismo de conexión.

üJDBC generaliza las funciones de acceso a datos más comunes. Los métodos estáncontenidos en los paquetes: java.sql y java.txt.

üUn driver JDBC es usado por la JVM para traducir las invocaciones JDBC genéricasen invocaciones que la bd propietaria entiende. Los drivers son clases Java que secargan 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 JDBCLos drivers JDBC se clasifican en cuatro categorías:üDrivers Tipo 1

Page 2: Conexiones Con Bases de Datos en Java

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 sistemaoperativo.oNo es una solución buena, pero en algunas situaciones es la única, tal es el caso de MicrosoftAccess.DesventajasoSe 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 StoredProcedures.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 accesohomogéneo a las BD a través de drivers.Es necesario JDBC a pesar de la existencia de ODBC por su portabilidad, seguridad einstalabilidad.La conectividad de BD se basa en sentencias SQL que a través de JDBC realizan la conexión,consultas y reciben los resultadosJDBC permite ciertas facilidades:Actualizar múltiples registros con un solo comandoAcceder a múltiples servidores de BD dentro de una transacción simpleReutiliza las conexiones a la BD (“connection pooling”)Escribir aplicaciones que accedan a datos a través de sistemas de BD incompatibles corriendoen plataformas distintasPPUUEENNTTEE JJDDBBCC--OODDBBCCConstruir aplicaciones de bases de datos que no dependan de la plataforma en la que estacorriendo la base de datos.

Page 3: Conexiones Con Bases de Datos en Java

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 JDBCLa conexión se establece a través del driver, que se carga en ejecución mediante elmétodo: Class.forName(String nombredelDriver)Una vez cargado el driver, la conexión a la BD se realiza invocando a alguno de lossiguientes métodos de la clase java.sql.DriverManager

public static synchronized Connnection getConnection(String url, java.util.Propertiesinfo) throws SQLExceptionpublic static synchronized Connnection getConnection(String url, String usr, Stringpwd) throws SQLExceptionpublic static synchronized Connnection getConnection(String url) throwsSQLExceptionEl objeto Connection que se devuelve al programa se usa para realizar todas lasoperaciones 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

Page 4: Conexiones Con Bases de Datos en Java

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 SQLExceptionStatement createStatement(int resultSetType, int resultSetConcurrency) throws SQLExceptionPreparedStatement preparedStatement(String sql) throws SQLExceptionPreparedStatement preparedStatement(String sql, int resultSetType, int resultSetConcurrency) throws SQLExceptionCallableStatement prepareCall(String sql) throws SQLExceptionPreparedStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency) throws SQLException

Clase StatementSobre el objeto Statement que devuelve el método createStatement() se ejecuta la sentenciaSQL, que puede devolver o no resultados:void executeUpdate(String sql) throws SQLExceptionResulSet executeQuery(Stringsql) throws SQLExceptionSe usa para ejecutar las sentencias SQL: SELECTEl objeto ResulSet puede ser recorrido y actualizado

El resultado de un executeQuery(), es devuelto en un objeto ResultSet. Este objetocontiene un cursor que puede manipularse para hacer referencia a una fila particular del

Page 5: Conexiones Con Bases de Datos en Java

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 falsecuando se llega al fin del resultset.Recorrer el ResultSet boolean next() throws SQLExceptionRecuperar campos del ResultSetLos campos de cada fila del resultset puede obtenerse mediante su nombre o posición. Elmé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/liberarlas 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 cuentaque la cantidad de conexiones disponibles a una BD es limitada, es importante cerrar lasconexiones que no son más usadas.El método destroy() es el apropiado para llevar a cabo esta acción. PreparedStatementsUn sentencia preparada (prepared statement) es un tipo de sentencia quemejora la performance de las consultas.Una sentencia preparada se precompila antes de ser usada. La versión precompilada aceptadiferente número de parámetros.A diferencia de las sentencias tradicionales cuando se crean requieren de la sentencia SQL comoargumento del constructor. Esta sentencia es enviada al motor de BD para su compilación ycuando 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 condistintos 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 sentenciap_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 elservidor de BD. Típicamente se escriben en el lenguaje propio de la BD, aunque es posiblehacerlo 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 lassentencias preparadas.

Ejecución de un procedimiento almacenado (SP) CallableStatement miSP =miConexion. prepareCall ( call SP_CONSULTA ); ResultSet resul = miSP.executeQuery();

Resumen:

Page 6: Conexiones Con Bases de Datos en Java

LPI -6- Prof. Ing. Alberto Moreno C.

Metodo asociados a la conexión:

Page 7: Conexiones Con Bases de Datos en Java

LPI -7- Prof. Ing. Alberto Moreno C.

OObbtteenneerr eell oorriiggeenn ddee ddaattooss OODDBBCC

Page 8: Conexiones Con Bases de Datos en Java

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:

Page 9: Conexiones Con Bases de Datos en Java

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.javapackage 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.javapackage 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; }

}

Page 10: Conexiones Con Bases de Datos en Java

LPI -10- Prof. Ing. Alberto Moreno C.

this.noma = noma; }

public String getApellido() { return apellido; }

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 fromAlumno order by idalumno"); while(rs.next()){ Alumno a=new Alumno(); a.setCoda(rs.getString(1)); a.setNoma(rs.getString(2));

Page 11: Conexiones Con Bases de Datos en Java

LPI -11- Prof. Ing. Alberto Moreno C.

a.setApellido(rs.getString(3)); lista.add(a);

} }catch(SQLException ex){ ex.printStackTrace();

}

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

Page 12: Conexiones Con Bases de Datos en Java

LPI -12- Prof. Ing. Alberto Moreno C.

cmd.close(); cn.close(); sw=true;

} catch(SQLException ex){ sw=false; ex.printStackTrace(); } return sw;

} 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.javapackage 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); }

Page 13: Conexiones Con Bases de Datos en Java

LPI -13- Prof. Ing. Alberto Moreno C.

}catch(SQLException ex){ ex.printStackTrace(); }

return lista;}

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

}

}El formulario

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 */

El Codigo se Genera

El combo se llena con latabla especialidadmuestra su nombre perose almacena su código

Page 14: Conexiones Con Bases de Datos en Java

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 PRACTICO3.- Elaborar un formulario que ingresando su Código Muestre todos sus datos

Desarrollar los siguientes formularios:1.- Consulta de Notas

Page 15: Conexiones Con Bases de Datos en Java

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 susexámenes , promedio y observación , además debe mostrar la cantidad de alumnos aprobados ydesaprobados.

Page 16: Conexiones Con Bases de Datos en Java

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-MaManual Avanzado de JAVA 2, edición 2005, Lima Díaz, Anaya Multimedia.

Fundamentos de bases de datos con JAVA, Mukhar Kevin, Lauinger Todd, AnayaMultimedia.

Conectividad de la Base de Datos de Java(http//:www.acm.org/crossroads/espanol/xrds7-3/ovp_marzo2001.html)