iv unidad lenguaje de programacion ii
TRANSCRIPT
7/21/2019 IV Unidad Lenguaje de Programacion II
http://slidepdf.com/reader/full/iv-unidad-lenguaje-de-programacion-ii 1/40
INTRODUCCIÓN
a) Presentación y contextualizaciónEn esta Unidad aprenderás a construir aplicaciones de escritorio con
conexión a base de datos utilizando la tecnología JDBC.
b) CompetenciasElabora una aplicación informática con conexión a base de datos y
POO usando la tecnología JDBC.
c) Capacidades1. Comprende la forma cómo trabaja la tecnología 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 programación orientada a objetos al programar una
aplicación con base de datos.
4. Aplica sentencias precompiladas con los datos de una tabla.
d) Actitudes Cumple con responsabilidad la presentación de los trabajos
encomendados a través de la plataforma virtual.
Desarrolla la creatividad, la innovación, la actitud emprendedora y el
respeto a la honestidad intelectual.
a) Presentación de ideas básicas y contenido esenciales de la
Unidad.
7/21/2019 IV Unidad Lenguaje de Programacion II
http://slidepdf.com/reader/full/iv-unidad-lenguaje-de-programacion-ii 2/40
La Unidad de Aprendizaje 04: Desarrollo De Aplicaciones De
Escritorio Con JDBC comprende el desarrollo de los siguientes temas :
Tema 01: Introducción a la Tecnología JDBC
Tema 02: Estableciendo una Conexión de Datos
Tema 03: Aplicando POO para la Gestión de Operaciones con
una Base de Datos
Tema 04: La interface PreparedStatement
7/21/2019 IV Unidad Lenguaje de Programacion II
http://slidepdf.com/reader/full/iv-unidad-lenguaje-de-programacion-ii 3/40
Tema 1: La Introducción a la Tecnología JDBC
Java Database Connectivity (JDBC) es una interface de acceso a basesde datos estándar SQL que proporciona un acceso uniforme a una gran
variedad de bases de datos relacionales desde Java.
FUNCIONES DEL JDBC
1. Establecer una conexión 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 implementación especifica de acuerdo al tipo de gestor de
base de datos con la cual vayamos a trabajar, esta implementación esconocida con el nombre de driver, esto otorga una gran ventaja al JDBC al
poder trabajar con múltiples orígenes de base de datos, lo único que se
requiere es contar con el driver especifico.
CARACTERÍSTICAS Y LOS DRIVERS DEL JDBC
7/21/2019 IV Unidad Lenguaje de Programacion II
http://slidepdf.com/reader/full/iv-unidad-lenguaje-de-programacion-ii 4/40
Los Drivers también 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 unaaplicación Java pueda conectarse con una BD,
la misión del manejador será traducir
comandos estándar 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 tecnología está basada fundamentalmente en
las siguientes interfaces:
a. Driver
b. DriverManager
c. Connection
d. Statement
7/21/2019 IV Unidad Lenguaje de Programacion II
http://slidepdf.com/reader/full/iv-unidad-lenguaje-de-programacion-ii 5/40
e. PreparedStatement
f. CallableStatement
g. ResultSet
REGISTRAR DE UN DRIVER (MANEJADOR)
Registrar un manejador no es más 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 método
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 método connect de los drivers registrados para intentar establecer la
conexión 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 aplicación. Es posible que sea
necesario que en una misma aplicación se tenga varios manejadores para
acceder a varias bases de datos.
7/21/2019 IV Unidad Lenguaje de Programacion II
http://slidepdf.com/reader/full/iv-unidad-lenguaje-de-programacion-ii 6/40
Los métodos que más nos interesan de esta clase son:
static Connection getConnection(String url); static Conn ection getConnection(Stri ng u r l, Str in g user , String password) .
Estos métodos intentan establecer conexión 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 método y el otro, obviamente,
es que en uno sólo se especifica la base de datos a la que nos queremosconectar, mientras que en el otro se indica también 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 conexión a esta, de un modo único. Toda URL de
JDBC consta siempre de tres partes:
Protocolo:
subprotocolo:subnombre.
7/21/2019 IV Unidad Lenguaje de Programacion II
http://slidepdf.com/reader/full/iv-unidad-lenguaje-de-programacion-ii 7/40
Ejemplo: "jdbc:odbc:usuarios"
Veamos cada una de las partes del URL:
1. Protocolo de la conexión. Siempre es jdbc.
2. Subprotocolo de la conexión. Identifica el tipo de mecanismo deconexión que emplearemos para acceder a la base de datos.
3. Subnombre, identifica la base de datos con la que queremos
establecer una conexión.
Métodos de la Clase DriverManager
Todos los métodos que encontramos en esta clase son estáticos (no
requieren instancia para poder utilizarlo) y se comentan brevemente a
continuación:
Método DescripciónConnection getConnection(Stringurl)
Establece una conexión con la base de datos identificada por la URLde JDBC que se pasa por parámetros.
Connection getConnection(Stringurl, Properties info)
Establece una conexión con la base de datos identificada por la URLde JDBC que se pasa por parámetros.
Connection getConnection(Stringurl, String usuario, Stringcontraseña)
Establece una conexión con la base de datos pero en su segundoparámetro especifica propiedades que posee el driver, como puede serla base de datos, el usuario, la contraseña, etc. Estas propiedades seorganizan en pares propiedad/valor.
void println(String mensaje) Escribe un mensaje en el flujo de actividad actual void setLoginTimeout(intsegundos)
Establece el tiempo de espera que el driver utilizará para realizar unaconexión.
INTERFACE CONNECTION
7/21/2019 IV Unidad Lenguaje de Programacion II
http://slidepdf.com/reader/full/iv-unidad-lenguaje-de-programacion-ii 8/40
Representa una conexión con la base de datos. Permite crear objetos que
representan consultas que se ejecutarán en la base de datos, y permite
acceder a información sobre las posibilidades del manejador JDBC.
En esta tabla recogemos los principales métodos de la interfaz Connection .
Sobre muchos de ellos volveremos a hablar más adelante.
Métodos de la Interfaz Connection Método Descripción
void close() Cierra una conexión, liberando todos los recursos asociados a la misma.
boolean isClosed () Devuelve verdadero, si la conexión está cerrada
boolean isReadOnly() Devuelve true, si la conexión es de sólo lectura
PreparedStatementprepareStatement(Str ing sql)
Crea un objeto PreparedStatement que va a permitir enviar y ejecutar sentenciasSQL parametrizadas a la base de datos correspondiente.
PreparedStatement
prepareStatement(Str ing sql ,
int t ipo ResultSet , int
t ipoConcurrencia)
Igual que el método anterior, pero permite especificar las características delResultSet que se obtendrá a la hora de ejecutar el objeto PreparedStatementcorrespondiente.
void commit() Hace permanentes los cambios que se realizaron desde el último commit orollback.
Statement createStatement() Crea un objeto de tipo Statement.
bolean getAutoCommit() Indica si está en modo auto-commit.
CallableStatementprepareCall(String sql)
Crea un objeto CallableStatement para ejecutar procedimientos almacenadosSQL en la BD.
PreparedStatementprepareStatement(String sql)
Crea un objeto PreparedStatement para ejecutar consultas SQL parametrizadasen la BD.
void rollback() Deshace todos los cambios realizados desde la última vez que se ejecutó commito rollback
void close() Cierra una conexión, liberando todos los recursos asociados a la misma.
7/21/2019 IV Unidad Lenguaje de Programacion II
http://slidepdf.com/reader/full/iv-unidad-lenguaje-de-programacion-ii 9/40
Statement createStatement(inttipoResultSet, inttipoConcurrencia)
Crea también una sentencia SQL pero generará en su ejecución un objetoResultSet con unas características determinadas.
boolean isClosed () Devuelve verdadero si la conexión está cerrada
boolean isReadOnly() Devuelve true si la conexión es de sólo lectura
PreparedStatementprepareStatement(Str ing sql)
Crea un objeto PreparedStatement que va a permitir enviar y ejecutar sentenciasSQL parametrizadas a la base de datos correspondiente.
PreparedStatement
prepareStatement(Str ing sql ,
int t ipo ResultSet , int
t ipoConcurrencia)
Igual que el método anterior, pero permite especificar las características delResultSet que se obtendrá a la hora de ejecutar el objeto PreparedStatementcorrespondiente.
INTERFACE STATEMENT
Esta interfaz permite enviar instrucciones SQL a la base de datos. Podemos
obtener un objeto que implemente esta interfaz a partir del
método Statement createStatement() de la interfaz
Connec t ion .
Para ejecutar una consulta tipo SELECT se emplea el método
executeQuery (String sql). Este método devuelve un objeto tipo ResultSet .
Para ejecutar una instrucción tipo DELETE, UPDATE, INSERT o una
instrucción DDL (Data Definition Language) se emplea
executeUpdate(Str ing s ql ) .
Mediante el método execute(String sql) podemos ejecutar cualquiera de
los comandos anteriores.
7/21/2019 IV Unidad Lenguaje de Programacion II
http://slidepdf.com/reader/full/iv-unidad-lenguaje-de-programacion-ii 10/40
Un objeto Statement se usa para enviar sentencias SQL a la base de datos.
Actualmente hay tres tipos de objetos Statement, todos ellos actúan como
contenedores para la ejecución de sentencias en una conexión dada: Statement,
PreparedStatement que hereda de Statement, y CallableStatement que hereda dePreparedStatement. Estas están especializadas para enviar tipos particulares de
sentencias SQL
Los métodos más importantes de la interfazStatement son:
Método Descripciónvoid cancel() Cancela el objeto Statement, abortando la
sentencia SQL correspondiente.
void close() Cierra el objeto Statement, liberando todos losrecursos asociados de forma inmediata.
boolean execute(String sql) Ejecuta la sentencia SQL, que se pasa porparámetro
ResultSetexecuteQuery(String sql)
Ejecuta una sentencia SQL, que devuelve unconjunto de resultados, representado por elobjeto ResultSet.
int executeUpdate(Stringsql)
Ejecuta la sentencia SQL que se pasa porparámetro y debe ser del tipo INSERT,UPDATE o DELETE
Connection getConnection() Devuelve el objeto Connection a partir del quese ha creado el objeto Statement
Creando un objeto Statement
7/21/2019 IV Unidad Lenguaje de Programacion II
http://slidepdf.com/reader/full/iv-unidad-lenguaje-de-programacion-ii 11/40
Una vez que se ha establecido una conexión a una base de datos determinada,esta conexión se puede utilizar para ejecutar sentencias SQL.
Connectioncn=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 método executeQuery . Ejemplo:
Connection c n=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 datosde una tabla, utilizaremos el método executeUpdate . Ejemplo:
Connection cn=DriverManager.getConnection(url,”pepe”,”xxx”);Statement st=cn.createStatement();st.executeQuery(“insert into Clientes values (“‘001’,’Garcia
Díaz’,’Carla’”);
ENVIO DE SENTENCIAS SQLJDBC suministra tres clases para el envío de sentencias SQL. Estas clases
son las siguientes:
Statement.- Creada por el método createStatement. Un objeto Statementse usa para enviar sentencias SQL simples.
PreparedStatement.- Creada por el método prepareStatement. Un objeto PreparedStatement se usa para sentencias SQL que
toman uno o más parámetros como argumentos de entrada (parámetros IN). El PreparedStatement extienden Statement y por
tanto heredan los métodos de Statement. Un objeto PreparedStatement es potencialmente más eficiente que un objeto Statement
porque este ha sido precompilado y almacenado para su uso futuro.
CallableStatement.- Creado por el método prepareCall. Los objetos
CallableStatement se usan para ejecutar procedimientos almacenados .
7/21/2019 IV Unidad Lenguaje de Programacion II
http://slidepdf.com/reader/full/iv-unidad-lenguaje-de-programacion-ii 12/40
Un objeto CallableStatement hereda métodos para el manejo de los
parámetros IN de PreparedStatement, y añade métodos para el manejo de
los parámetros 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 código presenta el objeto ResultSet: rs y le asigna el resultado
de una consulta anterior.
ResultSet rs=st.executeQuery(“Select codcli,apecli,nomcli from Clientes”);
7/21/2019 IV Unidad Lenguaje de Programacion II
http://slidepdf.com/reader/full/iv-unidad-lenguaje-de-programacion-ii 13/40
El ResultSet es una estructura similar a la tabla de datos con la diferencia
que no es física, sino de tipo virtual, se creará en la memoria del servidor y
desde allí se tomarán los datos para mostrarlos posteriormente en el cliente.
METODOS DEL RESULTSET
Nombre delMétodo
Descripción
previous() Envía el puntero a la fila anterior del objeto ResultSet. (devuelve true siencuentra la fila anterior)
next() Envía el puntero a la fila siguiente del objeto ResultSet. (devuelve true siencuentra la fila siguiente)
first() Envía el puntero a la primera fila del objeto ResultSet. (devuelve true si seencuentra primera fila)
last() Envía el puntero a la última fila del objeto ResultSet. (devuelve true si seencuentra última fila)
isFirst() Devuelve verdadero, si el puntero se encuentra en la primera fila getString() Captura un dato de tipo String del esquema de datosgetInt() Captura un dato de tipo int del esquema de datosgetDate() Captura un dato de tipo Date del esquema de datos
getBoolean() Captura un dato de tipo boolean del esquema de datosgetDouble() Captura un dato de tipo double del esquema de datos
getLong() Captura un dato de tipo long del esquema de datos
EL MÉTODO NEXT
El método 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 cursorinicialmente se posiciona justo encima de la primera fila de un objeto
ResultSet, primero debemos llamar al método next para mover el cursor a
la primera fila y convertirla en la fila actual. Sucesivas invocaciones del
método next moverán el cursor de línea en línea hacia adelante. Existen
otros métodos con los cuales podemos mover el puntero de la tabla o
consultar sobre la posición actual del puntero (en la tabla anterior, aparece
la lista de métodos que mueven el puntero de la tabla).
7/21/2019 IV Unidad Lenguaje de Programacion II
http://slidepdf.com/reader/full/iv-unidad-lenguaje-de-programacion-ii 14/40
CONSEGUIR LOS DATOS DEL RESULTSET
Método getXXX
(XXX representa al tipo de dato, ejemplo: getDouble(), getString(),getLong(), etc)
Los métodos getXXX del tipo apropiado se utilizan para recuperar el valorde 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 filaactual
Nota: La primera columna del ResultSet corresponde al número 1 Podemos referirnos a un dato del ResultSet mediante su número o
nombre de
columna.
Para conseguir otros tipos de datos contamos con los siguientes métodos:
7/21/2019 IV Unidad Lenguaje de Programacion II
http://slidepdf.com/reader/full/iv-unidad-lenguaje-de-programacion-ii 15/40
getByte
getShort
getInt
getLong
getFloat
getDouble
getBigDecimal
getBoolean
getString
getBytes
getDate
getTime
El ResultSet generado tiene la siguiente estructura:
7/21/2019 IV Unidad Lenguaje de Programacion II
http://slidepdf.com/reader/full/iv-unidad-lenguaje-de-programacion-ii 16/40
7/21/2019 IV Unidad Lenguaje de Programacion II
http://slidepdf.com/reader/full/iv-unidad-lenguaje-de-programacion-ii 17/40
Tema 2: Estableciendo una conexión de datos
Las conexiones JDBC, tal como estudiamos en la semana anterior, nos
permiten conectarnos con diferentes orígenes 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 código fuente es la forma de
conexión, mientras que todo lo demás 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 página de mysql en
Internet: http://dev.mysql.com/downloads/connector/j/ El archivo a
7/21/2019 IV Unidad Lenguaje de Programacion II
http://slidepdf.com/reader/full/iv-unidad-lenguaje-de-programacion-ii 18/40
descargar debe ser un archivo de extensión 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 versión, lo mismo
que la carpeta del JDK)
Pasos necesarios para Establecer una Conexión JDBC
1. Importar las clases del paquete java.sql
Para utilizar esta tecnología, 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
Stringdriver="com.mysql.jdbc.Driver";
Class.forName(driver);
7/21/2019 IV Unidad Lenguaje de Programacion II
http://slidepdf.com/reader/full/iv-unidad-lenguaje-de-programacion-ii 19/40
3. Abrir la conexión
La forma común de establecer una conexión con una base de datos es
llamar al método getConnection() de la clase DriverManager , a este
método se le debe pasar como parámetro la URL de JDBC que identifica
a la base de datos con la que queremos realizar la conexión. La ejecución
de este método devolverá un objeto Connection que representará la
conexión con la base de datos.
La sintaxis general para realizar una conexión 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 conexión esté abierta)
7/21/2019 IV Unidad Lenguaje de Programacion II
http://slidepdf.com/reader/full/iv-unidad-lenguaje-de-programacion-ii 20/40
st=cn.createStatement();
5. Crear el esquema de datos (Objeto ResultSet)
A partir de la ejecución del comando Select.
rs=stmt.executeQuery("select * from Clientes");
6. Visualizar elcontenido del esquemade datos
while(rs.next()) // método 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 conexión
7/21/2019 IV Unidad Lenguaje de Programacion II
http://slidepdf.com/reader/full/iv-unidad-lenguaje-de-programacion-ii 21/40
rs.close();
cn.close();
CODIGO FUENTE COMPLETO PARA REALIZAR LA CONEXIÓN CON LA BASE DE DATOSCOMERCIAL Y MOSTRAR EL CONTENIDO DE LA TABLA CLIENTES
7/21/2019 IV Unidad Lenguaje de Programacion II
http://slidepdf.com/reader/full/iv-unidad-lenguaje-de-programacion-ii 22/40
7/21/2019 IV Unidad Lenguaje de Programacion II
http://slidepdf.com/reader/full/iv-unidad-lenguaje-de-programacion-ii 23/40
Tema 3: Aplicando POO p ara la gestión deoperaciones
con una Base de datos
PROGRAMACIÓN EN CAPAS
Tal como se aprendió en el ciclo anterior, la programación en capas
nos ofrece grandes ventajas:
Separar la lógica de los diferentes niveles de nuestra aplicación El mantenimiento de software es menos engorroso y complejo Permite el trabajo en equipo por parte de los profesionales
informáticos, cada equipo se concentrará en un determinado
nivel. Cada nivel se encuentra integrado al otro. La programación en capas se amolda a las metodologías
modernas del desarrollo de sistemas.
Una aplicación puede ser desarrollada en capas, pudiendo ser
estas:
a. Lógica de Presentación: se limita a la interfaz del cliente
desde donde se realizan las entradas y salidas de datos. En
esta capa también se puede realizar la validación del ingreso
de datos.
b. Lógica de Negocios: incluye la programación de los distintos
procesos que se dan en nuestro sistema.
c. Lógica de Datos: esta capa se encarga de la gestión de
datos a través de las operaciones elementales: conectar,
desconectar, ejecutar consultas y ejecutar actualiaciones.
7/21/2019 IV Unidad Lenguaje de Programacion II
http://slidepdf.com/reader/full/iv-unidad-lenguaje-de-programacion-ii 24/40
d. Otras capas: Incluye a otros tipos de componentes, tales
como: librerías dinámicas, etc.
CASO PRÁCTICO:Realiza una aplicación visual con orientación a objetos que realice las principales
operaciones de mantenimiento de datos.
L GICA DE DATOS
Clase : GestionBD.javaPaquete : DsDescripción : Esta clase contiene los métodos que permitirán que nuestraaplicación se conecte con la base de datos y se ejecuten los comandos sql.
package Ds;import java.sql.*;public class GestionBD {
7/21/2019 IV Unidad Lenguaje de Programacion II
http://slidepdf.com/reader/full/iv-unidad-lenguaje-de-programacion-ii 25/40
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 PRESENTACIÓN
Clase : FrmClientes.java
Paquete : view
7/21/2019 IV Unidad Lenguaje de Programacion II
http://slidepdf.com/reader/full/iv-unidad-lenguaje-de-programacion-ii 26/40
Descripción : Esta clase representa al formulario que contiene la interfacede usuario
package View;//Importamos los paquetes con los que trabajeremos en esteformularioimport java.sql.*;import Ds.*;import Model.*;import javax.swing.JOptionPane;importjavax.swing.table.DefaultTableModel;
public class frmClientes extendsjavax.swing.JFrame {//Instanciamos la clase quecorresponde a la lógica de datosGestionBD 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 ventanacargardatos();desactivar();
}
private void btninsActionPerformed (java.awt.event.ActionEvent evt){// Al hacer click en el botón insertartxtapecli.requestFocus();
tipo="INS";activar();
ClienteModel em=new ClienteModel();txtcod.setText(em.generarcodigo());
}
private void btnmodActionPerformed (java.awt.event.ActionEventevt) {// Al hacer click en el botón modificar
7/21/2019 IV Unidad Lenguaje de Programacion II
http://slidepdf.com/reader/full/iv-unidad-lenguaje-de-programacion-ii 27/40
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.ActionEventevt) {// Al hacer click en el boton eliminartry {
int fila = jTable1.getSelectedRow(); //Obtener filaseleccionada
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.ActionEventevt) {try {// Al hacer click en el botón grabarString 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 intoClientes(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+"'";}
7/21/2019 IV Unidad Lenguaje de Programacion II
http://slidepdf.com/reader/full/iv-unidad-lenguaje-de-programacion-ii 28/40
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 busquedaString 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 afila 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());
}}
7/21/2019 IV Unidad Lenguaje de Programacion II
http://slidepdf.com/reader/full/iv-unidad-lenguaje-de-programacion-ii 29/40
private voidbtnCancelarActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:limpiar();
desactivar();}
//Muestra el esquema de datos incial en el JTableprivate 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 afilaObject[] 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 textotxtcod.setText("");
7/21/2019 IV Unidad Lenguaje de Programacion II
http://slidepdf.com/reader/full/iv-unidad-lenguaje-de-programacion-ii 30/40
txtapecli.setText("");txtnomcli.setText("");
txtdircli.setText("");txtdiscli.setText("");
}
private voiddesactivar(){//Desactivaalgunas cajasde texto
txtcod.setEnabled(false);txtapecli.setEnabled(false);
txtnomcli.setEnabled(false);txtdircli.setEnabled(false);
txtdiscli.setEnabled(false);}
private void activar (){ //Desactiva algunas cajas de textotxtcod.setEnabled(true);txtapecli.setEnabled(true);
txtnomcli.setEnabled(true);txtdircli.setEnabled(true);txtdiscli.setEnabled(true);
btnGrabar.setEnabled(true);btnCancelar.setEnabled(true);
LOGICA DE NEGOCIOS
Clase : ClienteModelPaquete : ModelDescripción : Esta clase representa la lógica de negocios (procesos)
7/21/2019 IV Unidad Lenguaje de Programacion II
http://slidepdf.com/reader/full/iv-unidad-lenguaje-de-programacion-ii 31/40
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 filaString 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
}}
7/21/2019 IV Unidad Lenguaje de Programacion II
http://slidepdf.com/reader/full/iv-unidad-lenguaje-de-programacion-ii 32/40
7/21/2019 IV Unidad Lenguaje de Programacion II
http://slidepdf.com/reader/full/iv-unidad-lenguaje-de-programacion-ii 33/40
Tema 04: La interface Prepared Statement
Algunas veces es más conveniente o eficiente utilizar objetos
PreparedStatement para enviar sentencias SQL a la base de datos.
Cuándo utilizar un objeto PreparedStatement
Si queremos ejecutar muchas veces un objeto Statement, reduciremos el
tiempo de ejecución si utilizamos un objeto PreparedStatement, en su lugar.
La característica 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 mayoría de los casos, esta sentencia
SQL se enviará al controlador de la base de datos inmediatamente, donde
será compilado. Como resultado, el objeto PreparedStatementno sólo
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 compilarlanuevamente.
La ventaja de PreparedStatement es que utilizan parámetros 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 = ? WHERENOMPRO LIKE ?");
7/21/2019 IV Unidad Lenguaje de Programacion II
http://slidepdf.com/reader/full/iv-unidad-lenguaje-de-programacion-ii 34/40
La variable ps contiene la sentencia SQL,
"UPDATE PRODUCTOS SET
STOCKPRO = ? WHERE NOMPRO
LIKE?" , que también ha sido, en lamayoría de los casos, enviada al
controlador de la base de datos, y
precompilado.
Suministrar Valores para los Parámetros de un PreparedStatement
Necesitamos suministrar los valores que se utilizarán en los lugares donde
están las marcas de interrogación, antes de ejecutar un objeto
PreparedStatement . Podemos hacer esto llamando a uno de los métodos
setXXX definidos en la clase PreparedStatement . Si el valor que queremos
sustituir por una marca de interrogación es un int de Java, podemos llamar
al método setInt . Si el valor que queremos sustituir es un String de Java,
podemos llamar al método setString , etc. En general, hay un métodosetXXX para cada tipo Java. Utilizando el objeto ps del ejemplo anterior, la
siguiente línea de código selecciona la primera marca de interrogación para
un int de Java, con un valor de 75.
ps.setInt(1, 75);
7/21/2019 IV Unidad Lenguaje de Programacion II
http://slidepdf.com/reader/full/iv-unidad-lenguaje-de-programacion-ii 35/40
Como podríamos asumir a partir de este ejemplo, el primer argumento de
un método setXXX indica la marca de interrogación que queremos
seleccionar, y el segundo argumento el valor que queremos ponerle. El
siguiente ejemplo selecciona la segunda marca de interrogación con el string"Arroz ".
ps.setString(2, "Arroz");
Después de que estos valores hayan sido asignados para sus dos
parámetros, la sentencia SQL de ps será equivalente a la sentencia SQL
que hay en el string cad del siguiente ejemplo. Por lo tanto, los dosfragmentos siguientes de código hacen lo mismo.
Código 1
String cad="UPDATE PRODUCTOS SET STOCKPRO=75 WHERE NOMPRO LIKE 'Arroz'";stmt.executeUpdate(cad);
Código 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 podríamos preguntarnos por qué utilizar un objeto
PreparedStatement con parámetros en vez de una simple sentencia, yaque la sentencia simple implica menos pasos. Si actualizáramos la columna
STOCKPRO sólo una o dos veces, no sería necesario utilizar una sentencia
SQL con parámetros. Si por otro lado, tuviéramos que actualizarla
frecuentemente, podría ser más fácil utilizar un objeto PreparedStatement ,
especialmente en situaciones cuando la utilizamos con un bucle while para
seleccionar un parámetro a una sucesión de valores. Veremos este ejemplo
más adelante en esta sección.
7/21/2019 IV Unidad Lenguaje de Programacion II
http://slidepdf.com/reader/full/iv-unidad-lenguaje-de-programacion-ii 36/40
Una vez que a un parámetro se ha asignado un valor, el valor permanece
hasta que lo resetee otro valor o se llame al método clearParameters .
Utilizando el objeto PreparedStatement : ps , el siguiente fragmento de
código reutiliza una sentencia prepared después de resetar el valor de uno
de sus parámetros, dejando el otro igual.
Utilizar una Bucle para asignar Valores
Normalmente se codifica más sencillo utilizando un bucle for o while para
asignar valores de los parámetros de entrada. El siguiente fragmento de
código demuestra la utilización de un bucle for para asignar los parámetros
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 (" azúcar "), etc. Este fragmento de código demuestra la
actualización de la columna STOCKPRO para todos los nombres de
productos de la tabla PRODUCTOS.
PreparedStatement ps;
7/21/2019 IV Unidad Lenguaje de Programacion II
http://slidepdf.com/reader/full/iv-unidad-lenguaje-de-programacion-ii 37/40
String cad="update PRODUCTOS set STOCPRO=? whereNOMPRO like ?";ps=con.prepareStatement(cad);int[] stocks={175, 150, 60, 155, 90};String[]
productos={"arroz","azúcar","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 código 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 aplicación real, los valores
probablemente serán introducidos por el usuario en vez de hacerlos a travésde un array).
Creación de aplicaciones swing que realicen consultas en JTables.
Realizar una aplicación que permita seleccionar desde una lista desplegablela categoría de un producto y luego mostrar la lista de productos
pertenecientes a dicha categoría. Los elementos de la lista desplegable
deben ser tomados desde la tabla categorías.
7/21/2019 IV Unidad Lenguaje de Programacion II
http://slidepdf.com/reader/full/iv-unidad-lenguaje-de-programacion-ii 38/40
LÓGICA DE PRESENTACIÓN
Clase : FrmProductosCategoriasPaquete : ViewDescripción : Esta aplicación filtra los datos de los productos de acuerdo con lacategoría
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) {
7/21/2019 IV Unidad Lenguaje de Programacion II
http://slidepdf.com/reader/full/iv-unidad-lenguaje-de-programacion-ii 39/40
// 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 filaObject[] 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
7/21/2019 IV Unidad Lenguaje de Programacion II
http://slidepdf.com/reader/full/iv-unidad-lenguaje-de-programacion-ii 40/40