Foro de elhacker.net

Programación => Java => Mensaje iniciado por: Rijhording en 25 Abril 2010, 08:21 am



Título: Ejemplo de 3 capas con java
Publicado por: Rijhording en 25 Abril 2010, 08:21 am
Buenas Comunidad, quisiera saber si alguien conoce algun ejemplo de un proyecto diseñado en 3 capas con el lenguaje java, ya que estoy por iniciarme en esto y no se como esta el asunto, ya se lo que es 3 capas pero no me vendria mal un ejemplo basico. Gracias por su ayuda!!


Título: Re: Ejemplo de 3 capas con java
Publicado por: sapito169 en 25 Abril 2010, 17:42 pm
Yo trabajo con tres capas y pienso que no puedes haber preguntado nada mejor las tres capas son excelentes te ayudan a crear aplicación muy profesional siguiendo todas las cosas buenas que debe tener un buen software reutilización escalabilidad desacoplamiento y lo mas importante a lo que veo muy pocos que hacen es no mesclar la lógica de usuario con  la lógica de la aplicación

Con eso te olvidas del maldito código autogenerado con sus horribles 100 líneas que solo sirven para poner el layaut incrustado con la lógica de la aplicación si quieres cambiar de vista sin usar 3 capas tendrías que cambiarlo todo en cambio si usas 3 capas solo cambias la vista

Las 3 capas no es un patrón de diseño debido a que no resuelve un problema estándar si no que te dice de forma estricta como modelar toda la aplicación

Si trabajas con 3 capas + inyección de dependencias + interfaces y clases abstractas te va a quedar un sistema digno de un ingeniero



Título: Re: Ejemplo de 3 capas con java
Publicado por: sapito169 en 25 Abril 2010, 17:54 pm
Las 3 capas sirven para proyectos muy grandes que quieran perdurar por los siglos de los siglos si no es así mejor trabaja solo en 2 capas

Lamentablemente no es perfecta y e notado cosas muy feas acerca de las 3 capas

Aumenta la cantidad de código enormemente lo que no significa que el código este desordenado al contrario se pone muy desacoplado

Vuelve demasiado lento al principio como siempre hacer algo estricto y muy elaborado (una arquitectura) siempre es lento al principio pero al muy largo plazo devuelve el costo con intereses

No tiene muy buena integración con ides espeto netbenas (cada capa seria un modulo)

No tiene una capa que yo la llamaría de especificación o común en la cual iría todos las clases e interfaces que son comunes en todas las capas


Título: Re: entiendo
Publicado por: Rijhording en 25 Abril 2010, 18:10 pm
pero yo solamente busco un ejemplo para guiarme como debe ser leerme el codigo para entendermelo por mi mismo e buscado en san google y no hay buenos ejemplos si alguien tuviera un ejemplo en java usando 3 capas..gracias y saludos


Título: Re: Ejemplo de 3 capas con java
Publicado por: sapito169 en 25 Abril 2010, 19:03 pm
Si sigo con el ejemplo lo voy a terminar en casi hora y media para la tarde ya va estar posteado

-yo trabajo con una variación de 3 capas en realidad trabajo con 4 capas con una cuarta que seria la capa común en donde están dos paquetes el paquetes de entidades o (objetos de negocio) y el paquete de interfaces(esas interfaces que son comunes en tre las capas)

Este post es el que mas te va a gustar voy a explicar como se implementa en java 3 capas en un sentido más técnico y en el idioma de un programador casi nadie lo ase así suelen ser demasiado teóricos y no dan un ejemplo concreto
El ejemplo es el mas sencillo que se me pueda ocurrir va a ser un sistema para un restaurante que funciona bajo una misma pc sin nada espectacular (inyección de dependencias, clases abstractas) si el ejemplo no va con lo que necesitas puedes avisarme para acomodarlo a tu caso

- las capas por recomendación serian paquetes en netbenas además serian modulos

-para la capa común iría  en com.PollitosPeru.sistemaVenta.comun

-en la capa de datos irían clases que se conecten con la fuente de base de datos siendo el caso mas común conectarse con una base de datos relacional con jdbc o alguna especificación de jpa yo hago el ejemplo con jdbc siendo el nombre del paquete com.PollitosPeru.sistemaVenta.datos además una clase que represente mi conexión en particular ConexionPollito importara a  com.PollitosPeru.sistemaVenta.comun

-en la capa de lógica de negocio estar en el paquete com.PollitosPeru.sistemaVenta.logica aca pondré mi lógica de negocio y solo lógica por ningún motivo importara del paquete javax.swing o alguna librería grafica
con excepción de que llame a las clases que representen modelos como javax.swing.table.AbstractableModel o javax.swing.TableModel solo hará importaciones a la capa de datos y a la capa común no habrá sin ninguna excepción importaciones al paquete java.sql o javax.sql o alguno que se equivalente

-en la capa de vista hira dentro del paquete com.PollitosPeru.sistemaVenta.vista aqui abra las todos los formularios las clases que sean hijos nietos o vistnientos de Componet si es formulario comenzar con Frm como FrmLoguin FrmCaja y si es panel comenzara con Pan como PanCabeseraCaja PanDetalleCaja aca también pondrás las clases que hagan gráficos estadísticos o impriman reportes


Título: Re: Ejemplo de 3 capas con java
Publicado por: sapito169 en 26 Abril 2010, 00:38 am
Código
  1. package com.pollitosperu.sistemaVentas.comun.Entidades;
  2.  
  3. /**
  4.  *
  5.  * @author luis
  6.  */
  7. public class Producto {
  8.    private int codigo;
  9.    private String nombre;
  10.    private int cantidad;
  11.    private String descripcion;
  12.  
  13.    public int getCodigo() {
  14.        return codigo;
  15.    }
  16.  
  17.    public void setCodigo(int codigo) {
  18.        this.codigo = codigo;
  19.    }
  20.  
  21.  
  22.    public String getNombre() {
  23.        return nombre;
  24.    }
  25.  
  26.    public void setNombre(String nombre) {
  27.        this.nombre = nombre;
  28.    }
  29.  
  30.    public int getCantidad() {
  31.        return cantidad;
  32.    }
  33.  
  34.    public void setCantidad(int cantidad) {
  35.        this.cantidad = cantidad;
  36.    }
  37.  
  38.    public String getDescripcion() {
  39.        return descripcion;
  40.    }
  41.  
  42.    public void setDescripcion(String descripcion) {
  43.        this.descripcion = descripcion;
  44.    }
  45. }
  46.  
  47.  

Código
  1. package com.pollitosperu.sistemaVentas.comun.Interfases;
  2.  
  3. import com.pollitosperu.sistemaVentas.comun.Entidades.Producto;
  4. import java.util.ArrayList;
  5.  
  6. public interface IdaoProducto {
  7.  
  8.    public void agreagProducto(Producto producto);
  9.  
  10.    public void eliminaProducto(int codigo);
  11.  
  12.    public void modificaProducto(int codigo, Producto producto);
  13.  
  14.    public ArrayList<Producto> listaProductos();
  15. }
  16.  


Título: Re: Ejemplo de 3 capas con java
Publicado por: sapito169 en 26 Abril 2010, 00:39 am
Código
  1. package com.pollitosperu.sistemaVentas.datos;
  2.  
  3. import java.sql.Connection;
  4. import java.sql.Driver;
  5. import java.sql.DriverManager;
  6. import java.sql.SQLException;
  7. import java.util.logging.Level;
  8. import java.util.logging.Logger;
  9.  
  10. /**
  11.  *
  12.  * @author luis
  13.  */
  14. public class ConexionPollito {
  15.  
  16.    private Connection conection = null;
  17.  
  18.    public Connection getConection() {
  19.        if (conection == null) {
  20.            try {
  21.                Driver driver = new com.mysql.jdbc.Driver();
  22.                DriverManager.registerDriver(driver);
  23.                conection = DriverManager.getConnection("jdbc:mysql://localhost:3306/pollitosperu", "root", "root");
  24.            } catch (SQLException ex) {
  25.                ex.printStackTrace();
  26.                Logger.getLogger(ConexionPollito.class.getName()).log(Level.SEVERE, null, ex);
  27.            }
  28.        }
  29.        return conection;
  30.    }
  31. }
  32.  

Código
  1. package com.pollitosperu.sistemaVentas.datos;
  2.  
  3. import com.pollitosperu.sistemaVentas.comun.Entidades.Interfases.IdaoProducto;
  4. import com.pollitosperu.sistemaVentas.comun.Entidades.Producto;
  5. import java.sql.CallableStatement;
  6. import java.sql.Connection;
  7. import java.sql.ResultSet;
  8. import java.sql.SQLException;
  9. import java.util.ArrayList;
  10.  
  11. /**
  12.  *
  13.  * @author luis
  14.  */
  15. public class DBdaoProducto implements IdaoProducto {
  16.  
  17.    private Connection connection = new ConexionPollito().getConection();
  18.  
  19.    public void agreagProducto(Producto producto) {
  20.        try {
  21.            CallableStatement statement = connection.prepareCall("{call agreagaProducto (?,?,?)}");
  22.            statement.setString("nombre", producto.getNombre());
  23.            statement.setInt("cantidad", producto.getCantidad());
  24.            statement.setString("descripcion", producto.getNombre());
  25.            statement.executeUpdate();
  26.        } catch (SQLException ex) {
  27.            ex.printStackTrace();
  28.        }
  29.  
  30.    }
  31.  
  32.    public void eliminaProducto(int codigo) {
  33.        try {
  34.            CallableStatement statement = connection.prepareCall("{call eliminaProducto (?)}");
  35.            statement.setInt("cod", codigo);
  36.            statement.executeUpdate();
  37.        } catch (SQLException ex) {
  38.            ex.printStackTrace();
  39.        }
  40.  
  41.    }
  42.  
  43.    public void modificaProducto(int codigo, Producto producto) {
  44.        try {
  45.            CallableStatement statement = connection.prepareCall("{call modificaProducto (?,?,?,?)}");
  46.            statement.setInt("cod", codigo);
  47.            statement.setString("nom", producto.getNombre());
  48.            statement.setInt("cant", producto.getCantidad());
  49.            statement.setString("descrip", producto.getNombre());
  50.            statement.executeUpdate();
  51.        } catch (SQLException ex) {
  52.            ex.printStackTrace();
  53.        }
  54.    }
  55.  
  56.    public ArrayList<Producto> listaProductos() {
  57.        ArrayList<Producto> productos = new ArrayList<Producto>();
  58.        try {
  59.            CallableStatement statement = connection.prepareCall("{call listaProductos }");
  60.            ResultSet resultSet = statement.executeQuery();
  61.            while (resultSet.next()) {
  62.                Producto producto = new Producto();
  63.                producto.setNombre(resultSet.getString("nombre"));
  64.                producto.setCodigo(resultSet.getInt("codigo"));
  65.                producto.setCantidad(resultSet.getInt("cantidad"));
  66.                producto.setDescripcion(resultSet.getString("descripcion"));
  67.                productos.add(producto);
  68.            }
  69.            return productos;
  70.        } catch (SQLException ex) {
  71.            ex.printStackTrace();
  72.            return null;
  73.        }
  74.    }
  75. }
  76.  


Título: Re: Ejemplo de 3 capas con java
Publicado por: sapito169 en 26 Abril 2010, 00:42 am
Código
  1. package com.pollitosperu.sistemaVentas.logica;
  2.  
  3. import com.pollitosperu.sistemaVentas.comun.Entidades.Interfases.IdaoProducto;
  4. import com.pollitosperu.sistemaVentas.comun.Entidades.Producto;
  5. import com.pollitosperu.sistemaVentas.datos.DBdaoProducto;
  6. import java.util.ArrayList;
  7.  
  8. /**
  9.  *
  10.  * @author luis
  11.  */
  12. public class DaoProducto implements IdaoProducto {
  13.  
  14.    private DBdaoProducto daoProducto = new DBdaoProducto();
  15.  
  16.    public DaoProducto() {
  17.    }
  18.  
  19.  
  20.    public void agreagProducto(Producto producto) {
  21.        daoProducto.agreagProducto(producto);
  22.    }
  23.  
  24.    public void eliminaProducto(int codigo) {
  25.        daoProducto.eliminaProducto(codigo);
  26.    }
  27.  
  28.    public void modificaProducto(int codigo, Producto producto) {
  29.        daoProducto.modificaProducto(codigo, producto);
  30.    }
  31.  
  32.    public ArrayList<Producto> listaProductos() {
  33.        return daoProducto.listaProductos();
  34.    }
  35. }
  36.  

Código
  1. package com.pollitosperu.sistemaVentas.vista;
  2.  
  3. import com.pollitosperu.sistemaVentas.comun.Entidades.Producto;
  4. import com.pollitosperu.sistemaVentas.logica.DaoProducto;
  5. import java.util.ArrayList;
  6. import java.util.Iterator;
  7. import javax.swing.DefaultListModel;
  8.  
  9.  
  10. /**
  11.  *
  12.  * @author luis
  13.  */
  14. public class FrmProducto extends javax.swing.JFrame {
  15.  
  16. ......
  17.  
  18. private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                        
  19.  
  20.        DaoProducto daoProducto = new DaoProducto();
  21.        Producto producto = new Producto();
  22.        producto.setNombre(txtnombre.getText());
  23.        producto.setDescripcion(txtDescripcion.getText());
  24.        producto.setCantidad(Integer.parseInt(txtCantidad.getText()));
  25.        daoProducto.agreagProducto(producto);
  26.    }
  27.  
  28.  private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                        
  29.        DaoProducto daoProducto = new DaoProducto();
  30.        daoProducto.eliminaProducto(1);
  31.    }  
  32.  
  33. private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {                                        
  34.        DaoProducto daoProducto = new DaoProducto();
  35.        ArrayList<Producto> productos = daoProducto.listaProductos();
  36.        Iterator iterator = productos.iterator();
  37.        DefaultListModel defaultListModel = new DefaultListModel();
  38.        jList1.setModel(defaultListModel);
  39.        defaultListModel.clear();
  40.        while (iterator.hasNext()) {
  41.            Producto producto = new Producto();
  42.            producto = (Producto) iterator.next();
  43.            defaultListModel.addElement(producto.getNombre());
  44.        }
  45.  
  46.    }
  47.  
  48.  
  49. private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {                                        
  50.        DaoProducto daoProducto = new DaoProducto();
  51.        Producto producto = new Producto();
  52.        producto.setNombre(txtnombre.getText());
  53.        producto.setDescripcion(txtDescripcion.getText());
  54.        producto.setCantidad(Integer.parseInt(txtCantidad.getText()));
  55.        daoProducto.modificaProducto(Integer.parseInt(txtcodigo.getText()), producto);
  56.    }    
  57.  
  58. }fin de clase
  59.  
  60.  




Título: Re: Ejemplo de 3 capas con java
Publicado por: sapito169 en 26 Abril 2010, 00:51 am
preguntas traumas maleteos y amenasas hacer el post correspondiente   :xD


Título: Re: Trauma
Publicado por: Rijhording en 26 Abril 2010, 23:41 pm
me gustaria ver tus interfaces de usuario para guiarme ps xq el resto esta comprensible ok man gracias saludos..


Título: Re: Ejemplo de 3 capas con java
Publicado por: sapito169 en 27 Abril 2010, 04:14 am
 :-X


Título: Re: Ejemplo de 3 capas con java
Publicado por: sapito169 en 27 Abril 2010, 04:59 am
bueno para darte el gusto

(http://www.subirimagen.info/thumb-011A_4BD652F7.jpg) (http://www.subirimagen.info/share-011A_4BD652F7.html)


Título: Re: Ejemplo de 3 capas con java
Publicado por: -Ramc- en 27 Abril 2010, 17:32 pm
Excelente post sapito169, gracias por aportarnos cómo trabajar con 3 capas, está muy bien explicado y entendible, me gusta como trabajas el diseño de las 3 capas, es cierto que el código queda más grande e incluso algunos lo pueden ver repetitivo, pero, al tener que modificar algo de la aplicación se ven los beneficios.  ;-)


Título: Re: Ejemplo de 3 capas con java
Publicado por: sapito169 en 27 Abril 2010, 20:54 pm
-acerca de que si es repetitivo si lo es y es espectacularmente lento  :rolleyes:
pero eso se puede resolver usando reflexión (reinventando la rueda) o mejor aun usando jpa
-en vista que el post fue un Éxito  voy hacer el siguiente post acerca de como hacer 3 capas usando la especificación de jpa así se olvidan de hacer su dao(la clase que agrega modifica y elimina) por entidad
Usar 3 capas con jpa es espectacularmente practico y mas rápido que con la manera que les e enseñado validad para jdbc tal ves haga un video de como hacer las capas en netbenas pero eso todavía dentro de una semana


Título: Re: Ejemplo de 3 capas con java
Publicado por: jaivsa en 8 Septiembre 2010, 18:03 pm
Hola Sapito169. quisiera saber si ya has colgado como programar en 3 capas con la implementacion jpa que mencionas, este ejemplo realmente es genial, y se agradece a  gente como tu por estos sitios.

Un saludo.


Título: Re: Ejemplo de 3 capas con java
Publicado por: Aeros en 9 Septiembre 2010, 11:32 am
Gracias sapito por tu aporte!

 si contestaras los mails o mps serias perfecto  :D


Título: Re: Ejemplo de 3 capas con java
Publicado por: Debci en 9 Septiembre 2010, 16:14 pm
sapito se ha ganado una estatua de oro en el distrito java de la ciudad de elhacker.net  ;-) ;-) ;-) ;-)!!

Saludos


Título: Re: Ejemplo de 3 capas con java
Publicado por: fpalmucci en 24 Noviembre 2010, 05:39 am
Gracias Sapito, muy buen trabajo, ha costado un poco entender porque soy newbie (demasiado) pero corregimos algunas pequeñeces y ha salido funcionando.

Abrazos


Título: Re: Ejemplo de 3 capas con java
Publicado por: sapito169 en 25 Noviembre 2010, 06:28 am
en primer lugar gracias por leer y disculparme por la mala ortografía voy a corregirlo ya me había olvidado de el post actualmente estoy estudiando y trabajando (en un lenguaje que nunca me enseñaron ) además estoy dando un curso de certificación $%&$%& esa •%•%%$&$ cuesta como •$%•%•$%  >:D y por ningún motivo puedo desaprobar la o sacar me mala nota por lo tanto te imaginaras que no tengo tiempo así que te digo que no hice el ejemplo en jpa y que tendrías que esperar hasta el sábado además te cuento que aprendido y mejorado desde que cree el post te cuento que hay algunas cosas que están mal en primer lugar el manejo de errores es malo oculte el error de tal manera que nadie se entera y nadie puede hacer nada en caso de error la otra cosa que e cambiado es que ahora programo mas desacoplado y toda la creación de la aplicación lo creo en una sola aparte así es muy fácil cambiar radicalmente el comportamiento de la aplicación


Título: Re: Ejemplo de 3 capas con java
Publicado por: maguevara en 1 Enero 2011, 20:12 pm
Hola sapito:
Primero que todo muchas gracias y felicitaciones por las explicaciones, han sido muy sencillas y faciles de entender.

Adicionalmente has sido muy concreto y directo, cualidad de maestros.

Espero que hayas culminado con el exito el curso y te deseo lo mejor en este nuevo 2011.

Si no es mucho pedir, te solicito el favor que ojalá pudieras postear un ejemplo del manejo de errores y otro ejemplo (sencillo, claro está) con el tema  que refieres en nov. 25 que dice "toda la creación de la aplicacion lo creo en una sola aparte asi es muy facil cambiar radicalmente el comportamiento de la apliacion".

De nuevo muchas gracias, has hecho un aporte muy valioso sobre todo a algunos novatos en Java como yo.
Saludos,
Maguevara


Título: Re: Ejemplo de 3 capas con java
Publicado por: sapito169 en 2 Enero 2011, 03:56 am
Bueno la respuesta que te voy a dar es algo rara
Algunos me van a criticar por querer programar todo lo más orientado a objetos porque creo que los patrones orientados a objetos pueden ser una gran fuente de solución de problemas que pueden reducir el código basura y te dan la posibilidad de crear código reutlsable incluso sin recompilar es por eso de descubrir que el trabajo en como yo lo e implementado no es muy orientado a objetos y es mas lo conocen como modelo anémico de objetos  :laugh: que ironía
Algunos me van a decir que tengo una opinión casi religiosa de la santa oo

Es por eso que voy a hacer el post un poco diferente
Otra cosa es que no puede hacer un código con el manejo de error que yo quisiera sin poner mucho código basura debido al uso de interfaces no se si alguien sabe algún patrón para solucionar eso

Cambiar a la forma en que trabajaba antes no va a ser tan difícil tampoco







Título: Re: Ejemplo de 3 capas con java
Publicado por: sapito169 en 2 Enero 2011, 04:12 am
Primero como cualquier talibán de la oo comienzan creando un paquete paquete que diga algo como entidad dominio lógica en mí caso estoy creando una aplicación de venta de platos para el restaurant de la tía veneno creo e paquete com.tiaveneno.ventas.compartido.modelo

Dentro creo la clase
Orden

Siguiendo algunas recomendaciones de mi compañero y aprendiz joshua bloch
Utilizo lo mas que pueda la palabra reservada final así me evito problemas de que algún despistado por error vuelva a re instanciar la clase y haga que explote todo
También evito crear relaciones de tipo gallina huevo por evitar problemas de loops infinitos como por ejemplo seria difícil crear el método tostring si la clase detalle de orden tenga una relación a orden además evito lo más posible utilizar el punto más de 2 veces por qué hace el código difícil de testear y crear clases mal diseñadas que hacen cosas que no le incumben evito poner cosas como

orden().getDetalle().getPlato().getPrecio

package com.tiaveneno.ventas.compartido.modelo;

Código
  1. import java.util.ArrayList;
  2. import java.util.Date;
  3. import java.util.List;
  4.  
  5. import javax.persistence.CascadeType;
  6. import javax.persistence.Entity;
  7. import javax.persistence.GeneratedValue;
  8. import javax.persistence.GenerationType;
  9. import javax.persistence.Id;
  10. import javax.persistence.ManyToOne;
  11. import javax.persistence.OneToMany;
  12.  
  13. import javax.persistence.Temporal;
  14. import javax.persistence.TemporalType;
  15.  
  16. public class Orden {
  17. @Id
  18. @GeneratedValue(strategy = GenerationType.IDENTITY)
  19. private int id;
  20. private short numero;
  21. @ManyToOne(cascade = CascadeType.ALL)
  22. private Personal cajero;
  23. @ManyToOne(cascade = CascadeType.ALL)
  24. private Personal mozo;
  25. @Temporal(TemporalType.DATE)
  26. private Date fecha;
  27.  
  28. @OneToMany(cascade = CascadeType.ALL)
  29. private final List<DetalleOrden> detalles = new ArrayList<DetalleOrden>();
  30.  
  31. public Orden(int id, short numero, Personal cajero, Personal mozo,
  32. Date fecha) {
  33. this.id = id;
  34. this.numero = numero;
  35. this.cajero = cajero;
  36. this.mozo = mozo;
  37. this.fecha = fecha;
  38.  
  39. }
  40.  
  41. public Orden() {
  42. }
  43.  
  44. public static Orden nueva() {
  45. return new Orden();
  46. }
  47.  
  48. public Orden detalles(DetalleOrden... detalleOrdens) {
  49. for (DetalleOrden detalleOrden : detalleOrdens) {
  50. this.con(detalleOrden);
  51. }
  52.  
  53. return this;
  54. }
  55.  
  56. public Orden con(DetalleOrden detalleOrden) {
  57.  
  58. detalles.add(detalleOrden);
  59. return this;
  60. }
  61.  
  62. public double obtenerTotal() {
  63. double total = 0;
  64. for (DetalleOrden detalleOrden : detalles) {
  65. total = total + detalleOrden.subtotal();
  66. }
  67. return total;
  68. }
  69.  
  70. //orrible codigo boilepart inebitable getter y setters
  71.  
  72. public List<DetalleOrden> getDetalles() {
  73. return detalles;
  74. }
  75.  
  76. @Override
  77. public String toString() {
  78. return "Orden [id=" + id + ", numero=" + numero + ", cajero=" + cajero
  79. + ", mozo=" + mozo + ", fecha=" + fecha + ", detalles="
  80. + detalles + "]";
  81. }
  82.  
  83. }
  84.  



Título: Re: Ejemplo de 3 capas con java
Publicado por: sapito169 en 2 Enero 2011, 04:22 am
Todas las clases persistentes deben estar anotadas con
@Entity

Todas las entidades debe tener un llave primaria en mi caso creo que la mejor opción es que sea de tipo identity no me gusta que el usuario tenga que siquiera ver las claves

@Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
   private int id;

Tengo que mapear las relaciones entre clases creo que es más natural pensar que cuando guardamos una orden se deberían guardar automáticamente todos sus detalles por eso pongo cascadetype.all

@ManyToOne(cascade = CascadeType.ALL)
   private Personal cajero;

Un constructor sin parámetro es obligatorio

Además creo un método que le concierne a la orden y otros que solo sirven como azúcar sintáctico (solo te evitan escribir un poco)

detalles(DetalleOrden... detalleOrdens)
Orden con(DetalleOrden detalleOrden)
double obtenerTotal()



Título: Re: Ejemplo de 3 capas con java
Publicado por: sapito169 en 2 Enero 2011, 04:28 am
Luego creó una abstracción la base de datos para así poder cambiarme de proveedor de persistencia sin crear tanto problema por ejemplo es fácil cambiar de jpa ibatis o lo que sea

tener en cuenta que uso generics la k es la clase de la llave primaria y e es la clase de la entidad en concreto
Código
  1. package com.tiaveneno.ventas.compartido.servicio;
  2.  
  3. import java.util.List;
  4. import java.util.Map;
  5.  
  6. public interface dao<K, E> {
  7.  
  8. public abstract void remove(E... entities);
  9.  
  10. public abstract void remove(final List<E> entities);
  11.  
  12. public abstract void remove(final E entity);
  13.  
  14. public abstract void persist(final E... entities);
  15.  
  16. public abstract void persist(final List<E> entities);
  17.  
  18. public abstract void persist(final E entity);
  19.  
  20. public abstract E findById(final K id);
  21.  
  22. public abstract void close();
  23.  
  24. public abstract void update(final K key, final E entity);
  25.  
  26. public abstract void update(final Map<K, E> update);
  27.  
  28. public abstract void update(final Map.Entry<K, E>... entries);
  29. }
  30.  
  31.  

y una interfas comcreta para un dao cualquiera
Código
  1. package com.tiaveneno.ventas.compartido.servicio;
  2.  
  3. import com.tiaveneno.ventas.compartido.modelo.Orden;
  4.  
  5. public interface OrderDao extends dao<Integer, Orden> {
  6. // aqui pon codigo que sea propio de las orden como busca orden con un plato x
  7. }



Título: Re: Ejemplo de 3 capas con java
Publicado por: sapito169 en 2 Enero 2011, 04:39 am
Finalmente pongo una implementación concreta de el proveedor de persistencia como en este caso jpa pero puedes poner el que mas te guste


Código
  1. package com.tiaveneno.ventas.datos.jpa;
  2.  
  3. import java.lang.reflect.ParameterizedType;
  4. import java.util.ArrayList;
  5. import java.util.HashMap;
  6. import java.util.Iterator;
  7. import java.util.List;
  8. import java.util.Map;
  9. import java.util.Map.Entry;
  10. import javax.persistence.EntityManager;
  11. import org.apache.commons.beanutils.BeanUtils;
  12.  
  13. import com.tiaveneno.ventas.compartido.servicio.dao;
  14.  
  15. public abstract class JpaDao<K, E> implements dao<K, E> {
  16. private final Class<E> entityClass;
  17.  
  18. private final EntityManager entityManager;
  19.  
  20. @SuppressWarnings("unchecked")
  21. public JpaDao(EntityManager entityManager) {
  22. ParameterizedType genericSuperclass = (ParameterizedType) getClass()
  23. .getGenericSuperclass();
  24. this.entityClass = (Class<E>) genericSuperclass
  25. .getActualTypeArguments()[1];
  26. this.entityManager = entityManager;
  27.  
  28. }
  29.  
  30. @Override
  31. public void persist(final E entity) {
  32. try {
  33. entityManager.getTransaction().begin();
  34. entityManager.persist(entity);
  35. entityManager.getTransaction().commit();
  36. } catch (Exception e) {
  37. entityManager.getTransaction().rollback();
  38. throw new RuntimeException(e);
  39. }
  40.  
  41. }
  42.  
  43. @Override
  44. public void persist(final List<E> entities) {
  45. try {
  46. entityManager.getTransaction().begin();
  47. for (E e : entities) {
  48. entityManager.persist(e);
  49. }
  50. entityManager.getTransaction().commit();
  51. } catch (Exception e) {
  52. entityManager.getTransaction().rollback();
  53. throw new RuntimeException(e);
  54. }
  55.  
  56. }
  57.  
  58. @Override
  59. public void persist(E... entities) {
  60. List<E> es = new ArrayList<E>();
  61. for (E e : entities) {
  62. es.add(e);
  63. }
  64. persist(es);
  65. }
  66.  
  67. @Override
  68. public void remove(final E entity) {
  69.  
  70. try {
  71. entityManager.getTransaction().begin();
  72. entityManager.remove(entity);
  73. entityManager.getTransaction().commit();
  74. } catch (Exception e) {
  75. entityManager.getTransaction().rollback();
  76. }
  77.  
  78. }
  79.  
  80. @Override
  81. public void remove(final List<E> entities) {
  82.  
  83. for (E e : entities) {
  84. remove(e);
  85. }
  86.  
  87. }
  88.  
  89. @Override
  90. public void remove(E... entities) {
  91. List<E> es = new ArrayList<E>();
  92. for (E e : entities) {
  93. es.add(e);
  94. }
  95. remove(es);
  96. }
  97.  
  98. @Override
  99. public E findById(final K id) {
  100.  
  101. return entityManager.find(entityClass, id);
  102.  
  103. }
  104.  
  105. @Override
  106. public void update(final K key, final E entity) {
  107. Map<K, E> map = new HashMap<K, E>();
  108. map.put(key, entity);
  109. update(map);
  110. }
  111.  
  112. @Override
  113. public void update(final Map<K, E> update) {
  114.  
  115. Iterator<Map.Entry<K, E>> iter = update.entrySet().iterator();
  116. while (iter.hasNext()) {
  117. Map.Entry<K, E> entry = iter.next();
  118. K key = entry.getKey();
  119. E entity = entry.getValue();
  120. @SuppressWarnings("unchecked")
  121. E origen = (E) entityManager.find(entity.getClass(), key);
  122. try {
  123. BeanUtils.copyProperties(origen, entity);
  124. } catch (Throwable throwable) {
  125. throw new RuntimeException(throwable);
  126. }
  127. }
  128.  
  129. }
  130.  
  131. @Override
  132. public void update(final Map.Entry<K, E>... entries) {
  133. Map<K, E> map = new HashMap<K, E>();
  134. for (Entry<K, E> entry : entries) {
  135. map.put(entry.getKey(), entry.getValue());
  136. }
  137. update(map);
  138. };
  139.  
  140. @Override
  141. public void close() {
  142. if (entityManager != null) {
  143. if (!entityManager.isOpen()) {
  144. try {
  145. entityManager.close();
  146. } catch (Throwable e) {
  147. throw new RuntimeException(e);
  148. }
  149. }
  150.  
  151. }
  152. }
  153.  
  154. }
  155.  

Un poquito de voilepart pero esta vez te vas a quedar asi  :o porque no es ni la desina parte de lo que sería con implementado con jbc

Código
  1. package com.tiaveneno.ventas.datos.jpa;
  2.  
  3. import javax.persistence.EntityManager;
  4.  
  5. import com.tiaveneno.ventas.compartido.modelo.Orden;
  6. import com.tiaveneno.ventas.compartido.servicio.OrderDao;
  7.  
  8. public class JpaOrderDao extends JpaDao<Integer, Orden> implements OrderDao {
  9. public JpaOrderDao(EntityManager entityManager) {
  10. super(entityManager);
  11. }
  12.  
  13. }
  14.  
  15.  
Si es solo eso no falta nada ahora puedes cerrar la boca


Título: Re: Ejemplo de 3 capas con java
Publicado por: sapito169 en 2 Enero 2011, 05:06 am
finalmente código que veríamos en el cliente
Código
  1. package com.tiaveneno.ventas;
  2.  
  3. import javax.persistence.EntityManager;
  4. import javax.persistence.Persistence;
  5.  
  6. import com.tiaveneno.ventas.compartido.modelo.DetalleOrden;
  7. import com.tiaveneno.ventas.compartido.modelo.Orden;
  8. import com.tiaveneno.ventas.compartido.modelo.Personal;
  9. import com.tiaveneno.ventas.compartido.modelo.Plato;
  10. import com.tiaveneno.ventas.compartido.servicio.OrderDao;
  11. import com.tiaveneno.ventas.datos.jpa.JpaOrderDao;
  12.  
  13. public class Main {
  14.  
  15. public static void main(String[] args) {
  16.  
  17. EntityManager entityManager = Persistence. (
  18. "jpa").createEntityManager();
  19.  
  20. OrderDao orderDao = new JpaOrderDao(entityManager);
  21. DetalleOrden duno = new DetalleOrden((short) 1, new Plato(
  22. "combinado fiedeos con chanfainita", 3.5));
  23. DetalleOrden ddos = new DetalleOrden((short) 1, new Plato(
  24. "combinado fiedeos con chanfainita", 3.5));
  25.  
  26. Orden orden = new Orden();
  27. orden.setCajero(new Personal("cajero"));
  28. orden.setMozo(new Personal("mozo"));
  29.  
  30. orden.detalles(duno, ddos);
  31.  
  32. orderDao.persist(orden);
  33.  
  34.  
  35.  
  36. }
  37. }
  38.  
  39.  

Si está bien todo se guarda automáticamente en una sola transacción en caso de error hace rollback y muestra la pila por la salida estándar donde te dice la razón del error en que línea y de que clase es el error

Y me olvidaba tienes que poner un fichero de configuración en la carpeta META-INF al (costado de las clases) con el nombre de persistence.xml y agregar una librería de jipa en mi caso puse eclipse link nota no me pregunten cómo se hace eso en netbenas por que estoy enseñando a programar en java no en netbeans asi que si quieres saberlo pon el google por que poner siguiente siguiente en un wizar no es para hombres que tengan pelo en el pecho


Código
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
  4. version="2.0" xmlns="http://java.sun.com/xml/ns/persistence">
  5. <persistence-unit name="jpa" transaction-type="RESOURCE_LOCAL">
  6.  
  7. <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
  8.  
  9. <class>com.tiaveneno.ventas.compartido.modelo.Cuenta</class>
  10. <class>com.tiaveneno.ventas.compartido.modelo.DetalleOrden</class>
  11. <class>com.tiaveneno.ventas.compartido.modelo.Orden</class>
  12. <class>com.tiaveneno.ventas.compartido.modelo.Personal</class>
  13. <class>com.tiaveneno.ventas.compartido.modelo.Plato</class>
  14.  
  15. <properties>
  16. <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
  17. <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/test" />
  18. <property name="javax.persistence.jdbc.user" value="root" />
  19. <property name="javax.persistence.jdbc.password" value="root" />
  20.  
  21. <!-- EclipseLink should create the database schema automatically -->
  22. <property name="eclipselink.ddl-generation" value="none" />
  23. <property name="eclipselink.ddl-generation.output-mode"
  24. value="database" />
  25. </properties>
  26.  
  27. </persistence-unit>
  28. </persistence>
  29.  
  30.  

El fichero xml es un caso particular para eclipselink la primera ves que corras el programa debes reemplazar

<property name="eclipselink.ddl-generation" value="none" />

por

<property name="eclipselink.ddl-generation" value="DROP_AND_CREATE" />

ademas en
<persistence-unit name="jpa" transaction-type="RESOURCE_LOCAL">
Tener en cuenta que lo que dice úntenme debe estar en tu código para ser creado dentro del createEntityManagerFactory

En mi caso como dice jpa yo pongo

EntityManager entityManager = Persistence. (
            "jpa").createEntityManager();

Notese que estoy creando toda la aplicación desde el main  asi que si quiero cambiar de proveedor de persistencia solo cambio en el main y no en 20 clases distintas

si no te equicas nunca mas vas a tener que corregir la vase de datos la sincronisacion te la hace jpa

(http://img32.imageshack.us/img32/3621/carpetasprojectojpa.png) (http://img32.imageshack.us/i/carpetasprojectojpa.png/)

Uploaded with ImageShack.us (http://imageshack.us)


http://www.mediafire.com/download.php?6ff5dxyb6pb2f6j


Título: Re: Ejemplo de 3 capas con java
Publicado por: cyberserver en 13 Enero 2011, 05:42 am
Hola Sapito. muy bueno tu tema, principalmente en la primera parte.
Pero tengo una duda acerca de la programacion en 3 capas.
En general poniento depormedio tu codigo.

Las Arquitectura de 3 capas se divide en :

1.- Interface, la Parte visual de nuestra aplicacion
2.- Clases de mi logica. que analizan los parametros enviador por la interface.
3.- Las Clases Ajenas a nuestra logica. (Apis, clases Generales para reutilizar,Clases ya compiladas)

Es cierto esto? o la 3 capa solo es ocupada para acceso a una BD

Y digo analizando este modelo poniendo depormedio tu codigo, por lo siguiente
Tu primera practica la estructuraste masomenos asi.

1.- Interface
2.- Tu logica que relaciona a la 1° y 3° capa
3.- Clases para la conexión de BD.

Y en la 3° capa tambien pusiste la clase "DBdaoProducto" que es donde especificas lo que se tiene que modificar en la BD.



Pero si supongamos que yo en la parte 3 coloco una Clase (Ya compilada que alguien me paso alguna ves) llamada PatronDeConeccion, que permite la conexión y modificacion de la BD por el envio de Query´s a los metodos muy generales especificados dentro.

Cuando yo quiera enviarle los parametros Query a algun metodo dentro de la Clase PatronDeConeccionesta, esta ultima clase donde iria? en el nivel de mi logica por que yo defino mis consultas o junto a la Clase PatronDeConeccion por el solo hecho de que tiene contacto directo con la BD


Título: Re: Ejemplo de 3 capas con java
Publicado por: cyberserver en 14 Enero 2011, 03:56 am
Disculpen, una pregunta mas.
La arquitectura de 3 capas solo es para aplicaciones que implementan una Base de Datos.?

Y si tengo una aplicacion, que no ocupa Bd, que hago ? se puede usar esta arquitectura o no ?


Título: Re: Ejemplo de 3 capas con java
Publicado por: JonathanR en 9 Agosto 2011, 21:05 pm
Hola que tal, mi nombre es Jonathan Rojas. Curso 7mo Trimestre de Ingenieria de Sistemas en la Universidad Metropolitana en caracas. En estos momentos me encuentro de vacaciones haciendo bases de datos eficientes y mi pregunta es. Conozco la idea de la programación bajo las 3 capas. Tengo ya 3 proyectos programando así más aquellos que no me piden en la Universidad y quisiera saber bajo su tutela Qué capa inicia a qué capa? porque si nos ponemos a analizar las 3 capas:

1ra Capa: Interfaz de Usuario, visible para usuario y muestra lo que queremos que el usuario vea
2da Capa: Capa Lógica, yo la llamo motor del programa, la única capa que puede acceder directamente a la capa de datos, la 1ra Capa deberá pasar por la 2da para acceder a la 3ra.
4ra Capa: Capa de datos, Base de datos, Modelación de datos, excel o lo que quieras.

Una vez que analizamos la teoria vamos a las dudas de programación que todo el mundo se hace:
Qué capa se inicializa primero? Cuál lleva el famoso main?

Bueno en mi caso he hecho los dos metodos, que la 2da capa lleve el main o la primera lo lleve. Lo lógico y teórico es que la 2da lo lleve ya que si es el motor de tu programa. Pero es un poco dificil relacionar tus ideales con la programación, hay que ser un Az para dominar esa programación.
Poniendo el main en la primera capa es sencillo, ponemos el motor como un objeto dentro de la capa y listo. Pero no se vería bonito.

Necesito opiniones..
Saludos!
Jonathan Rojas



Título: Re: Ejemplo de 3 capas con java
Publicado por: raao10 en 8 Octubre 2012, 17:43 pm
Hola!! q tal por aca me estoy iniciando en el mundo de los sistemas en 3 capas y me ha parecido fabuloso el aporte de todos.. pero me gustaria si me pudieran ayudar en la parte en donde muestra un arreglo para visualizar una tabla de los datos... q no he podido entender... aunque hice el ejemplo no me sale.


Título: Re: Ejemplo de 3 capas con java
Publicado por: sapito169 en 8 Octubre 2012, 21:04 pm
Hola!! q tal por aca me estoy iniciando en el mundo de los sistemas en 3 capas y me ha parecido fabuloso el aporte de todos.. pero me gustaria si me pudieran ayudar en la parte en donde muestra un arreglo para visualizar una tabla de los datos... q no he podido entender... aunque hice el ejemplo no me sale.
codigo completo

Código
  1. public class Main {
  2. public static void main(String[] args) {
  3. RepositorioTarea repositorioTarea = new RepositorioTarea();
  4. ServicioTarea servicioTarea = new ServicioTarea(repositorioTarea);
  5. FrmPrincipal frmPrincipal = new FrmPrincipal(servicioTarea);
  6. frmPrincipal.setVisible(true);
  7. }
  8. }
  9.  
  10.  

Código
  1. import java.awt.BorderLayout;
  2.  
  3. public class FrmPrincipal extends JFrame {
  4.  
  5. private static final long serialVersionUID = 1L;
  6. private JPanel contentPane;
  7. private JTextField txtTareaNombre;
  8. private JTable table;
  9.  
  10. private ServicioTarea servicioTarea;
  11.  
  12. public FrmPrincipal(ServicioTarea servicioTarea) {
  13. this.servicioTarea = servicioTarea;
  14. init();
  15. }
  16.  
  17. public static void main(String[] args) {
  18. EventQueue.invokeLater(new Runnable() {
  19. public void run() {
  20. try {
  21. FrmPrincipal frame = new FrmPrincipal();
  22. frame.setVisible(true);
  23. } catch (Exception e) {
  24. e.printStackTrace();
  25. }
  26. }
  27. });
  28. }
  29.  
  30. /**
  31. * Create the frame.
  32. */
  33. public FrmPrincipal() {
  34. init();
  35. }
  36.  
  37. private void init() {
  38. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  39. setBounds(100, 100, 450, 300);
  40. contentPane = new JPanel();
  41. contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
  42. contentPane.setLayout(new BorderLayout(0, 0));
  43. setContentPane(contentPane);
  44.  
  45. JPanel panel = new JPanel();
  46. contentPane.add(panel, BorderLayout.NORTH);
  47. panel.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5));
  48.  
  49. JLabel lblNewLabel = new JLabel("Tarea");
  50. panel.add(lblNewLabel);
  51.  
  52. txtTareaNombre = new JTextField();
  53. panel.add(txtTareaNombre);
  54. txtTareaNombre.setColumns(10);
  55.  
  56. JButton btnAgrega = new JButton("agrega");
  57.  
  58. panel.add(btnAgrega);
  59.  
  60. JScrollPane scrollPane = new JScrollPane();
  61. contentPane.add(scrollPane, BorderLayout.CENTER);
  62.  
  63. table = new JTable();
  64. scrollPane.setViewportView(table);
  65. table.setModel(new DefaultTableModel(new Object[][] {}, new String[] {
  66. "Codigo", "Descripcion", "fecha" }));
  67. btnAgrega.addActionListener(new ActionListener() {
  68. public void actionPerformed(ActionEvent e) {
  69. servicioTarea.agregar(new Tarea(null, txtTareaNombre.getText(),
  70. null));
  71.  
  72. List<Tarea> tareas = servicioTarea.tareas();
  73. DefaultTableModel defaultTableModel = (DefaultTableModel) table
  74. .getModel();
  75. defaultTableModel.setRowCount(0);
  76. for (Tarea tarea : tareas) {
  77. defaultTableModel.addRow(new Object[] { tarea.getId(),
  78. tarea.getNombre(), tarea.getDate() });
  79. }
  80. }
  81. });
  82. }
  83.  
  84. }
  85.  

Código
  1. import java.util.ArrayList;
  2. import java.util.Collection;
  3. import java.util.HashMap;
  4. import java.util.List;
  5.  
  6. public class RepositorioTarea {
  7. private HashMap<Integer, Tarea> hashMap = new HashMap<>();
  8.  
  9. public void agregar(Tarea tarea) {
  10. int size = hashMap.size();
  11. hashMap.put(size + 1,
  12. new Tarea(size + 1, tarea.getNombre(), tarea.getDate()));
  13. }
  14.  
  15. public List<Tarea> listar() {
  16. ArrayList<Tarea> respuesta = new ArrayList<>();
  17. Collection<Tarea> values = hashMap.values();
  18. for (Tarea tarea : values) {
  19. respuesta.add(new Tarea(tarea.getId(), tarea.getNombre(), tarea
  20. .getDate()));
  21. }
  22. return respuesta;
  23. }
  24.  
  25. }
  26.  


Código
  1. import java.util.Date;
  2. import java.util.List;
  3.  
  4. public class ServicioTarea {
  5.  
  6. private final RepositorioTarea repositorioTarea;
  7.  
  8. public ServicioTarea(RepositorioTarea repositorioTarea) {
  9. this.repositorioTarea = repositorioTarea;
  10. }
  11.  
  12. public void agregar(Tarea tarea) {
  13. tarea.setDate(new Date());
  14. repositorioTarea.agregar(tarea);
  15. }
  16.  
  17. public List<Tarea> tareas() {
  18. return repositorioTarea.listar();
  19. }
  20. }
  21.  

Código
  1. import java.util.Date;
  2.  
  3. public class Tarea {
  4. private Integer id;
  5. private String nombre;
  6. private Date date;
  7.  
  8. public Tarea(Integer id, String nombre, Date date) {
  9. this.id = id;
  10. this.nombre = nombre;
  11. this.date = date;
  12. }
  13.  
  14. public Integer getId() {
  15. return id;
  16. }
  17.  
  18. public void setId(Integer id) {
  19. this.id = id;
  20. }
  21.  
  22. public String getNombre() {
  23. return nombre;
  24. }
  25.  
  26. public void setNombre(String nombre) {
  27. this.nombre = nombre;
  28. }
  29.  
  30. public Date getDate() {
  31. return date;
  32. }
  33.  
  34. public void setDate(Date date) {
  35. this.date = date;
  36. }
  37.  
  38. }
  39.  

porfavor respondeme te lo suplico


Título: Re: Ejemplo de 3 capas con java
Publicado por: ed0810 en 13 Noviembre 2012, 20:47 pm
Pido POR FAVOR a la comunidad que escribamos BIEN. Que seamos ingenieros no significa que cometamos errores de ortografía detestables!