• No results found

Performance and Evaluation

Revisión de Conocim ientos 

Laboratorio de Lenguaje de Prog-I ( Netbeans)

1 -El Objetivo de la guia es desarrollar la primera aplicación en Java que interactúe con una base de Datos de Sql Server 2005 (Sistemacont) . Inicialmente se debe configurar el Sql server 2005 para conectarse al servidor con autentificación SQL con el Usuario sa y sin contraseña . Luego se procede a restaurar la BD Sistemacont , utilizando el archivo backup.

Ejecutar Netbean 6.5.1 y crear un Nuevo Proyecto denominado Appsistema con la configuración inicial siguiente:

Con lo cual se creara el paquete inicial denominado appsistema y en su interior la clase Principal que contiene el método main ( punto inicial de ejecución de toda aplicación en Java).

Adicionalmente se debe crear los siguientes Paquetes dentro de Source Packages:

forms.- Contendrá todos los Frames ( formularios) de la Aplicación. También se le denomina ui , Cliente, interfaz

modelo.- contendrá todas las clases no visuales que se obtienen de realizar la abstracción para resolver el problema( Ejemplo: ConexBD, Usuario, UsuarioBD, Personal ,PersonalBD,…etc).

resources.- Contendrá las imágenes, videos y diversos recursos multimedia que utiliza la aplicación.

El siguiente paso es fundamental: Agregar a la sección de Libraries del Proyecto el Archivo controlador de la BD (driver) a utilizar ,en este caso es sqljdbc.jar .

La aplicación utilizara las diversas clases e interfaces que incorpora el driver o archivo controlador de la BD, así como sus m

é

todos correspondientes , para acceder a las operaciones a la BD.

conexión inicial con una Base de Datos especifica. Verificar que el paquete que utiliza ConexBD se llame modelo. ( package modelo;)

-Crear los siguientes Formularios JFrame Form en el paquete forms:

FrmAcceso Frmmenu

txtusu txtclave

2-Crear la clase Usuario dentro del paquete modelo, la cual contendrá los atributos que contiene cualquier usuario de la aplicación : usuario, clave y nivel. Los 3 atributos son de tipo cadena y que debe corresponder con los campos de la tabla usuario. Se deben encapsular los campos de esta clase( crear los Métodos get y set)

package modelo;

 public class Usuario {

protected String usuario;

protected String clave;

protected String nivel;

 public Usuario(){

usuario="";

clave=""; nivel="";

}

 public Usuario(String usuario, String clave, String nivel){ this.usuario=usuario;

this.clave=clave; this.nivel=nivel; }

 public String getUsuario() {

return usuario; }

 public void setUsuario(String usuario) {

this.usuario = usuario; }

 public String getClave() {

return clave; }

 public void setClave(String clave) {

this.clave = clave; }

 public String getNivel() {

return nivel; }

 public void setNivel(String nivel) {

this.nivel = nivel; }

}

3-Crear la clase UsuarioBD dentro del paquete modelo , que hereda de la clase ConexBD sus atributos y métodos. Posteriormente Ud. creara las clases PersonalBD, VentasBD y ProductosBD que también tienen como clase padre a ConexBD. El contenido de la clase UsuarioBD sera:

package modelo;

import java.sql.Connection;

import java.sql.ResultSet;

import java.sql.SQLException;

 public class UsuarioBD extends ConexBD {

private Usuario usuario;

private String tabla;

 public UsuarioBD(String bd){ super(bd);

tabla="Usuarios";

try{

st= cn.createStatement( ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE );

rs= st.executeQuery("Select * from "+tabla);

}catch(SQLException e1){

System.out.println("ERROR SQL:"+ e1.getMessage()); }

}

public boolean insertar (Usuario u){

sql="insert into "+ tabla + " values('" +u.getUsuario()+

"','"+u.getClave()+"','"+ u.getNivel() +"')"; try{

st=cn.createStatement( ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE ); st.executeUpdate(sql);

rs = st.executeQuery("SELECT * FROM "+tabla);

return true; } catch(SQLException e1){ System.out.println("ERROR SQL:"+ e1.getMessage()); return false; } }

 public boolean eliminar (String usuario){

sql="delete from "+ tabla + " where usuario='" +usuario+ "'"; try{

st=cn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);

st.executeUpdate(sql);

rs = st.executeQuery("SELECT * FROM "+tabla);

return true; } catch(SQLException e1){ System.out.println("ERROR SQL:"+ e1.getMessage()); return false; } } }

4-Agregar los Métodos de Acceso getXX y setXX a los 2 atributos de esta clase ( usuario y tabla), en total son 4 métodos a generar:

-getUsuario, setUsuario, getTabla y setTabla.

Para lo cual señalar un atributo de la clase UsuarioBD pulsar el botón derecho del mouse y señalar

-Refactor

-Encapsulate Fields ( Encapsular los campos o atributos, es decir generar los métodos get y set)

-Señalar las casillas de los 4 métodos y pulsar el botón refactor( refactorizar).

5-Modificar la cabecera de la clase FrmAcceso agregando el objeto u1 que se instancia de la clase UsuarioBD y también modificar el constructor para hacer la conexión con la bd sistemacont.

public class FrmAcceso extends javax.swing.JFrame { UsuarioBD u1;

/** Creates new form FrmUsuario */

publicFrmAcceso() {

initComponents();

u1= new UsuarioBD("sistemacont");

}

-Agregar el siguiente código al botón Aceptar:

private void btnAceptarActionPerformed(java.awt.event.ActionEvent evt) { String usuario, clave;

usuario=txtusu.getText();

clave=new String (txtclave.getPassword()); boolean hallado= false;

{

ResultSet rs= u1.getSt().executeQuery("select * from usuarios where usuario='"+ usuario+ "' and clave='"+ clave+"'" );

if(rs.next())

{ // si el usuario y clave son las correctas se procedea mostrar el menu principal maximizado Frmmenu m1=new Frmmenu ();

m1.setExtendedState( Frmmenu.MAXIMIZED_BOTH); m1.setVisible(true);

this.setVisible(false); }

else

{ // sino se muestra un mensaje de error JOptionPane.showMessageDialog(null, "Usuario o Clave Incorrecta"); hallado=false; } } catch(SQLException e1){ System.out.println("ERROR SQL:"+ e1.getMessage()); } }

-Crear el Formulario FrmUsuario de la clase JDialog Form en el paquete forms.

FrmUsuario (JDialog Form ) formulario modal

tblusuarios ( JTable )

txtusu

txtclave

txtnivel

Modificar la cabecera de la clase FrmUsuario agregando el Atributo u1 que se instancia de la clase UsuarioBD y también modificar el constructor para hacer la conexión con la bd sistemacont.

public class FrmUsuario extends javax.swing.JDialog { UsuarioBD u1;

/** Creates new form FrmUsuario */

public FrmUsuario(java.awt.Frame parent, boolean modal) {

super(parent, modal);

initComponents();

u1=new UsuarioBD("s istemacont");

Agregar estas 2 lineas

}

-Para realizar el Movimiento a través de los registros de la tabla con los botones de Desplazamiento ( primero, anterior, siguiente , ultimo) , crearemos el método cargarReg el cual tiene un parámetro que de tipo enumerado que especificar cual registro deseamos visualizar en el formulario. Agregar este método después de la llave de cierre del constructor:

enum Movimiento {PRIMERO, ANTERIOR,SIGUIENTE,ULTIMO};

 private void cargarReg(Movimiento r ){ try{ ResultSet rsusu=u1.getRs(); switch (r) { case PRIMERO: rsusu.first(); break; case ANTERIOR: rsusu.previous();break; case SIGUIENTE: rsusu.next();break; case ULTIMO: rsusu.last();break; } txtusu.setText(rsusu.getString(1));

txtclave.setText(rsusu.getString(2)); txtnivel.setText(rsusu.getString(3));

}catch (SQLException e1){

System.out.println("ERROR SQL en cargarReg:"+ e1.getMessage()); }

}

-El código para el botón Guardar (btnguardar) de la Ficha de Mantenimiento de es:

private voidbtnguardarActionPerformed(java.awt.event.ActionEventevt){

// TODO add your handling code here:

String usuario=txtusu.getText(); String

clave=txtclave.getText(); String nivel=txtnivel.getText();

Usuario usu =new Usuario(usuario,clave,nivel);

if (u1.insertar(usu)==true )

JOptionPane.showMessageDialog(this,"Registro Guardado");

else

JOptionPane.showMessageDialog(this, "ERROR al Guardar Registro");

}

-Código del botónListado:

private void btnlistadoActionPerformed(java.awt.event.ActionEvent evt) {

DefaultTableModel modelo1 =(DefaultTableModel)tblusuarios.getModel(); modelo1.setRowCount(0);

try

{

rs.beforeFirst(); while(rs.next()){ Object []datos={rs.getString(1),rs.getString(2),rs.getString(3) }; modelo1.addRow(datos); } }catch(SQLException e1){ System.out.println("Error SQL:"+e1.getMessage()); } }

Interfaz CallableStatement

Una vez que hemos establecido una conexión con una base de datos, podemos usar el método Connection.prepareCall para crear una sentencia callable. Estas sentencias nos permite ejecutar prodecimientos almacenados SQL. El siguiente ejemplo crea un o bjeto CallableStatement con tres parámetros para

almacenar información de la cuenta de login:

CallableStatement cs = con.prepareCall("{call accountlogin(?,?,?)}"); cs.setString(1,theuser);

cs.setString(2,password);

cs.registerOutParameter(3,Types.DATE); cs.executeQuery();

Date lastLogin = cs.getDate(3);

Interfaz PreparedStatement

El interface PreparedStatement desciende del interface Statement y usa una plantilla para crear peticiones SQL. Se usa una PreparedStatement para enviar sentencias SQL precompiladas con uno o más parámetros. Query PreparedStatement: Creamos un objeto PreparedStatement especificando la definición de plantilla y la situación de los parámetros. Los datos de los parámetros se insertan dentro del objeto PreparedStatement llamando a

sus métodos setXXX y especificando el parámetro y su dato. Las instrucciones SQL y los parámetros son enviados a la base de datos cuando se llama al método executeXXX. Este segmento de código crea un objeto PreparedStatement para seleccionar datos de usuarios basados en la dirección email del usuario. El interrogante ("?") indica que este sentencia tiene un parámetro:

PreparedStatement pstmt = con.prepareStatement ( "select theuser from registration where emailaddress like ? ") ;

//Inicializando el primer parametro con email address pstmt.setString(1, emailAddress);

ResultSet results = ps.executeQuery();

Una vez que se ha inicializado la plantilla PreparedStatement sólo se insertan los valores modificados para cada llamadas:

pstmt.setString(1, anotherEmailAddress);

Nota:  No todos los drivers de bases de datos compilan sentencias preparadas. Update PreparedStatement: Este segmento de código crea un objeto PreparedStatement para actualizar el registro de un vendedor. La plantilla tienecinco parámetros, que se seleccionan con cinco llamadas a los métodos PreparedStatement.setXXX apropiados.

PreparedStatement ps = con.prepareStatement("insert into registration(theuser, password,emailaddress, creditcard, Balance ) values ( ?, ?, ?, ?, ?)"); ps.setString(1, theuser); ps.setString(2, password); ps.setString(3, emailaddress); ps.setString(4, creditcard); ps.setDouble(5, balance); ps.executeUpdate();