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 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; La Clase Especialidad.java
package List;
public class Alumno {
private String coda; public class Especialidad {
private String noma; private String code;
private String apellido; private String nomes;
private String code;
private String proce;
public Especialidad() {
public Alumno() { }
}
public String getCode() {
public String getCoda() { return code;
return coda; }
}
public void setCode(String code) {
public void setCoda(String coda) { this.code = code;
this.coda = coda; }
}
public String getNomes() {
public String getNoma() { return nomes;
return noma; }
}
public void setNomes(String nomes) {
public void setNoma(String noma) { this.nomes = nomes;
}

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