Está en la página 1de 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 informacin debe ser: Exacta Relevante Oportuna

DBMS=Database Management System DBA=Database Administrator


Para manejar una BD se ejecutan SCRIPTS=una ms Sentencias SQL. .CREATE .INSERT .DELETE .UPDATE .SELECT SQL=Structured Query Language

Java & Conexin a Base de Datos


JDBC (Java DataBase Connectivity) es la tecnologa 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 ningn 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 conexin. JDBC generaliza las funciones de acceso a datos ms comunes. Los mtodos estn contenidos en los paquetes: java.sql y java.txt. Un driver JDBC es usado por la JVM para traducir las invocaciones JDBC genricas en invocaciones que la bd propietaria entiende. Los drivers son clases Java que se cargan en ejecucin. Existen drivers JDBC para la mayora de los motores de base de datos ms populares. Tpicamente, los fabricantes de bases de datos proveen el driver JDBC para su motor, aunque tambin es posible encontrarlos en Internet. Tipos de Driver JDBC Los drivers JDBC se clasifican en cuatro categoras: 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 travs de libreras ODBC del sistema operativo. oNo es una solucin buena, pero en algunas situaciones es la nica, tal es el caso de Microsoft Access. Desventajas
oSe requieren mltiples capas de software para hacer las llamadas a la BD. oSe requiere la instalacin de software adicional (configuracin ODBC).

Las clases e interfaces de la API JDBC estn en los paquetes java.sql y java.text. En estos paquetes se encuentran definidos mtodos que permiten: conectarse a una BD, recuperar informacin acerca de la BD, realizar queries SQL a la BD y ejecutar Stored Procedures. Instalacin. ODBC: se instala manualmente en cada mquina. JDBC: Sus drivers estn escritos en Java por lo tanto es auto instalable, portable y seguro. JDBC especifica clases y mtodos que permiten a cualquier programa en Java un acceso homogneo a las BD a travs 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 travs de JDBC realizan la conexin, consultas y reciben los resultados JDBC permite ciertas facilidades: Actualizar mltiples registros con un solo comando Acceder a mltiples servidores de BD dentro de una transaccin simple Reutiliza las conexiones a la BD (connection pooling) Escribir aplicaciones que accedan a datos a travs 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 Conexin a la BD va JDBC


La conexin se establece a travs del driver, que se carga en ejecucin mediante el mtodo: Class.forName(String nombredelDriver) Una vez cargado el driver, la conexin a la BD se realiza invocando a alguno de los siguientes mtodos 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 conexin.

Ejecucin de sentencias SQL y Recuperacin de Resultados


Para realizar una consulta SQL a la BD se requiere de la creacin de un objeto: Statement, PreparedStatement o CallableStatement usando uno de los mtodos 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 mtodo 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 posicin anterior a la primera fila. El mtodo next() avanza una fila. Cada invocacin a next() retorna true si se trata de una fila vlida 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 posicin. El mtodo 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

Dnde cerrar la conexin 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, adems teniendo en cuenta que la cantidad de conexiones disponibles a una BD es limitada, es importante cerrar las conexiones que no son ms usadas. El mtodo destroy() es el apropiado para llevar a cabo esta accin. 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 versin precompilada acepta diferente nmero de parmetros. 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 compilacin y cuando se ejecuta el motor de BD la corre sin previa compilacin. Las sentencias preparadas manejan parmetros, con lo cual pueden ejecutares muchas veces con distintos parmetros. Creacin de una sentencia preparada PreparedStatement p_sent = miConexion.prepareStatement(SELECT FROM Empledos+ Apellido, Nombre WHERE edad >?)
Configuracin de los parmetros antes de la ejecucin 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. Tpicamente se escriben en el lenguaje propio de la BD, aunque es posible hacerlo en Java. Invocar a un SP consiste en proveerle parmetros. Los SP se parametrizan a travs de los mtodos set<datatype>() de la misma manera que las sentencias preparadas. Ejecucin 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 conexin:

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 cdigo

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 Cdigo 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 relacin de alumnos de dicho curso con sus exmenes , promedio y observacin , adems 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) nJDBCs por Felipe Fernndez (http://www.dcc.uchile.cl/~lmateu/CC60H/Trabajos/jfernand/) Bibliografa: Java 2 Manual de Usuario y Tutorial, 2 edicin, Agustin Froufe, Alfaomega Ra-Ma Manual Avanzado de JAVA 2, edicin 2005, Lima Daz, 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)

También podría gustarte