Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Conexiones Con Bases de Datos en Java
Conexiones Con Bases de Datos en Java
-1-
LPI
-2-
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-
LPI
}
-4-
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.
LPI
-5-
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
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-
LPI
-7-
LPI
-8-
Paso2.- Crear los paquetes correspondientes para almacenar las clases adecuadas:
LPI
-9-
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; } }
-10-
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
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-
} 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); }
-13-
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-
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-
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-
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)