Академический Документы
Профессиональный Документы
Культура Документы
El problema.
Se solicita desarrollar un sistema de administracin de usuarios con
un CRUD(Create, Read, Update, Delete) bsico nos advierten que la
aplicacin es un prototipo inicial el cual esta propenso a cambios,
pues an no se tienen definidas las ventanas con las que se va a
trabajar ni la informacin requerida, por le momento se trabajar con
una BD MySql, pero posiblemente se tenga que migrar a otro
sistema gestor....
La solucin.
Se aplica el MVC permitiendo independizar la lgica y la parte visual
del sistema usando para eso un controlador que administra los
procesos sirviendo como puente entre estos.
7
DROP TABLE IF EXISTS `persona`;
8
9
CREATE TABLE `persona` (
10
`id` int(10) NOT NULL,
11
`nombre` varchar(30) default NULL,
`edad` int(3) default NULL,
12
`profesion` varchar(30) default NULL,
13
`telefono` decimal(10,0) default NULL,
14
PRIMARY KEY (`id`)
15
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
16
17
/*Data for the table `persona` */
18
De esta forma se crea la Base de Datos a la que se va a apuntar, la
cual contiene solo una tabla Persona con la que se realizan todas las
operaciones CRUD.
como
funciona
el
Patrn:
El
Modelo.
Logica.
Clase
Conexin.
PersonaVo.
/**
* @return the idPersona
*/
public Integer getIdPersona() {
return idPersona;
}
/**
* @param idPersona the idPersona to set
*/
public void setIdPersona(Integer idPersona) {
this.idPersona = idPersona;
}
Clase
PersonaDao.
Cuando
utilizamos
estas
clases,
aplicamos
el patrn Data
Access
Object o DAO, bsicamente este patrn consiste en centralizar los
procesos de acceso a la base de datos evitando inconsistencias y
posibles problemticas cuando esto se realiza a lo largo de la
aplicacin.
Con este patrn independizamos la lgica de negocio de la lgica de
acceso a datos obteniendo mayor organizacin y flexibilidad en el
sistema.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
La
Vista.
El
Controlador.
Principal.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Clase
el
aplicativo,
Coordinador.
La Aplicacin.
Conclusiones.
Requisitos.
JDK instalado.
MySql Instalado
Ganas de Continuar.
En Marcha.
Bueno, vamos a hacer una aplicacin simple, la idea de este tutorial
es ver como conectarnos a MySql desde Java, por eso no nos
preocuparemos tanto en como se presentaran nuestra informacin, ni
los tipos de datos, ni que tan ptimo sea nuestro cdigo,
simplemente vamos a crear una base desde donde podamos trabajar.
La Aplicacin.
La Base de Datos.
Nuestra base de datos solo tendr la tabla persona con los datos
bsicos de registro (si se desea se puede dar otro enfoque a la tabla
o trabajar con muchas mas), el Script para la creacin es el
siguiente:
1
CREATE DATABASE /*!32312 IF NOT EXISTS*/`codejavu` /*!40100 DEFAULT CHARACTER SET lat
2
3
USE `codejavu`;
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Empecemos!!!
Para iniciar vamos a crear un proyecto java en Eclipse, por cuestiones
de organizacin crearemos las clases de nuestro diagrama
separndolas por paquetes, esto con el fin de tener nuestro proyecto
mas estructurado y fcil de entender, as.
DbConnection.
package prueba.connection;
import java.sql.*;
3
4
5
6
/**
* Clase que permite conectar con la base de datos
* @author chenao
*
7
8
*/
public class DbConnection {
/**Parametros de conexion*/
10
11
12
13
14
15
16
17
18
try{
19
20
Class.forName("com.mysql.jdbc.Driver");
21
//obtenemos la conexin
22
connection = DriverManager.getConnection(url,login,password);
23
if (connection!=null){
24
25
}
26
}
27
catch(SQLException e){
28
System.out.println(e);
29
}catch(ClassNotFoundException e){
30
System.out.println(e);
31
}catch(Exception e){
32
System.out.println(e);
33
34
35
36
37
38
return connection;
39
}
40
41
42
connection = null;
43
44
}
}
45
46
Clase
PersonaVO.
package prueba.vo;
2
3
4
/**
* @author chenao
*
*/
9
10
11
12
13
14
15
16
/**
* @return the idPersona
17
18
*/
public Integer getIdPersona() {
19
20
21
return idPersona;
}
/**
22
23
*/
24
25
26
27
/**
* @return the nombrePersona
28
*/
29
30
31
32
33
34
35
*/
public void setNombrePersona(String nombrePersona) {
36
37
this.nombrePersona = nombrePersona;
}
38
/**
39
40
*/
41
42
43
44
}
/**
* @param edadPersona the edadPersona to set
45
46
*/
public void setEdadPersona(Integer edadPersona) {
47
this.edadPersona = edadPersona;
48
49
/**
50
51
*/
52
53
54
55
}
/**
* @param profesionPersona the profesionPersona to set
56
57
58
59
60
*/
public void setProfesionPersona(String profesionPersona) {
this.profesionPersona = profesionPersona;
}
/**
61
62
*/
63
64
return telefonoPersona;
65
66
/**
67
68
69
70
*/
71
72
this.telefonoPersona = telefonoPersona;
73
74
}
}
75
76
77
PersonaDAO.
package prueba.dao;
2
3
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
6
7
import java.sql.Statement;
import java.util.ArrayList;
import javax.swing.JOptionPane;
import prueba.connection.DbConnection;
import prueba.vo.PersonaVO;
10
11
12
/**
* Clase que permite el acceso a la base de datos
13
* @author chenao
14
15
16
17
*/
public class PersonaDAO
{
18
19
/**
20
21
* @param persona
22
*/
23
24
25
26
try {
Statement estatuto = conex.getConnection().createStatement();
27
28
29
+persona.getProfesionPersona()+"', '"+persona.getTelefonoPersona()+"')");
30
31
estatuto.close();
32
conex.desconectar();
33
34
} catch (SQLException e) {
35
System.out.println(e.getMessage());
36
37
38
39
40
/**
41
42
* como parametro
43
44
45
46
47
* @param documento
* @return
*/
public ArrayList< personavo> consultarPersona(int documento) {
ArrayList< personavo> miEmpleado = new ArrayList< personavo>();
DbConnection conex= new DbConnection();
48
49
try {
50
51
consulta.setInt(1, documento);
52
53
54
if(res.next()){
55
56
persona.setIdPersona(Integer.parseInt(res.getString("id")));
57
persona.setNombrePersona(res.getString("nombre"));
58
persona.setEdadPersona(Integer.parseInt(res.getString("edad")));
59
60
61
62
63
64
persona.setProfesionPersona(res.getString("profesion"));
persona.setTelefonoPersona(Integer.parseInt(res.getString("telefono")));
miEmpleado.add(persona);
}
res.close();
consulta.close();
conex.desconectar();
65
66
67
} catch (Exception e) {
68
69
70
return miEmpleado;
71
72
73
74
75
76
77
78
/**
* permite consultar la lista de empleados
* @return
*/
public ArrayList< personavo> listaDePersonas() {
ArrayList< personavo> miEmpleado = new ArrayList< personavo>();
DbConnection conex= new DbConnection();
79
80
try {
81
82
83
while(res.next()){
84
85
persona.setIdPersona(Integer.parseInt(res.getString("id")));
86
persona.setNombrePersona(res.getString("nombre"));
87
persona.setEdadPersona(Integer.parseInt(res.getString("edad")));
persona.setProfesionPersona(res.getString("profesion"));
88
persona.setTelefonoPersona(Integer.parseInt(res.getString("telefono")));
89
miEmpleado.add(persona);
90
91
res.close();
92
consulta.close();
93
conex.desconectar();
94
95
} catch (Exception e) {
96
97
98
99
100
101
return miEmpleado;
102
103
104
105
106
107
Principal.
package prueba.principal;
2
3
import java.util.ArrayList;
import javax.swing.JOptionPane;
import prueba.dao.PersonaDAO;
import prueba.vo.PersonaVO;
7
8
9
10
11
PersonaDAO miPersonaDAO;
12
13
/**
* Mtodo principal, hace el llamado al men donde se
14
15
* @param args
16
17
*/
public static void main(String[] args) {
18
19
20
21
miPrincipal.verMenu();
}
22
23
/**
24
25
26
* correspondiente proceso
27
*/
28
29
30
31
32
33
34
35
\n";
36
37
try {
38
39
defineSeleccion(seleccion);
40
} catch (NumberFormatException e) {
JOptionPane.showMessageDialog(null,"Error en el ingreso de Datos, " +
41
42
verMenu();
43
} catch (Exception e) {
44
45
46
verMenu();
47
48
}
}
49
50
/**
51
52
53
* @param seleccion
54
*/
55
56
57
System.out.println("Selecciona "+seleccion);
58
59
60
61
62
63
64
65
switch (seleccion) {
case 1:
registrarPersona();
verMenu();
break;
case 2:
int doc=Integer.parseInt(JOptionPane.showInputDialog("Ingrese el numero" +
66
67
buscarPersona(doc);
68
verMenu();
69
break;
case 3:
70
obtenerRegistros();
71
verMenu();
72
break;
73
case 4:
74
System.exit(0);
75
break;
76
default:
77
78
"numero valido","ADVERTENCIA",JOptionPane.WARNING_MESSAGE);
79
verMenu();
80
break;
}
81
82
83
84
85
86
87
88
89
/**
* Permite solicitar los datos de la persona a registrar, se solicitan mediante
* atributo correspondiente del objeto persona para ser enviado al metodo de reg
* en la clase DAO
*/
90
91
92
93
94
95
String mensajeIngreso="Ingrese\n\n";
96
97
98
99
100
datosPersona[i]=JOptionPane.showInputDialog(null, mensajeIngreso+
101
datosSolicitados[i],"Datos Persona",JOptionPane.INFORMATION_MESSAGE);
102
103
System.out.println(datosSolicitados[i]+datosPersona[i]);
104
105
106
miPersona.setIdPersona(Integer.parseInt(datosPersona[0]));
107
miPersona.setNombrePersona(datosPersona[1]);
108
miPersona.setEdadPersona(Integer.parseInt(datosPersona[2]));
109
miPersona.setProfesionPersona(datosPersona[3]);
110
miPersona.setTelefonoPersona(Integer.parseInt(datosPersona[4]));
111
112
miPersonaDAO.registrarPersona(miPersona);
113
114
115
116
/**
117
118
119
120
121
122
123
124
125
126
127
128
129
if (listaPersonas.size()>0) {
int numeroPersona=0;
130
131
132
numeroPersona++;
133
miPersona=listaPersonas.get(i);
134
System.out.println("****************Persona "+numeroPersona+"****************
135
136
137
138
139
140
System.out.println("*************************************************\n");
}
141
}else{
142
JOptionPane.showMessageDialog(null,"Actualmente no " +
143
144
}
145
146
147
148
149
150
/**
* Permite la consulta de una persona en especifico mediante el envio de
* su documento de identidad como parametro, en caso de que no se retorne
151
152
153
* @param documento
154
*/
155
156
157
158
159
160
161
PersonaVO miPersona;
162
163
164
if (personasEncontrada.size()>0) {
165
//se recorre la lista y se asignan los datos al objeto para imprimir los valor
166
167
System.out.println("****************Persona*************************");
168
169
170
171
172
173
System.out.println("*************************************************\n");
174
175
}else{
176
177
178
}
179
180
181
182
183
184
Ejecutando la Aplicacin.
se
ejecute
como
debera
de
ser...
Jerarqua de excepciones
La importancia de Prever!!!
2
3
String resultado+=dividendo/divisor;
System.out.println(resultado);
5
6
Vemos
que
nos
indican
que
se
produjo
una ArithmeticException debido a una divisin por cero, adems se
muestra cual fue la traza del error pasando por el mtodo main hasta
el metodoDividir().
try {
2
3
4
5
6
7
try {
resultado+=dividendo/divisor;
}catch (Exception e) {
8
}
finally{
10
11
}
12
13
solicitar
nuevos
parmetros
de
entrada.
la salida es la siguiente:
Algunas
Consideraciones.
try {
//Sentencias con posibles errores;
} catch(InterruptedException e){
4
5
//manejo de la exepcion
} catch(IOException e){
//manejo de la exepcion
} catch(Exception e){
//manejo de la exepcion
Conclusiones.
Esta entrada es un abrebocas de lo que son el manejo de
excepciones, ya que un solo post no es suficiente para todo lo que
tiene que ver con ellas, quedan pendiente definir aspectos
como checked y unchecked (ya que aqu esto se trabajo de forma
muy general) o la forma de crear nuestras propias excepciones,
propagacin, clausulas throws entre otras.
En general vimos la importancia de controlar excepciones ya que eso
hace parte de la seguridad y calidad de nuestros desarrollos, mas
adelante se irn vinculando en otros post el uso de las mismas.........
Programacin OO.
La programacin orientada a Objetos bsicamente define una serie
de conceptos y tcnicas de programacin para representar acciones o
cosas de la vida real basada en objetos, a diferencia de otras formas
de programacin como por ejemplo la estructurada, con la POO
trabajamos de manera distinta vinculando diferentes conceptos tales
como clases, objetos, mtodos, propiedades, estados, herencia,
encapsulacin entre otros, generando cada vez interrelaciones en
nuestro desarrollo en pro del funcionamiento del sistema principal,
definiendo el programa como un conjunto de estos objetos
relacionados
entre
si.
Veamos algunos de los conceptos principales.....
Clases.
Las clases son uno de los principales componentes de un lenguaje de
programacin, pues en ellas ocurren todos los procesos lgicos
requeridos para un sistema, en si podemos definirlas como
estructuras que representan objetos del mundo real, tomando como
objetos a personas, lugares o cosas, en general las clases poseen
propiedades, comportamientos y relaciones con otras clases del
sistema. (Ver Ejemplo...)
una clase se compone por tres partes fundamentales:
Nombre :
Contiene
el
Nombre
de
la
Clase.
Atributos : Representan las propiedades que caracterizan la clase.
Mtodos : Representan el comportamiento u operaciones, la forma
como interacta la clase con su entorno.
En java se representa as :
3
4
5
6
7
8
9
10
11
Objeto.
Los objetos representan una entidad concreta o abstracta del mundo
real, en programacin bsicamente se le conoce como la instancia de
una clase en si es lo que da el sentido a estas.
Al igual que las clases se componen de tres partes fundamentales:
Estado: Representa los atributos o caractersticas con valores
concretos del objeto. Comportamiento : Se define por los mtodos
u operaciones que se pueden realizar con el. Identidad : Es la
propiedad nica que representa al objeto y lo diferencia del resto.
miObjeto.metodo();
Herencia.
2
3
/**Comportamiento.....*/
5
}
6
7
8
class Perro extends Animal{
9
10
11
12
13
/**Comportamiento.....*/
14
15
16
}
}
17
class Paloma extends Animal{
18
19
20
21
22
/**Comportamiento.....*/
23
24
}
}
25
Encapsulamiento.
Este concepto es uno de los mas importantes en trminos de
seguridad dentro de nuestra aplicacin, la encapsulacin es la forma
de proteger nuestros datos dentro del sistema, estableciendo
bsicamente los permisos o niveles de visibilidad o acceso de
nuestros
datos
Se
representa
por
niveles
6
7
8
9
10
return atributo2;
11
12
13
14
15
16
17
Clases
Abstractas.
la
abstraccin
mediante
la
palabra
as:
7
8
9
10
@Override
11
12
}
13
14
15
Interfaces.
las
usen.
interface InterfacePrincipal {
4
5
6
7
8
9
10
11
12
13
14
15
16
17
return "retorno";
}
18
19
Polimorfismo.
este
proceso
class FiguraGeometrica{
como
se
representa
en
Java.
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
miFiguraGeometrica=miCuadro;
26
27
28
29
30
31
32
33
34
}
}
La Clase String.
Es comn que se confundan los String con tipos de datos primitivos como un
int o un double pero eso es incorrecto ya que cuando decimos que trabajamos
con una variable String en realidad estamos trabajando con un Objeto y al
momento de declararlo lo que hacemos es crear instancias del mismo.
Algo que debemos tener claro es que esta clase esta enfocada a trabajar con
cadenas de caracteres constantes entonces cuando definimos un objeto String
este ser inmutable, es decir que dicho objeto no puede cambiar, si
modificamos nuestro String inicial, en realidad lo que hacemos es crear un
nuevo objeto de tipo String......
"CoDejaVu";
Existen muchos mas mtodos de la clase String, sin embargo estos son
algunos a mi parecer mas importantes (Necesitaramos muchas mas entradas
para hablar solo del String :S ), ahora veamos como funcionan, para esto
creamos el siguiente mtodo...
1
2
3
4
10
/**retorna el tamao 19 */
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/**indica si dos cadenas son iguales, enviamos otra cadena, retorna false*/
28
29
30
Podemos ver las funciones de los mtodos mencionados, sin embargo hay que
tener en cuenta que en el ejemplo anterior trabajamos siempre con el Objeto
String inicial, ya que en ningn momento le asignamos ningn valor ni creamos
otro explicitamente, si imprimimos la cadena original nos arroja " Esto Es Un
String
".....
Las
Clases
StringBuffer
StringBuilder.
StringBuffer
StringBuilder
cadena1=new
cadena2=new
StringBuffer("CoDejaVu");
y
StringBuilder("CoDejaVu");
Cuando vamos a utilizar muchas cadenas podemos usar estas clases ya que al
trabajar con el mismo objeto original hacen mas optimo el proceso, StringBuffer
y StringBuilder son prcticamente iguales (posen la misma API), la diferencia
es que StringBuilder no es Multihilo, es decir, sus metodos no se encuentran
sincronizados hacindola un poco mas veloz que su equivalente StringBuffer
por eso se recomienda que al trabajar con hilos se use esta ultima en vez de
StringBuilder....
StringBuilder.
10
11
12
13
14
15
a diferencia del ejemplo usando String, aqu todas las operaciones se asignan
al objeto inicial, evidenciando que este cada vez va cambiando dependiendo
de
los mtodos que
utilicemos.
String
Vrs
StringBuffer
Vrs
StringBuilder
Con lo anterior podemos decir que las 3 clases sirven para lo mismo, es mas,
la Clase String permite un manejo mucho mas simple teniendo en cuenta que
podemos omitir crear la instancia de un Objeto simplemente con un " = " que
hace ese proceso implcito, o que con el "+" podemos evitar el uso del concat()
o con el "+=" podemos realizar la operacin y asignarla directamente al objeto
String tal como se hace con algunos tipos de datos primitivos entre otras
facilidades que nos brinda................ y a decir verdad casi todos nos
acostumbramos a usar String por estas y otras razones, sin embargo a nivel de
rendimiento son mucho mas efectivas las otras clases que estamos evaluando,
ya que como dijimos los String son inmutables por ende dependiendo de lo que
realicemos
cada
vez crearamos objetos
de
este
tipo
y
dependiendo tambin de la cantidad de cadenas que usemos esto seria una
carga en tiempo de ejecucin, pues se tendra una gran cantidad de objetos en
memoria....
/**
*/
* @author HENAO
6
7
/**
10
*/
11
12
13
14
15
16
17
18
/**
* @param args
*/
public static void main(String[] args) {
19
20
String valorCadena="CoDejaVu";
21
String usoString=objetoCadenas.calculaTiempoString(valorCadena);
22
String usoStringBuffer=objetoCadenas.calculaTiempoStringBuffer(valorCadena);
String usoStringBuilder=objetoCadenas.calculaTiempoStringBuilder(valorCadena);
23
24
25
26
27
28
29
30
/**
31
32
33
34
35
*/
36
37
38
39
tiempo = System.currentTimeMillis();
for (int i = 0; i < ITERA ; i++) {
40
cadena += valor;
41
42
43
44
45
46
47
48
/**
* Metodo que calcula el tiempo de concatenacion de la cadena
49
50
51
52
*/
public String calculaTiempoStringBuffer(String valor)
53
54
55
56
57
cadena.append(valor);
58
59
60
61
62
/**
63
64
65
66
*/
67
68
69
70
tiempo = System.currentTimeMillis();
71
72
cadena.append(valor);
73
74
75
76
77
78
79
80
81
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
4
5
6
7
8
9
10
11
12
13
14
/**
* @author HENAO
*
*/
public class Principal {
/**
* @param args
*/
public static void main(String[] args) {
15
16
/**Objeto de la clase */
17
18
19
20
21
22
23
24
25
26
String fechaSistema=formateador.format(fechaActual);
27
28
29
30
System.out.println("\n********************************" +
31
"****************************\n");
32
33
34
String resultadoMenor=objetoPrincipal.compararFechasConDate(fecha1,fechaSistema);
System.out.println(resultadoMenor+"\n");
35
36
System.out.println("******************************" +
37
"******************************\n");
38
39
40
String resultadoIgual=objetoPrincipal.compararFechasConDate(fecha2,fechaSistema);
41
System.out.println(resultadoIgual+"\n");
42
43
System.out.println("******************************" +
44
"******************************\n");
45
46
String resultadoMayor=objetoPrincipal.compararFechasConDate(fecha3,fechaSistema);
47
System.out.println(resultadoMayor+"\n");
48
49
System.out.println("*****************************" +
"*******************************\n");
50
51
52
53
/**
54
55
* @author CHENAO
56
* @param fecha1
57
58
59
60
* @param fechaActual
* @return
*/
private String compararFechasConDate(String fecha1, String fechaActual) {
System.out.println("Parametro String Fecha 1 = "+fecha1+"\n" +
61
62
63
64
65
66
67
68
System.out.println("Parametro Date Fecha 1 = "+fechaDate1+"\n" +
69
70
71
if ( fechaDate1.before(fechaDate2) ){
72
73
}else{
74
if ( fechaDate2.before(fechaDate1) ){
75
76
}else{
77
78
79
80
}
} catch (ParseException e) {
81
82
"+e.getMessage());
83
84
85
return resultado;
86
87
}
}
88
89
En esta ocasin veremos una entrada sobre algo simple y fcil de entender
pero que nos puede ser de mucha ayuda.
Empecemos!!!
Para este caso vamos a crear un proyecto Java bsico, donde definiremos dos
paquetes, uno para las clases y otro para el archivo.properties.
Para poder acceder a estos datos desde el cdigo fuente, haremos uso de los
mtodos load y getProperty que nos provee la clase Properties.
package clases;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;
7
8
/**
* @author CHENAO
10
11
*/
12
13
14
15
Principal miPrincipal = new Principal();
16
17
18
miPrincipal.leerArchivo();
}
19
20
/**
21
22
* y se imprime en pantalla.
23
*/
private void leerArchivo() {
24
try {
25
26
27
28
29
30
propiedades
31
.load(new FileInputStream(
32
"D:/HENAO/codejavu/Workspace/PruebaProperties/src/properties/archivo.propert
33
34
35
36
37
38
39
40
41
} catch (FileNotFoundException e) {
42
43
} catch (IOException e) {
44
45
}
46
47
48
}
}
49
Al correr nuestra aplicacin podemos ver como se obtienen los datos desde la
ruta
enviada
en
el
mtodo
load.
si queremos podemos almacenar el archivo en otra ruta, por ejemplo la del
servidor
de
aplicaciones
y
luego
enviarla
como
parmetro...................................... al final la salida es
Requisitos.
IDE Eclipse
Plugin
JBoss
JDK 1.6
Variable de Entorno JBOSS_HOME
Variable de Entorno JAVA_HOME
JBoss
Tools
4.2.3.GA
Como vemos ya no tenemos ningn error o advertencia, ahora solo nos queda
dar en Finishpara crear el proyecto, despus de esto se cargara una ventana
de dialogo donde nos preguntan si deseamos cambiar a la perspectiva Web
Development perspective esto es opcional.
Para poder desplegar nuestra aplicacin, tenemos que hacer uso del servidor,
para eso desde Eclipse, en caso de que no se encuentre la vista de servidores,
se cargar desdeWindows/Show view/Server all presionamos click derecho y
agregamos new server