Sei sulla pagina 1di 40

INTRODUCCIN

a) Presentacin y contextualizacin
En esta Unidad aprenders a construir aplicaciones de escritorio con
conexin a base de datos utilizando la tecnologa JDBC.

b) Competencias
Elabora una aplicacin informtica con conexin a base de datos y
POO usando la tecnologa JDBC.

c) Capacidades
1.

Comprende la forma cmo trabaja la tecnologa JDBC (Java


Database Connetivity) al conectarse con una base de datos

2.

Maneja las principales interfaces del JDBC para el manejo y


procesamiento de datos de una tabla.

3.

Aplica la programacin orientada a objetos al programar una


aplicacin con base de datos.

4. Aplica sentencias precompiladas con los datos de una tabla.

d) Actitudes

Cumple con responsabilidad la presentacin de los trabajos


encomendados a travs de la plataforma virtual.

Desarrolla la creatividad, la innovacin, la actitud emprendedora y el


respeto a la honestidad intelectual.

a) Presentacin de ideas bsicas y contenido esenciales de la


Unidad.

La Unidad de Aprendizaje 04: Desarrollo De Aplicaciones De


Escritorio Con JDBC comprende el desarrollo de los siguientes temas:
Tema 01: Introduccin a la Tecnologa JDBC
Tema 02: Estableciendo una Conexin de Datos
Tema 03: Aplicando POO para la Gestin de Operaciones con
una Base de Datos
Tema 04: La interface PreparedStatement

Tema 01: La Introduccin a la Tecnologa JDBC

Java Database Connectivity (JDBC) es una interface de acceso a bases


de datos estndar SQL que proporciona un acceso uniforme a una gran
variedad de bases de datos relacionales desde Java.

FUNCIONES DEL JDBC

1. Establecer una conexin con una base de datos


2. Enviar una consulta SQL a la base de datos
3. Procesar los resultados de la consulta.

Dado a que JDBC contien un conjunto de interfaces no implementadas,


requiere de una implementacin especifica de acuerdo al tipo de gestor de
base de datos con la cual vayamos a trabajar, esta implementacin es
conocida con el nombre de driver, esto otorga una gran ventaja al JDBC al
poder trabajar con mltiples orgenes de base de datos, lo nico que se
requiere es contar con el driver especifico.

CARACTERSTICAS Y LOS DRIVERS DEL JDBC

Los Drivers tambin llamados manejadores, son un conjunto de clases


provistas por el fabricante, el gestor de base de
datos, que implementa las clases e interfaces
del API JDBC necesarias para que una
aplicacin Java pueda conectarse con una BD,
la

misin

del

manejador

ser

traducir

comandos estndar del API JDBC al protocolo


nativo de esa base de datos.
Si queremos cambiar el sistema de BD que empleamos lo nico que
deberemos hacer es reemplazar el antiguo manejador por el nuevo, y
seremos capaces de conectarnos a la nueva BD.

LAS INTERFACES Y CLASES DEL JDBC

JDBC incluye un conjunto de interfaces y clases que permiten el manejo de


base de datos en Java, esta tecnologa est basada fundamentalmente en
las siguientes interfaces:

a. Driver
b. DriverManager
c. Connection
d. Statement

e. PreparedStatement
f.

CallableStatement

g. ResultSet

REGISTRAR DE UN DRIVER (MANEJADOR)

Registrar un manejador no es ms que cargar en memoria una clase que


implementa el interfaz Driver, clase proporcionada por los desarrolladores
de la base de datos.
Podemos registrar el Driver empleando el cargador de clases. Para ello,
empleamos, al igual que para cargar cualquier otra clase, el mtodo
forName(String clase) de la clase Class.

Class.forName("com.mysql.Driver");

INTERFACE DRIVER
Es responsabilidad del desarrollador del driver proveer una clase que
implemente esta interface, y ser responsabilidad del DriverManager llamar
al mtodo connect de los drivers registrados para intentar establecer la
conexin con la base de datos.

CLASE DRIVERMANAGER
Como su nombre indica, esta clase es la gestora de los diversos drivers
(manejadores) que existen en nuestra aplicacin. Es posible que sea
necesario que en una misma aplicacin se tenga varios manejadores para
acceder a varias bases de datos.

Los mtodos que ms nos interesan de esta clase son:

static Connection getConnection(String url);


static Connection getConnection(String url, String user, String password).

Estos mtodos intentan establecer conexin con la base de datos que le


indiquemos en el campo url, empleando para ello, todos los manejadores
que hemos registrado. La diferencia entre un mtodo y el otro, obviamente,
es que en uno slo se especifica la base de datos a la que nos queremos
conectar, mientras que en el otro se indica tambin el nombre de usuario de
la base de datos y su password.

Sintaxis de los URL del JDBC

Los URL (Uniform Resource Locator) de JDBC identifican una base de


datos, y un protocolo de conexin a esta, de un modo nico. Toda URL de
JDBC consta siempre de tres partes:

Protocolo:
subprotocolo:subnombre.

Ejemplo:
"jdbc:odbc:usuarios"

Veamos cada una de las partes del URL:

1. Protocolo de la conexin. Siempre es jdbc.


2.

Subprotocolo de la conexin. Identifica el tipo de mecanismo de


conexin que emplearemos para acceder a la base de datos.

3.

Subnombre, identifica la base de datos con la que queremos


establecer una conexin.

Mtodos de la Clase DriverManager

Todos los mtodos que encontramos en esta clase son estticos (no
requieren instancia para poder utilizarlo) y se comentan brevemente a
continuacin:
Mtodo

Descripcin

Connection getConnection(String
url)

Establece una conexin con la base de datos identificada por la URL


de JDBC que se pasa por parmetros.

Connection getConnection(String
url, Properties info)

Establece una conexin con la base de datos identificada por la URL

Connection getConnection(String
url, String usuario, String
contrasea)

Establece una conexin con la base de datos pero en su segundo


parmetro especifica propiedades que posee el driver, como puede ser
la base de datos, el usuario, la contrasea, etc. Estas propiedades se
organizan en pares propiedad/valor.

void println(String mensaje)

Escribe un mensaje en el flujo de actividad actual

void setLoginTimeout(int
segundos)

Establece el tiempo de espera que el driver utilizar para realizar una


conexin.

de JDBC que se pasa por parmetros.

INTERFACE CONNECTION

Representa una conexin con la base de datos. Permite crear objetos que
representan consultas que se ejecutarn en la base de datos, y permite
acceder a informacin sobre las posibilidades del manejador JDBC.

En esta tabla recogemos los principales mtodos de la interfaz Connection.


Sobre muchos de ellos volveremos a hablar ms adelante.

Mtodos de la Interfaz Connection


Mtodo

Descripcin

void close()

Cierra una conexin, liberando todos los recursos asociados a la misma.

boolean isClosed()

Devuelve verdadero, si la conexin est cerrada

boolean isReadOnly()

Devuelve true, si la conexin es de slo lectura

PreparedStatement
prepareStatement(String sql)

Crea un objeto PreparedStatement que va a permitir enviar y ejecutar sentencias


SQL parametrizadas a la base de datos correspondiente.

PreparedStatement

Igual que el mtodo anterior, pero permite especificar las caractersticas del
ResultSet que se obtendr a la hora de ejecutar el objeto PreparedStatement
correspondiente.

prepareStatement(String sql,
int tipoResultSet, int
tipoConcurrencia)
void commit()

Hace permanentes los cambios que se realizaron desde el ltimo commit o


rollback.

Statement createStatement()

Crea un objeto de tipo Statement.

bolean getAutoCommit()

Indica si est en modo auto-commit.

CallableStatement
prepareCall(String sql)

Crea un objeto CallableStatement para ejecutar procedimientos almacenados


SQL en la BD.

PreparedStatement
prepareStatement(String sql)

Crea un objeto PreparedStatement para ejecutar consultas SQL parametrizadas


en la BD.

void rollback()

Deshace todos los cambios realizados desde la ltima vez que se ejecut commit
o rollback

void close()

Cierra una conexin, liberando todos los recursos asociados a la misma.

Statement
createStatement(int
tipoResultSet, int
tipoConcurrencia)

Crea tambin una sentencia SQL pero generar en su ejecucin un objeto


ResultSet con unas caractersticas determinadas.

boolean isClosed()

Devuelve verdadero si la conexin est cerrada

boolean isReadOnly()

Devuelve true si la conexin es de slo lectura

PreparedStatement
prepareStatement(String sql)

Crea un objeto PreparedStatement que va a permitir enviar y ejecutar sentencias


SQL parametrizadas a la base de datos correspondiente.

PreparedStatement

Igual que el mtodo anterior, pero permite especificar las caractersticas del
ResultSet que se obtendr a la hora de ejecutar el objeto PreparedStatement
correspondiente.

prepareStatement(String sql,
int tipoResultSet, int
tipoConcurrencia)

INTERFACE STATEMENT

Esta interfaz permite enviar instrucciones SQL a la base de datos. Podemos


obtener un objeto que implemente esta interfaz a partir del
mtodo

Statement

createStatement()

de

la

interfaz

Connection.

Para ejecutar una consulta tipo SELECT se emplea el mtodo


executeQuery(String sql). Este mtodo devuelve un objeto tipo ResultSet.
Para ejecutar una instruccin tipo DELETE, UPDATE, INSERT o una
instruccin

DDL

(Data

Definition

Language)

se

emplea

executeUpdate(String sql).
Mediante el mtodo execute(String sql) podemos ejecutar cualquiera de
los comandos anteriores.

Un objeto Statement se usa para enviar sentencias SQL a la base de datos.


Actualmente hay tres tipos de objetos Statement, todos ellos actan como
contenedores para la ejecucin de sentencias en una conexin dada: Statement,
PreparedStatement que hereda de Statement, y CallableStatement que hereda de
PreparedStatement. Estas estn especializadas para enviar tipos particulares de
sentencias SQL

Los mtodos ms importantes de la interfaz


Statement son:

Mtodo

Descripcin

void cancel()

Cancela el objeto Statement, abortando la


sentencia SQL correspondiente.

void close()

Cierra el objeto Statement, liberando todos los


recursos asociados de forma inmediata.

boolean execute(String sql)

Ejecuta la sentencia SQL, que se pasa por


parmetro

ResultSet
executeQuery(String sql)

Ejecuta una sentencia SQL, que devuelve un


conjunto de resultados, representado por el
objeto ResultSet.

int
sql)

executeUpdate(String

Ejecuta la sentencia SQL que se pasa por


parmetro y debe ser del tipo INSERT,
UPDATE o DELETE

Connection getConnection()

Devuelve el objeto Connection a partir del que


se ha creado el objeto Statement

Creando un objeto Statement

Una vez que se ha establecido una conexin a una base de datos determinada,
esta conexin se puede utilizar para ejecutar sentencias SQL.
Connection
cn=DriverManager.getConnection(url,pepe,xxx);
Statement st=cn.createStatement();

No olvidemos que si se trata de un comando Select que se desea ejecutar,


invocaremos al mtodo executeQuery. Ejemplo:

Connection cn=DriverManager.getConnection(url,pepe,xxx);
Statement st=cn.createStatement();
rs=st.executeQuery(Select * from clientes);

Si se trata de los comandos insert, update, delete y otros que modifican los datos
de una tabla, utilizaremos el mtodo executeUpdate. Ejemplo:
Connection cn=DriverManager.getConnection(url,pepe,xxx);
Statement st=cn.createStatement();
st.executeQuery(insert into Clientes values (001,Garcia
Daz,Carla);

ENVIO DE SENTENCIAS SQL


JDBC suministra tres clases para el envo de sentencias SQL. Estas clases
son las siguientes:

Statement.- Creada por el mtodo createStatement. Un objeto Statementse usa para enviar sentencias SQL simples.

PreparedStatement.- Creada por el mtodo prepareStatement. Un objeto PreparedStatement se usa para sentencias SQL que
toman uno o ms parmetros como argumentos de entrada (parmetros IN). El PreparedStatement extienden Statement y por
tanto heredan los mtodos de Statement. Un objeto PreparedStatement es potencialmente ms eficiente que un objeto Statement
porque este ha sido precompilado y almacenado para su uso futuro.

CallableStatement.- Creado por el mtodo prepareCall. Los objetos


CallableStatement se usan para ejecutar procedimientos almacenados.

Un objeto CallableStatement hereda mtodos para el manejo de los


parmetros IN de PreparedStatement, y aade mtodos para el manejo de
los parmetros OUT e INOUT.

INTERFACE RESULTSET

Esta interface representa un conjunto o esquema de datos que son el


resultado de una consulta SQL.
Es necesario usar un objeto que almacena todos los datos del resultado de
una consulta (select), este objeto se llama ResultSet.
El siguiente cdigo presenta el objeto ResultSet: rs y le asigna el resultado
de una consulta anterior.

ResultSet rs=st.executeQuery(Select codcli,apecli,nomcli from Clientes);

El ResultSet es una estructura similar a la tabla de datos con la diferencia


que no es fsica, sino de tipo virtual, se crear en la memoria del servidor y
desde all se tomarn los datos para mostrarlos posteriormente en el cliente.

METODOS DEL RESULTSET

Nombre del
Mtodo
previous()

Descripcin

isFirst()
getString()
getInt()
getDate()
getBoolean()
getDouble()

Enva el puntero a la fila anterior del objeto ResultSet. (devuelve true si


encuentra la fila anterior)
Enva el puntero a la fila siguiente del objeto ResultSet. (devuelve true si
encuentra la fila siguiente)
Enva el puntero a la primera fila del objeto ResultSet. (devuelve true si se
encuentra primera fila)
Enva el puntero a la ltima fila del objeto ResultSet. (devuelve true si se
encuentra ltima fila)
Devuelve verdadero, si el puntero se encuentra en la primera fila
Captura un dato de tipo String del esquema de datos
Captura un dato de tipo int del esquema de datos
Captura un dato de tipo Date del esquema de datos
Captura un dato de tipo boolean del esquema de datos
Captura un dato de tipo double del esquema de datos

getLong()

Captura un dato de tipo long del esquema de datos

next()
first()
last()

EL MTODO NEXT

El mtodo next mueve al puntero o cursor a la siguiente fila y hace que esa
fila (llamada fila actual) sea con la que podamos operar. Como el cursor
inicialmente se posiciona justo encima de la primera fila de un objeto
ResultSet, primero debemos llamar al mtodo next para mover el cursor a
la primera fila y convertirla en la fila actual. Sucesivas invocaciones del
mtodo next movern el cursor de lnea en lnea hacia adelante. Existen
otros mtodos con los cuales podemos mover el puntero de la tabla o
consultar sobre la posicin actual del puntero (en la tabla anterior, aparece
la lista de mtodos que mueven el puntero de la tabla).

CONSEGUIR LOS DATOS DEL RESULTSET


Mtodo getXXX

(XXX representa al tipo de dato, ejemplo: getDouble(), getString(),


getLong(), etc)
Los mtodos getXXX del tipo apropiado se utilizan para recuperar el valor
de cada columna. Por ejemplo:

rs.getString(1);

//Recupera el dato de la primera columna de la fila actual

rs.getString(CODCLI); //Recupera el dato de la campo CODCLI de la fila


actual

Nota:
La primera columna del ResultSet corresponde al nmero 1
Podemos referirnos a un dato del ResultSet mediante su nmero o
nombre de
columna.

Para conseguir otros tipos de datos contamos con los siguientes mtodos:

getByte

getShort

getInt

getLong

getFloat

getDouble

getBigDecimal

getBoolean

getString

getBytes

getDate

getTime

El ResultSet generado tiene la siguiente estructura:

Tema 02: Estableciendo una conexin de datos


Las conexiones JDBC, tal como estudiamos en la semana anterior, nos
permiten conectarnos con diferentes orgenes de datos, lo nico que
tenemos que hacer es: utilizar el driver provisto por el fabricante de la base
de datos, lo cual implementa la funcionalidad del JDBC para dicho gestor de
Base de Datos. Lo nico que variar en el cdigo fuente es la forma de
conexin, mientras que todo lo dems se mantendr igual.

Previamente, se requiere que el driver de mysql se inserte en el directorio


de librerias externas de Java, situado en la siguiente ruta:
C:\Archivos de programa\Java\jdk1.6.0\jre\lib\ext

Nota: El driver de mysql, se puede descargar de la pgina de mysql en


Internet: http://dev.mysql.com/downloads/connector/j/

El archivo a

descargar debe ser un archivo de extensin JAR. Para nuestro caso,


este archivo se llama: mysql-connector-java-5.0.8-bin.jar

(este

nombre puede cambiar de acuerdo al nombre de la versin, lo mismo


que la carpeta del JDK)

Pasos necesarios para Establecer una Conexin JDBC


1. Importar las clases del paquete java.sql

Para utilizar esta tecnologa, debemos importar las clases del paquete:
java.sql de la siguiente manera:

import java.sql.*

2. Registrar el Driver a utilizar en la clase DriverManager

Pasar el nombre del paquete donde se encuentra el JDBC

//Registra el driver
String
driver="com.mysql.jdbc.Driver";
Class.forName(driver);

3. Abrir la conexin
La forma comn de establecer una conexin con una base de datos es
llamar al mtodo getConnection() de la clase DriverManager, a este
mtodo se le debe pasar como parmetro la URL de JDBC que identifica
a la base de datos con la que queremos realizar la conexin. La ejecucin
de este mtodo devolver un objeto Connection que representar la
conexin con la base de datos.
La sintaxis general para realizar una conexin es la siguiente:

String servidor="localhost";
String puerto="3306";
String usuario="root";
String password="telesup";
String basedatos="Comercial";
String driver="com.mysql.jdbc.Driver";
String
cadenaconexion="jdbc:mysql://"+servidor+":"+puerto+"/"+basedatos;

cn=DriverManager.getConnection(cadenaconexion,usuario,password);

4. Definir el objeto Statement para el manejo de comandos


(se requiere que la conexin est abierta)

st=cn.createStatement();

5. Crear el esquema de datos (Objeto ResultSet)


A partir de la ejecucin del comando Select.

rs=stmt.executeQuery("select * from Clientes");

6. Visualizar el
contenido del esquema
de datos

while(rs.next())

// mtodo avance al siguiente y devuelve tru

{
System.out.print(rs.getString("Codcli")+"\t");
System.out.print(rs.getString("Apecli")+"\t");
System.out.print(rs.getString("Nomcli")+"\t");
System.out.print(rs.getString("Dircli")+"\t");
System.out.println("");
}

7. Cerrar la conexin

rs.close();
cn.close();

CODIGO FUENTE COMPLETO PARA REALIZAR LA CONEXIN CON LA BASE DE DATOS


COMERCIAL Y MOSTRAR EL CONTENIDO DE LA TABLA CLIENTES

Tema 03: Aplicando POO p ara la gestin de


operaciones
con una Base de datos
PROGRAMACIN EN CAPAS

Tal como se aprendi en el ciclo anterior, la programacin en capas


nos ofrece grandes ventajas:

Separar la lgica de los diferentes niveles de nuestra aplicacin


El mantenimiento de software es menos engorroso y complejo
Permite el trabajo en equipo por parte de los profesionales
informticos, cada equipo se concentrar en un determinado
nivel. Cada nivel se encuentra integrado al otro.
La programacin en capas se amolda a las metodologas
modernas del desarrollo de sistemas.

Una aplicacin puede ser desarrollada en capas, pudiendo ser


estas:

a. Lgica de Presentacin: se limita a la interfaz del cliente


desde donde se realizan las entradas y salidas de datos. En
esta capa tambin se puede realizar la validacin del ingreso
de datos.
b. Lgica de Negocios: incluye la programacin de los distintos
procesos que se dan en nuestro sistema.
c. Lgica de Datos: esta capa se encarga de la gestin de
datos a travs de las operaciones elementales: conectar,
desconectar, ejecutar consultas y ejecutar actualiaciones.

d. Otras capas: Incluye a otros tipos de componentes, tales


como: libreras dinmicas, etc.

CASO PRCTICO:
Realiza una aplicacin visual con orientacin a objetos que realice las principales
operaciones de mantenimiento de datos.

LGICA DE DATOS
Clase
: GestionBD.java
Paquete
: Ds
Descripcin : Esta clase contiene los mtodos que permitirn que nuestra
aplicacin se conecte con la base de datos y se ejecuten los comandos sql.

package Ds;
import java.sql.*;
public class GestionBD {

public Connection cn = null;


public Statement st = null;
public ResultSet rs = null;

public void conectar() throws Exception {


String servidor="localhost";
String puerto="3306";
String usuario="root";
String password="telesup";
String driver="com.mysql.jdbc.Driver";
String basedatos="Comercial";
String
cadenaconexion="jdbc:mysql://"+servidor+":"+puerto+"/"+basedatos;

Class.forName(driver);
cn=DriverManager.getConnection(cadenaconexion,usuario,password);
}

public ResultSet ejecutarConsulta(String sql) throws Exception


{
st=cn.createStatement();
rs=st.executeQuery(sql);
return rs;
}

public void ejecutarActualizacion(String sql) throws Exception{


st=cn.createStatement();
st.executeUpdate(sql);
}

public void desconectar() throws Exception{


cn.close();
}
}

LOGICA DE PRESENTACIN

Clase
Paquete

: FrmClientes.java
: view

Descripcin
de usuario

: Esta clase representa al formulario que contiene la interface

package View;
//Importamos los paquetes con los que trabajeremos en este
formulario
import java.sql.*;
import Ds.*;
import Model.*;
import javax.swing.JOptionPane;
import
javax.swing.table.DefaultTableModel;

public class frmClientes extends


javax.swing.JFrame {
//Instanciamos la clase que
corresponde a la lgica de datos
GestionBD gbd=new GestionBD();
String tipo;
/** Creates new form frmClientes
*/
public frmClientes() {
initComponents();
}

private void

formWindowOpened(java.awt.event.WindowEvent evt) {
// Este evento ocurre al abrir el formulario o ventana
cargardatos();
desactivar();
}

private void btninsActionPerformed(java.awt.event.ActionEvent evt)


{
// Al hacer click en el botn insertar
txtapecli.requestFocus();
tipo="INS";
activar();
ClienteModel em=new ClienteModel();
txtcod.setText(em.generarcodigo());
}

private void btnmodActionPerformed(java.awt.event.ActionEvent


evt) {
// Al hacer click en el botn modificar

activar();
tipo="MOD";
int fila=jTable1.getSelectedRow(); //obtener nro. de fila selec.
//Enviar los datos de la fila seleccionada a las cajas
txtcod.setText((String)jTable1.getValueAt(fila, 0));
txtapecli.setText((String)jTable1.getValueAt(fila, 1));
txtnomcli.setText((String)jTable1.getValueAt(fila, 2));
txtdircli.setText((String)jTable1.getValueAt(fila, 3));
txtdiscli.setText((String)jTable1.getValueAt(fila, 4));
}

private void btnEliActionPerformed(java.awt.event.ActionEvent


evt) {
// Al hacer click en el boton eliminar
try {
int fila = jTable1.getSelectedRow(); //Obtener fila
seleccionada
String cod = (String) jTable1.getValueAt(fila, 0);
int r = JOptionPane.showConfirmDialog(null, "Esta Ud.
seguro que desea eliminar?", "Aviso", JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE);
if (r == 0) { //Si contesto SI
String cad = "Delete from clientes where codcli='"
+ cod + "'";
gbd.conectar();
gbd.ejecutarActualizacion(cad);
cargardatos();
}
} catch (Exception e) {
JOptionPane.showMessageDialog(null, e.getMessage());
}
}

private void btnGrabarActionPerformed(java.awt.event.ActionEvent


evt) {
try {
// Al hacer click en el botn grabar
String cod=txtcod.getText();
String ape=txtapecli.getText();
String nom=txtnomcli.getText();
String dir=txtdircli.getText();
String dis=txtdiscli.getText();

String sql="";
if(tipo.equals("INS")){
sql="insert into
Clientes(codcli,apecli,nomcli,dircli,discli)
values('"+cod+"','"+ape+"','"+nom+"','"+dir+"')";
} else{
sql="update Clientes set
apecli='"+ape+"',nomcli='"+nom+"',dircli='"+dir+"',discli='"+dis+"'
where codcli='"+cod+"'";
}

gbd.ejecutarActualizacion(sql);
cargardatos(); //Actualizar el Jtable
limpiar();
desactivar();
} catch (Exception e) {
JOptionPane.showMessageDialog(null,"Error: "+e.getMessage());
}
}

private void txtcadenaKeyReleased(java.awt.event.KeyEvent evt)


{
// Ocurre cada vez que se presiona un character en la caja busqueda
String cad;
cad="Select * from clientes where apecli like
'"+txtcadena.getText()+"%'";

try {
//Crea el esquema de datos que se visualizar (resultado de la
busqueda)
gbd.conectar();
ResultSet rs=gbd.ejecutarConsulta(cad);

DefaultTableModel dtm=new DefaultTableModel();


dtm.addColumn("Codigo");
dtm.addColumn("Apellido ");
dtm.addColumn("Nombres");
dtm.addColumn("Direccion");
dtm.addColumn("Distrito");

while(rs.next()){ //Recorre el esquema de datos fila a


fila
Object[] fila=new Object[5];
fila[0]=rs.getObject(1);
fila[1]=rs.getObject(2);
fila[2]=rs.getObject(3);
fila[3]=rs.getObject(4);
fila[4]=rs.getObject(5);
dtm.addRow(fila);
} //Fin del While

jTable1.setModel(dtm); //Enviar el dtm al JTable


} catch (Exception e) {
JOptionPane.showMessageDialog(null,"Error:
"+e.getMessage());
}
}

private void
btnCancelarActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
limpiar();
desactivar();
}
//Muestra el esquema de datos incial en el JTable
private void cargardatos(){
try {
gbd.conectar();
ResultSet rs=gbd.ejecutarConsulta("Select * from
clientes");

DefaultTableModel dtm=new DefaultTableModel();


dtm.addColumn("Codigo");
dtm.addColumn("Apellido ");
dtm.addColumn("Nombres");
dtm.addColumn("Direccion");
dtm.addColumn("Distrito");

while(rs.next()){ //Recorre el esquema de datos fila a


fila
Object[] fila=new Object[5];
fila[0]=rs.getObject(1);
fila[1]=rs.getObject(2);
fila[2]=rs.getObject(3);
fila[3]=rs.getObject(4);
fila[4]=rs.getObject(5);

dtm.addRow(fila);
} //Fin del While

jTable1.setModel(dtm); //Enviar el dtm al JTable


} catch (Exception e) {
JOptionPane.showMessageDialog(null,"Error:
"+e.getMessage());
}
}

private void limpiar(){


//Limpia las cajas de texto
txtcod.setText("");

txtapecli.setText("");
txtnomcli.setText("");
txtdircli.setText("");
txtdiscli.setText("");
}

private void
desactivar(){
//Desactiva
algunas cajas
de texto

txtcod.setEnabled(false);
txtapecli.setEnabled(false);
txtnomcli.setEnabled(false);
txtdircli.setEnabled(false);
txtdiscli.setEnabled(false);
}

private void activar(){


//Desactiva algunas cajas de texto
txtcod.setEnabled(true);
txtapecli.setEnabled(true);
txtnomcli.setEnabled(true);
txtdircli.setEnabled(true);
txtdiscli.setEnabled(true);
btnGrabar.setEnabled(true);
btnCancelar.setEnabled(true);

LOGICA DE NEGOCIOS

Clase
Paquete
Descripcin

: ClienteModel
: Model
: Esta clase representa la lgica de negocios (procesos)

package Model;
import Ds.GestionBD;
import java.sql.*;
import javax.swing.JOptionPane;

public class ClienteModel {


GestionBD gbd=new GestionBD();

public String generarcodigo(){


String nuevocodstr="";
try {
String cad;
cad = "Select chr_emplcodigo from empleado order by
chr_emplcodigo desc limit 0,1";
gbd.conectar();
ResultSet rs = gbd.ejecutarConsulta(cad);
rs.next(); //Ubico mi puntero en la primera fila
String codigo = rs.getString(1);
int nuevocod=Integer.parseInt(codigo)+1;
nuevocodstr=String.valueOf(nuevocod);
} catch (Exception e) {
JOptionPane.showMessageDialog(null, e.toString());
}
return this.rellenar(nuevocodstr, 4);
}

public String rellenar(String cad,int longitud){


int lc=cad.length();
int lrellenar=longitud-lc;
String relleno="";
for(int i=0;i<=lrellenar-1;i++){
relleno+="0";
}
return relleno+cad; //La cadena rellenada
}
}

Tema 04: La interface Prepared Statement

Algunas

veces

es

ms

conveniente

eficiente

utilizar

objetos

PreparedStatement para enviar sentencias SQL a la base de datos.

Cundo utilizar un objeto PreparedStatement

Si queremos ejecutar muchas veces un objeto Statement, reduciremos el


tiempo de ejecucin si utilizamos un objeto PreparedStatement, en su lugar.
La caracterstica principal de un objeto PreparedStatementes que, al
contrario de un objeto Statement, se le entrega una sentencia SQL cuando
se crea. La ventaja de esto es que en la mayora de los casos, esta sentencia
SQL se enviar al controlador de la base de datos inmediatamente, donde
ser compilado. Como resultado, el objeto PreparedStatementno slo
contiene una sentencia SQL, sino una sentencia SQL que ha sido
precompilada. Esto significa que cuando se ejecuta la PreparedStatement,
el controlador de base de datos puede ejecutarla sin tener que compilarla
nuevamente.

La ventaja de PreparedStatement es que utilizan parmetros que podemos


utilizar en la misma sentencia y suministrar distintos valores cada vez que la
ejecutemos.

Crear un objeto PreparedStatement

PreparedStatement ps=cn.prepareStatement("UPDATE PRODUCTOS SET STOCKPRO = ? WHERE


NOMPRO LIKE ?");

La variable ps contiene la sentencia SQL,


"UPDATE

PRODUCTOS

SET

STOCKPRO = ? WHERE NOMPRO


LIKE?", que tambin ha sido, en la
mayora

de

los

casos,

enviada

al

controlador de la base de datos, y


precompilado.

Suministrar Valores para los Parmetros de un PreparedStatement

Necesitamos suministrar los valores que se utilizarn en los lugares donde


estn las marcas de interrogacin, antes de ejecutar un objeto
PreparedStatement. Podemos hacer esto llamando a uno de los mtodos
setXXX definidos en la clase PreparedStatement. Si el valor que queremos
sustituir por una marca de interrogacin es un int de Java, podemos llamar
al mtodo setInt. Si el valor que queremos sustituir es un String de Java,
podemos llamar al mtodo setString, etc. En general, hay un mtodo
setXXX para cada tipo Java. Utilizando el objeto ps del ejemplo anterior, la
siguiente lnea de cdigo selecciona la primera marca de interrogacin para
un int de Java, con un valor de 75.

ps.setInt(1, 75);

Como podramos asumir a partir de este ejemplo, el primer argumento de


un mtodo setXXX indica la marca de interrogacin que queremos
seleccionar, y el segundo argumento el valor que queremos ponerle. El
siguiente ejemplo selecciona la segunda marca de interrogacin con el string
"Arroz".

ps.setString(2, "Arroz");

Despus de que estos valores hayan sido asignados para sus dos
parmetros, la sentencia SQL de ps ser equivalente a la sentencia SQL
que hay en el string cad del siguiente ejemplo. Por lo tanto, los dos
fragmentos siguientes de cdigo hacen lo mismo.

Cdigo 1
String cad="UPDATE PRODUCTOS SET STOCKPRO=75 WHERE NOMPRO LIKE 'Arroz'";
stmt.executeUpdate(cad);

Cdigo 2
PreparedStatement ps=cn.prepareStatement("UPDATE PRODUCTOS SET STOCKPRO=? WHERE NOMPRO LIKE ?");
ps.setInt(1, 75);
ps.setString(2, "Arroz");
ps.executeUpdate().

Mirando estos ejemplos podramos preguntarnos por qu utilizar un objeto


PreparedStatement con parmetros en vez de una simple sentencia, ya
que la sentencia simple implica menos pasos. Si actualizramos la columna
STOCKPRO slo una o dos veces, no sera necesario utilizar una sentencia
SQL con parmetros. Si por otro lado, tuviramos que actualizarla
frecuentemente, podra ser ms fcil utilizar un objeto PreparedStatement,
especialmente en situaciones cuando la utilizamos con un bucle while para
seleccionar un parmetro a una sucesin de valores. Veremos este ejemplo
ms adelante en esta seccin.

Una vez que a un parmetro se ha asignado un valor, el valor permanece


hasta que lo resetee otro valor o se llame al mtodo clearParameters.
Utilizando el objeto PreparedStatement: ps, el siguiente fragmento de
cdigo reutiliza una sentencia prepared despus de resetar el valor de uno
de sus parmetros, dejando el otro igual.

Utilizar una Bucle para asignar Valores

Normalmente se codifica ms sencillo utilizando un bucle for o while para


asignar valores de los parmetros de entrada. El siguiente fragmento de
cdigo demuestra la utilizacin de un bucle for para asignar los parmetros
en un objeto PreparedStatement: ps. El array stocks contiene las
cantidades del stock de los productos. Estas cantidades corresponden con
los nombres de los productos listados en el array productos, por eso la
primera cantidad de stocks (175) se aplica al primer nombre de productos
("arroz"), la segunda cantidad de stocks (150) se aplica al segundo nombre
de productos ("azcar"), etc. Este fragmento de cdigo demuestra la
actualizacin de la columna STOCKPRO para todos los nombres de
productos de la tabla PRODUCTOS.

PreparedStatement ps;

String cad="update PRODUCTOS set STOCPRO=? where


NOMPRO like ?";
ps=con.prepareStatement(cad);
int[] stocks={175, 150, 60, 155, 90};
String[]

productos={"arroz","azcar","aceite","mantequilla","leche"};
int len=stocks.length;
for(int i=0;i<len;i++)
{ ps.setInt(1, stocks[i]);
ps.setString(2, productos[i]);
ps.executeUpdate();
}

Cuando el propietario quiere actualizar los nuevos stocks de la semana


siguiente, puede utilizar el mismo cdigo como una plantilla. Todo lo que
tiene que hacer es introducir las nuevas cantidades en el orden apropiado
en el array stocks. Los nombres de los productos permanecen constantes,
por eso no necesitan cambiarse. (en una aplicacin real, los valores
probablemente sern introducidos por el usuario en vez de hacerlos a travs
de un array).

Creacin de aplicaciones swing que realicen consultas en JTables.

Realizar una aplicacin que permita seleccionar desde una lista desplegable
la categora de un producto y luego mostrar la lista de productos
pertenecientes a dicha categora. Los elementos de la lista desplegable
deben ser tomados desde la tabla categoras.

LGICA DE PRESENTACIN

Clase
Paquete
Descripcin
categora

: FrmProductosCategorias
: View
: Esta aplicacin filtra los datos de los productos de acuerdo con la

package View;

import Ds.GestionBD;
import java.sql.*;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;
public class frmConsultaProductos extends javax.swing.JFrame {
GestionBD gbd=new GestionBD();

private void jComboBox1ItemStateChanged(java.awt.event.ItemEvent evt) {

// TODO add your handling code here:


try {
gbd.conectar();
String codcat="";
codcat=((String)jComboBox1.getSelectedItem()).substring(0, 2);
String sql="Select * from productos where codcat="+codcat;
ResultSet rs=gbd.ejecutarConsulta(sql);

DefaultTableModel dtm=new DefaultTableModel();


dtm.addColumn("Codproducto");
dtm.addColumn("Producto");
dtm.addColumn("Descripcion");
dtm.addColumn("Marca");
dtm.addColumn("Precio");
dtm.addColumn("Stock");

while(rs.next()){ //Recorre el esquema de datos fila a fila


Object[] fila=new Object[6];
fila[0]=rs.getObject(1);
fila[1]=rs.getObject(2);
fila[2]=rs.getObject(3);
fila[3]=rs.getObject(4);
fila[4]=rs.getObject(5);
fila[5]=rs.getObject(6);

dtm.addRow(fila);
} //Fin del While

jTable1.setModel(dtm); //Enviar el dtm al JTable


} catch (Exception e) {
JOptionPane.showMessageDialog(null,"Error: "+e.getMessage());
}
}
}

Nota: Se requiere en el paquete Ds, la clase GestionBD