diff --git a/010_spring_boot/README.md b/010_spring_boot/README.md index f0acb8f..fc4e273 100644 --- a/010_spring_boot/README.md +++ b/010_spring_boot/README.md @@ -5,9 +5,11 @@ Tablero en [trello](https://trello.com/b/gWJsG18e/g5-formaci%C3%B3n-spring-boot) - [Curso](https://app.aluracursos.com/course/introduccion-sql-mysql-manipule-consulte-datos) Java y [bases de datos](./base_de_datos.md) - Lectura [JDBC](https://www.aluracursos.com/blog/conociendo-el-jdbc) +- Lectura [Maven](https://www.aluracursos.com/blog/que-es-maven) - [Curso](https://app.aluracursos.com/course/java-jdbc-trabajando-base-datos) Java y [JDBC](./jdbc.md) - [Curso](https://app.aluracursos.com/course/persistencia-jpa-hibernate) Persistencia con [JPA - Hibernate](./jpa_persistencia_hibernate.md) - [Curso](https://app.aluracursos.com/course/java-jpa-consultas-avanzadas-rendimiento-modelos-complejos) JPA [consultas avanzadas, rendimiento y modelos complejos](./jpa_avanzado.md) +- Lectura [Rest](https://www.aluracursos.com/blog/rest-concepto-y-fundamentos) diff --git a/010_spring_boot/jpa/tienda2/database/tienda.mv.db b/010_spring_boot/jpa/tienda2/database/tienda.mv.db index ab15525..9b77537 100644 Binary files a/010_spring_boot/jpa/tienda2/database/tienda.mv.db and b/010_spring_boot/jpa/tienda2/database/tienda.mv.db differ diff --git a/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/dao/CategoriaDao.java b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/dao/CategoriaDao.java index 3f124a4..e6614ab 100644 --- a/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/dao/CategoriaDao.java +++ b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/dao/CategoriaDao.java @@ -31,6 +31,11 @@ public class CategoriaDao { return em.find(Categoria.class, id); } + public Categoria consultaPorNombre(String nombre){ + String jpql =" SELECT C FROM Categoria AS C WHERE C.nombre=:nombre "; + return em.createQuery(jpql,Categoria.class).setParameter("nombre", nombre).getSingleResult(); + } + public List consultarTodos() { String jpql = "SELECT P FROM Categoria AS P"; return em.createQuery(jpql, Categoria.class).getResultList(); diff --git a/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/dao/PedidoDao.java b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/dao/PedidoDao.java index bb94100..6a16065 100644 --- a/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/dao/PedidoDao.java +++ b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/dao/PedidoDao.java @@ -84,4 +84,9 @@ public class PedidoDao { return em.createQuery(jpql, ReporteDeVenta.class).getResultList(); } + public Pedido ConsultarPedidoConCliente(Long id) { + String jpql = "SELECT P FROM Pedido P JOIN FETCH P.cliente WHERE P.id=:id"; + return em.createQuery(jpql, Pedido.class).setParameter("id", id).getSingleResult(); + } + } diff --git a/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/dao/ProductoDao.java b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/dao/ProductoDao.java index 79fc24e..a7ec9d0 100644 --- a/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/dao/ProductoDao.java +++ b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/dao/ProductoDao.java @@ -1,9 +1,15 @@ package com.latam.alura.tienda.dao; import java.math.BigDecimal; +import java.time.LocalDate; import java.util.List; import javax.persistence.EntityManager; +import javax.persistence.TypedQuery; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Predicate; +import javax.persistence.criteria.Root; import com.latam.alura.tienda.modelo.Producto; @@ -50,4 +56,46 @@ public class ProductoDao { public BigDecimal consultaPrecioPorNombreDeProducto(String nombre) { return em.createNamedQuery("Producto.consultaDePrecio", BigDecimal.class).setParameter("nombre", nombre).getSingleResult(); } + + public List consultaPorParametro(String nombre, BigDecimal precio, LocalDate fecha){ + StringBuilder jpql = new StringBuilder("SELECT P FROM Producto P WHERE 1=1"); + if (nombre != null && !nombre.trim().isEmpty()) { + jpql.append(" AND P.nombre=:nombre"); + } + if (precio != null && !precio.equals(new BigDecimal(0))) { + jpql.append(" AND P.precio=:precio"); + } + if (fecha != null) { + jpql.append(" AND P.fechaDeRegistro=:fecha"); + } + TypedQuery query = em.createQuery(jpql.toString(), Producto.class); + if (nombre != null && !nombre.trim().isEmpty()) { + query.setParameter("nombre", nombre); + } + if (precio != null && !precio.equals(new BigDecimal(0))) { + query.setParameter("precio", precio); + } + if (fecha != null) { + query.setParameter("fechaDeRegistro", fecha); + } + return query.getResultList(); + } + + public List consultaPorParametrosConAPICriteria(String nombre, BigDecimal precio, LocalDate fecha){ + CriteriaBuilder builder = em.getCriteriaBuilder(); + CriteriaQuery query = builder.createQuery(Producto.class); + Root from = query.from(Producto.class); + Predicate filtro = builder.and(); + if (nombre != null && !nombre.trim().isEmpty()) { + filtro = builder.and(filtro, builder.equal(from.get("nombre"), nombre)); + } + if (precio != null && !precio.equals(new BigDecimal(0))) { + filtro = builder.and(filtro, builder.equal(from.get("precio"), precio)); + } + if (fecha != null) { + filtro = builder.and(filtro, builder.equal(from.get("fechaDeRegistro"), fecha)); + } + query = query.where(filtro); + return em.createQuery(query).getResultList(); + } } diff --git a/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/Categoria.java b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/Categoria.java index ca3d679..999b590 100644 --- a/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/Categoria.java +++ b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/Categoria.java @@ -1,46 +1,34 @@ package com.latam.alura.tienda.modelo; +import javax.persistence.EmbeddedId; import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; import javax.persistence.Table; -//public enum Categoria { -// SOFTWARES, -// LIBROS, -// CELULARES -//} @Entity @Table(name="categorias") public class Categoria { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - private String nombre; + //@Id + //@GeneratedValue(strategy = GenerationType.IDENTITY) + //private Long id; + //private String nombre; + + @EmbeddedId + private CategoriaId categoriaId; public Categoria() {} public Categoria(String nombre) { - this.nombre = nombre; - } - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; + this.categoriaId = new CategoriaId(nombre, "456"); } public String getNombre() { - return nombre; + return this.categoriaId.getNombre(); } public void setNombre(String nombre) { - this.nombre = nombre; + this.categoriaId.setNombre(nombre); } } \ No newline at end of file diff --git a/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/CategoriaId.java b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/CategoriaId.java new file mode 100644 index 0000000..15c655a --- /dev/null +++ b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/CategoriaId.java @@ -0,0 +1,59 @@ +package com.latam.alura.tienda.modelo; + +import java.io.Serializable; +import java.util.Objects; + +import javax.persistence.Embeddable; + +@Embeddable +public class CategoriaId implements Serializable { + + private static final long serialVersionUID = -9006019453678383077L; + private String nombre; + private String password; + + public CategoriaId() {} + + public CategoriaId(String nombre, String password) { + this.nombre = nombre; + this.password = password; + } + + public String getNombre() { + return nombre; + } + + public void setNombre(String nombre) { + this.nombre = nombre; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + @Override + public int hashCode() { + return Objects.hash(nombre, password); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + CategoriaId other = (CategoriaId) obj; + return Objects.equals(nombre, other.nombre) && Objects.equals(password, other.password); + } + + public static long getSerialversionuid() { + return serialVersionUID; + } + +} diff --git a/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/Cliente.java b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/Cliente.java index 29dded1..e84f541 100644 --- a/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/Cliente.java +++ b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/Cliente.java @@ -1,5 +1,6 @@ package com.latam.alura.tienda.modelo; +import javax.persistence.Embedded; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; @@ -14,38 +15,33 @@ public class Cliente { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - private String nombre; - private String dni; + @Embedded + private DatosPersonales datosPersonales; public Cliente() {} public Cliente(String nombre, String dni) { - this.nombre = nombre; - this.dni = dni; + this.datosPersonales = new DatosPersonales(nombre, dni); } - public Cliente(String nombre) { - this.nombre = nombre; - } - public Long getId() { return id; } public String getNombre() { - return nombre; + return this.datosPersonales.getNombre(); } public void setNombre(String nombre) { - this.nombre = nombre; + this.datosPersonales.setNombre(nombre); } public String getDni() { - return dni; + return this.datosPersonales.getDni(); } public void setDni(String dni) { - this.dni = dni; + this.datosPersonales.setDni(dni);; } } \ No newline at end of file diff --git a/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/DatosPersonales.java b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/DatosPersonales.java new file mode 100644 index 0000000..314f6c9 --- /dev/null +++ b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/DatosPersonales.java @@ -0,0 +1,55 @@ +package com.latam.alura.tienda.modelo; + +import java.io.Serializable; +import java.util.Objects; + +import javax.persistence.Embeddable; + +@Embeddable +public class DatosPersonales implements Serializable { + + private static final long serialVersionUID = 8063180201812979106L; + private String nombre; + private String dni; + + public DatosPersonales() {} + + public DatosPersonales(String nombre, String dni) { + this.nombre = nombre; + this.dni = dni; + } + + public String getNombre() { + return nombre; + } + + public void setNombre(String nombre) { + this.nombre = nombre; + } + + public String getDni() { + return dni; + } + + public void setDni(String dni) { + this.dni = dni; + } + + @Override + public int hashCode() { + return Objects.hash(dni, nombre); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + DatosPersonales other = (DatosPersonales) obj; + return Objects.equals(dni, other.dni) && Objects.equals(nombre, other.nombre); + } + +} diff --git a/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/Electronico.java b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/Electronico.java new file mode 100644 index 0000000..ef4f208 --- /dev/null +++ b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/Electronico.java @@ -0,0 +1,36 @@ +package com.latam.alura.tienda.modelo; + +import javax.persistence.Entity; +import javax.persistence.Table; + +@Entity +@Table(name="electronicos") +public class Electronico extends Producto { + + private String marca; + private String modelo; + + public Electronico() {} + + public Electronico(String marca, String modelo) { + this.marca = marca; + this.modelo = modelo; + } + + public String getMarca() { + return marca; + } + + public void setMarca(String marca) { + this.marca = marca; + } + + public String getModelo() { + return modelo; + } + + public void setModelo(String modelo) { + this.modelo = modelo; + } + +} diff --git a/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/ItemsPedido.java b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/ItemsPedido.java index 594eac1..8432bc1 100644 --- a/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/ItemsPedido.java +++ b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/ItemsPedido.java @@ -3,6 +3,7 @@ package com.latam.alura.tienda.modelo; import java.math.BigDecimal; import javax.persistence.Entity; +import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; @@ -17,9 +18,9 @@ public class ItemsPedido { private Long id; private Integer cantidad; private BigDecimal precio_unitario; - @ManyToOne + @ManyToOne(fetch = FetchType.LAZY) private Producto producto; - @ManyToOne + @ManyToOne(fetch = FetchType.LAZY) private Pedido pedido; public ItemsPedido() {} diff --git a/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/Libro.java b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/Libro.java new file mode 100644 index 0000000..805d94d --- /dev/null +++ b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/Libro.java @@ -0,0 +1,36 @@ +package com.latam.alura.tienda.modelo; + +import javax.persistence.Entity; +import javax.persistence.Table; + +@Entity +@Table(name="libros") +public class Libro extends Producto { + + private String autor; + private Integer paginas; + + public Libro() {} + + public Libro(String autor, Integer paginas) { + this.autor = autor; + this.paginas = paginas; + } + + public String getAutor() { + return autor; + } + + public void setAutor(String autor) { + this.autor = autor; + } + + public Integer getPaginas() { + return paginas; + } + + public void setPaginas(Integer paginas) { + this.paginas = paginas; + } + +} diff --git a/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/Pedido.java b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/Pedido.java index 0624156..c0302c2 100644 --- a/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/Pedido.java +++ b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/Pedido.java @@ -7,6 +7,7 @@ import java.util.List; import javax.persistence.CascadeType; import javax.persistence.Entity; +import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; @@ -26,7 +27,7 @@ public class Pedido { private Long id; private LocalDate fecha = LocalDate.now(); private BigDecimal valorTotal = new BigDecimal(0); - @ManyToOne + @ManyToOne(fetch = FetchType.LAZY) private Cliente cliente; //@ManyToMany //@JoinTable(name="item_pedido") @@ -72,5 +73,17 @@ public class Pedido { public void setCliente(Cliente cliente) { this.cliente = cliente; } + + public List getItems() { + return items; + } + + public void setItems(List items) { + this.items = items; + } + + public void setId(Long id) { + this.id = id; + } } \ No newline at end of file diff --git a/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/Producto.java b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/Producto.java index d3059f4..00074ce 100644 --- a/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/Producto.java +++ b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/Producto.java @@ -4,18 +4,24 @@ import java.math.BigDecimal; import java.time.LocalDate; import javax.persistence.Entity; +import javax.persistence.FetchType; //import javax.persistence.EnumType; //import javax.persistence.Enumerated; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; +import javax.persistence.Inheritance; +import javax.persistence.InheritanceType; import javax.persistence.ManyToOne; import javax.persistence.NamedQuery; import javax.persistence.Table; + @Entity @Table(name="productos") @NamedQuery(name="Producto.consultaDePrecio", query="SELECT P.precio FROM Producto AS P WHERE P.nombre=:nombre") +//@Inheritance(strategy = InheritanceType.SINGLE_TABLE) +@Inheritance(strategy = InheritanceType.JOINED) public class Producto { @Id @@ -27,7 +33,7 @@ public class Producto { private BigDecimal precio; private LocalDate fechaDeRegistro = LocalDate.now(); //@Enumerated(EnumType.STRING) - @ManyToOne + @ManyToOne(fetch = FetchType.LAZY) private Categoria categoria; public Producto() {} diff --git a/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/prueba/LoadRecords.java b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/prueba/LoadRecords.java new file mode 100644 index 0000000..9367536 --- /dev/null +++ b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/prueba/LoadRecords.java @@ -0,0 +1,104 @@ +package com.latam.alura.tienda.prueba; + +import java.io.File; +import java.io.FileNotFoundException; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; +import javax.persistence.EntityManager; +import com.latam.alura.tienda.dao.CategoriaDao; +import com.latam.alura.tienda.dao.ClienteDao; +import com.latam.alura.tienda.dao.PedidoDao; +import com.latam.alura.tienda.dao.ProductoDao; +import com.latam.alura.tienda.modelo.Categoria; +import com.latam.alura.tienda.modelo.Cliente; +import com.latam.alura.tienda.modelo.ItemsPedido; +import com.latam.alura.tienda.modelo.Pedido; +import com.latam.alura.tienda.modelo.Producto; +import com.latam.alura.tienda.utils.JPAUtils; + + +public class LoadRecords { + public static void cargarRegistros() throws FileNotFoundException { + EntityManager em = JPAUtils.getEntityManager(); + CategoriaDao categoriaDao = new CategoriaDao(em); + ProductoDao productoDao = new ProductoDao(em); + ClienteDao clienteDao = new ClienteDao(em); + PedidoDao pedidoDao = new PedidoDao(em); + em.getTransaction().begin(); + + loadCategoria("categoria",categoriaDao,em); + + loadProducto("producto",productoDao,categoriaDao,em); + + loadCliente("cliente",clienteDao,em); + + List clientesList = clienteDao.consultarTodos(); + List pedidoList= new ArrayList<>(); + + for(Cliente cl:clientesList) { + pedidoList.add(new Pedido(cl)); + } + + for(int i=0;i productosTxt =readFile(type); + for(int i=0;i1) { + Categoria categoria = categoriaDao.consultaPorNombre(line[3]); + Producto producto = new Producto(line[4],line[0],new BigDecimal(line[1]),categoria); + productoDao.guardar(producto); + em.flush(); + } + } + } + + private static void loadCategoria(String type, CategoriaDao categoriaDao,EntityManager em) throws FileNotFoundException { + List categoriasTxt =readFile(type); + for(int i=0;i clientesTxt =readFile(type); + for(int i=0;i1) { + Cliente cliente= new Cliente(line[0],line[1]); + clienteDao.guardar(cliente); + em.flush(); + } + } + } + + private static List readFile(String type) throws FileNotFoundException { + File file = new File("/mnt/Biblioteca/Code/guias/Java/oracle_one/cursos/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/utils/"+type+".txt"); + Scanner scan = new Scanner(file); + List pedido= new ArrayList<>(); + while(scan.hasNextLine()){ + pedido.add(scan.nextLine()); + } + scan.close(); + return pedido; + } + + +} diff --git a/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/prueba/PruebaAPICriteria.java b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/prueba/PruebaAPICriteria.java new file mode 100644 index 0000000..83163c5 --- /dev/null +++ b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/prueba/PruebaAPICriteria.java @@ -0,0 +1,54 @@ +package com.latam.alura.tienda.prueba; + +import java.math.BigDecimal; +import java.util.List; + +import javax.persistence.EntityManager; + +import com.latam.alura.tienda.dao.CategoriaDao; +import com.latam.alura.tienda.dao.ProductoDao; +import com.latam.alura.tienda.modelo.Categoria; +import com.latam.alura.tienda.modelo.Producto; +import com.latam.alura.tienda.utils.JPAUtils; + +public class PruebaAPICriteria { + + public static void main(String[] args) { + + cargarBancoDeDatos(); + + EntityManager em = JPAUtils.getEntityManager(); + ProductoDao productoDao =new ProductoDao(em); + + List resultado = productoDao.consultaPorParametrosConAPICriteria("X", null, null); + System.out.println(resultado.get(0).getDescripcion()); + + } + + private static void cargarBancoDeDatos() { + Categoria celulares = new Categoria("CELULARES"); + Categoria videoJuegos = new Categoria("VIDEO_JUEGOS"); + Categoria electronicos = new Categoria("ELECTRONICOS"); + + Producto celular = new Producto("X","producto nuevo",new BigDecimal(10000),celulares); + Producto videoJuego = new Producto("FIFA","2000",new BigDecimal(10000),videoJuegos); + Producto memoria = new Producto("memoria ram","30 GB",new BigDecimal(10000),electronicos); + + EntityManager em = JPAUtils.getEntityManager(); + ProductoDao productoDao = new ProductoDao(em); + CategoriaDao categoriaDao = new CategoriaDao(em); + + em.getTransaction().begin(); + + categoriaDao.guardar(celulares); + categoriaDao.guardar(videoJuegos); + categoriaDao.guardar(electronicos); + + productoDao.guardar(celular); + productoDao.guardar(videoJuego); + productoDao.guardar(memoria); + + em.getTransaction().commit(); + em.close(); + } +} \ No newline at end of file diff --git a/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/prueba/PruebaDeParametros.java b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/prueba/PruebaDeParametros.java new file mode 100644 index 0000000..6cb4892 --- /dev/null +++ b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/prueba/PruebaDeParametros.java @@ -0,0 +1,54 @@ +package com.latam.alura.tienda.prueba; + +import java.math.BigDecimal; +import java.util.List; + +import javax.persistence.EntityManager; + +import com.latam.alura.tienda.dao.CategoriaDao; +import com.latam.alura.tienda.dao.ProductoDao; +import com.latam.alura.tienda.modelo.Categoria; +import com.latam.alura.tienda.modelo.Producto; +import com.latam.alura.tienda.utils.JPAUtils; + +public class PruebaDeParametros { + public static void main(String[] args) { + cargarBancoDeDatos(); + + EntityManager em = JPAUtils.getEntityManager(); + ProductoDao productoDao =new ProductoDao(em); + + List resultado = productoDao.consultaPorParametro("FIFA", null, null); + //List resultado = productoDao.consultaPorParametro("FIFA", new BigDecimal(10000), null); + //List resultado = productoDao.consultaPorParametro("FIFA", new BigDecimal(10000), null); + + System.out.println(resultado.get(0).getDescripcion()+" - "+resultado.get(0).getFechaDeRegistro()); + } + + private static void cargarBancoDeDatos() { + Categoria celulares = new Categoria("CELULARES"); + Categoria videoJuegos = new Categoria("VIDEO_JUEGOS"); + Categoria electronicos = new Categoria("ELECTRONICOS"); + + Producto celular = new Producto("X", "producto nuevo", new BigDecimal(10000), celulares); + Producto videoJuego = new Producto("FIFA", "2000", new BigDecimal(10000), videoJuegos); + Producto memoria = new Producto("memoria ram", "30 GB", new BigDecimal(10000), electronicos); + + EntityManager em = JPAUtils.getEntityManager(); + ProductoDao productoDao = new ProductoDao(em); + CategoriaDao categoriaDao = new CategoriaDao(em); + + em.getTransaction().begin(); + + categoriaDao.guardar(celulares); + categoriaDao.guardar(videoJuegos); + categoriaDao.guardar(electronicos); + + productoDao.guardar(celular); + productoDao.guardar(videoJuego); + productoDao.guardar(memoria); + + em.getTransaction().commit(); + em.close(); + } +} \ No newline at end of file diff --git a/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/prueba/PruebaDeRendimiento.java b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/prueba/PruebaDeRendimiento.java new file mode 100644 index 0000000..863ae34 --- /dev/null +++ b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/prueba/PruebaDeRendimiento.java @@ -0,0 +1,30 @@ +package com.latam.alura.tienda.prueba; + +import java.io.FileNotFoundException; + +import javax.persistence.EntityManager; + +import com.latam.alura.tienda.dao.PedidoDao; +import com.latam.alura.tienda.modelo.Pedido; +import com.latam.alura.tienda.utils.JPAUtils; + +public class PruebaDeRendimiento { + + public static void main(String[] args) throws FileNotFoundException { + + LoadRecords.cargarRegistros(); + EntityManager em = JPAUtils.getEntityManager(); + + //Pedido pedido = em.find(Pedido.class, 3l); + PedidoDao pedidoDao = new PedidoDao(em); + Pedido pedidoConCliente = pedidoDao.ConsultarPedidoConCliente(2l); + + em.close(); + //System.out.println(pedido.getFecha()); + //System.out.println(pedido.getItems().size()); + //System.out.println(pedido.getCliente().getNombre()); + + System.out.println(pedidoConCliente.getCliente().getNombre()); + } + +} diff --git a/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/prueba/RegistroDeProducto.java b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/prueba/RegistroDeProducto.java index 0805acd..a36c961 100644 --- a/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/prueba/RegistroDeProducto.java +++ b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/prueba/RegistroDeProducto.java @@ -10,6 +10,7 @@ import javax.persistence.EntityManager; import com.latam.alura.tienda.dao.CategoriaDao; import com.latam.alura.tienda.dao.ProductoDao; import com.latam.alura.tienda.modelo.Categoria; +import com.latam.alura.tienda.modelo.CategoriaId; import com.latam.alura.tienda.modelo.Producto; import com.latam.alura.tienda.utils.JPAUtils; @@ -32,76 +33,14 @@ public class RegistroDeProducto { List productos_por_nombre = productoDao.consultaPorNombre("Samsung"); productos_por_nombre.forEach(producto_ -> System.out.println(producto_.getDescripcion())); - List productos_por_nombre_categoria = productoDao.consultaPorNombreDeCategoria("Celulares"); - productos_por_nombre_categoria.forEach(producto_ -> System.out.println(producto_.getDescripcion())); + //List productos_por_nombre_categoria = productoDao.consultaPorNombreDeCategoria("Celulares"); + //productos_por_nombre_categoria.forEach(producto_ -> System.out.println(producto_.getDescripcion())); BigDecimal precio_producto = productoDao.consultaPrecioPorNombreDeProducto("Samsung"); System.out.println(precio_producto); - /* - Categoria celulares = new Categoria("Celulares"); - //Producto celular = new Producto("Samsung", "Teléfono usado", new BigDecimal("1000"), Categoria.CELULARES); - Producto celular = new Producto("Samsung", "Teléfono usado", new BigDecimal("1000"), celulares); - //celular.setNombre("Samsung"); - //celular.setDescripcion("Teléfono usado"); - //celular.setPrecio(new BigDecimal("1000")); - //EntityManagerFactory factory = Persistence.createEntityManagerFactory("tienda"); - //EntityManager em = factory.createEntityManager(); - EntityManager em = JPAUtils.getEntityManager(); - - ProductoDao productoDao = new ProductoDao(em); - CategoriaDao categoriaDao = new CategoriaDao(em); - - em.getTransaction().begin(); - categoriaDao.guardar(celulares); - productoDao.guardar(celular); - //em.persist(celular); - //em.getTransaction().commit(); - em.flush(); - em.clear(); - //em.close(); - */ - - // Acciones por aula - //em.getTransaction().begin(); - - //V1 - /* - em.getTransaction().begin(); - em.persist(celulares); - celulares.setNombre("LAPTOPS"); - em.getTransaction().commit(); - em.close(); - celulares.setNombre("PANTALLAS"); - */ - - //V2 - /* - em.persist(celulares); - celulares.setNombre("LAPTOPS"); - em.flush(); - em.clear(); - - celulares = em.merge(celulares); - celulares.setNombre("PANTALLAS"); - em.flush(); - em.remove(celulares); - */ - - //V3 - /* - em.persist(celulares); - celulares.setNombre("LAPTOPS"); - em.flush(); - em.clear(); - - celulares = em.merge(celulares); - celulares.setNombre("PANTALLAS"); - em.flush(); - //em.clear(); - em.remove(celulares); - em.flush(); - */ + Categoria find = em.find(Categoria.class, new CategoriaId("Celulares", "456")); + System.out.println(find.getNombre()); } public static void RegistrarProducto() { diff --git a/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/utils/categoria.txt b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/utils/categoria.txt new file mode 100644 index 0000000..0340d6a --- /dev/null +++ b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/utils/categoria.txt @@ -0,0 +1,8 @@ +CELULARES +LIBROS +PANTALLAS +ESTUCHES +CARGADORES +ELECTRONICOS +MONITORES +CAMARAS diff --git a/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/utils/cliente.txt b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/utils/cliente.txt new file mode 100644 index 0000000..17e19b5 --- /dev/null +++ b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/utils/cliente.txt @@ -0,0 +1,8 @@ +Juan~12jb42ww +Maria~h23jb54e +Antonio~rsf32sfgt6 +Carlos~kjb3244 +Rodrigo~lkj3265lm +Gustavo~kn12hcg2 +Estefani~kjb21okp1 +Cristina~jn234k234 diff --git a/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/utils/producto.txt b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/utils/producto.txt new file mode 100644 index 0000000..dd19d04 --- /dev/null +++ b/010_spring_boot/jpa/tienda2/src/main/java/com/latam/alura/tienda/utils/producto.txt @@ -0,0 +1,10 @@ +usado;5000;2023-03-03;CELULARES;samsun +nuevo;2500;2023-03-04;PANTALLAS;Samsung +repues;3000;2023-03-05;CELULARES;iphone +usado;1500;2023-03-06;CAMARAS;Kodak +nuevo;750;2023-03-07;PANTALLAS;Samsung +nuevo;2000;2023-03-08;CARGADORES;iphone +nuevo;3000;2023-03-09;CARGADORES;samsung +repue;1000;2023-03-10;CELULARES;samsungA20 +nuevo;3000;2023-03-09;CARGADORES;samsung +repue;1000;2023-03-10;CELULARES;samsungA20 diff --git a/010_spring_boot/jpa_avanzado.md b/010_spring_boot/jpa_avanzado.md index 2e0329a..59514b4 100644 --- a/010_spring_boot/jpa_avanzado.md +++ b/010_spring_boot/jpa_avanzado.md @@ -2,12 +2,17 @@ +- doc +[persitence](https://jakarta.ee/specifications/persistence/2.2/apidocs/javax/persistence/package-summary.html) +- Hibernate +[user guide](https://docs.jboss.org/hibernate/orm/current/userguide/html_single/Hibernate_User_Guide.html) + Trabajando sobre el [proyecto](./jpa/tienda/src/main/java/com/latam/alura/tienda/) anterior ```mermaid erDiagram - Categorias ||--o{ Productos : tiene + Categorias ||--|{ Productos : tiene Productos { id bigint PK nombre varchar @@ -118,3 +123,192 @@ y sum**) - Consultas mediante **NamedQuerys** +Nota: +[Relaciones](https://www.adictosaltrabajo.com/2020/04/02/hibernate-onetoone-onetomany-manytoone-y-manytomany/) +en Hibernate + +### Performance en consultas + +- **LAZY** Fetch: ***Carga ondemand*** (menor utlización de recursos), todas +las anotaciones ***many*** (**ManyToOne-OneToMany**) son por defecto del tipo +**LAZY**. Al cerrar el `EntityManager` y solicitar algún dato que requiere hacer +un *select* a alguna entidad de la consulta anterior se produce una expeción. +Esto se resuelve con una **Consulta Planificada** (ej. `PedidoDao` -> +`ConsultarPedidoConCliente()`) + +- **EAGER** Fetch: ***Carga Anticipada*** (mayor utlización de recursos), todas +las anotaciones del tipo ***one*** (**OneToOne-ManyToOne**) son por defecto del +tipo **EAGER** + + +Al construir aplicaciones utilizando recursos que realizan operaciones que no +explicitas se debe estudiar la documentación para entender cual es la ciencia +detrás del framework o recurso. + +Cuando se realizan consultas con la anotación **@ManyToOne** o **@OneToOne** +por debajo, JPA aplica una estrategia de carga de información llamada **Eager** +o Anticipada o Proactiva realizando JOINS entre tablas. +Pero esto no es todo, ya que si la entidad que tiene el JOIN, tiene otras entidades +dentro de sus atributos marcados con la anotación finalizando **ToOne**, también +serán cargadas dentro de la consulta. Esto puede saturar la memoria y afectar +seriamente la velocidad de carga. Para corregir se debe utilizar el parámetro +de carga ***FerchType.LAZY*** en todas las anotaciones **ToOne**, lo que indica +a JPA cargar la entidad solo si es solicitada. + +Al realizar esta corrección se presenta un posible inconveniente donde se encontre +con la necesidad de utilizar ese atributo de entidad. +Pero para ese momento el **EntityManager** se puede encontrar cerrado, por lo que +se tienen que planear las consultas previniendo el uso de esa entidad cuando se +encuentre cerrado el **EntityManager**. + + +#### Sumario Aula 3 + +- Estrategias **EAGER** y **LAZY**, en consultas de entidades relacionadas +- JPA podría lanzar `LazyInitializationException` en ciertas situaciones +- Buenas prácticas en la carga de entidades relacionadas +- Realizar **consultas programadas** con la función de búsqueda de combinación + +### Consultas con parámetros dinámicos + +### Sin API Criteria + +ej. +[productoDAO.java](./jpa/tienda2/src/main/java/com/latam/alura/tienda/dao/ProductoDao.java) + +```java + public List consultaPorParametro(String nombre, BigDecimal precio, LocalDate fecha){ + StringBuilder jpql = new StringBuilder("SELECT P FROM Producto P WHERE 1=1"); + if (nombre != null && !nombre.trim().isEmpty()) { + jpql.append(" AND P.nombre=:nombre"); + } + if (precio != null && !precio.equals(new BigDecimal(0))) { + jpql.append(" AND P.precio=:precio"); + } + if (fecha != null) { + jpql.append(" AND P.fechaDeRegistro=:fecha"); + } + TypedQuery query = em.createQuery(jpql.toString(), Producto.class); + if (nombre != null && !nombre.trim().isEmpty()) { + query.setParameter("nombre", nombre); + } + if (precio != null && !precio.equals(new BigDecimal(0))) { + query.setParameter("precio", precio); + } + if (fecha != null) { + query.setParameter("fechaDeRegistro", fecha); + } + return query.getResultList(); + } +``` + +### Con API Criteria + +```java + public List consultaPorParametrosConAPICriteria(String nombre, BigDecimal precio, LocalDate fecha){ + CriteriaBuilder builder = em.getCriteriaBuilder(); + CriteriaQuery query = builder.createQuery(Producto.class); + Root from = query.from(Producto.class); + Predicate filtro = builder.and(); + if (nombre != null && !nombre.trim().isEmpty()) { + filtro = builder.and(filtro, builder.equal(from.get("nombre"), nombre)); + } + if (precio != null && !precio.equals(new BigDecimal(0))) { + filtro = builder.and(filtro, builder.equal(from.get("precio"), precio)); + } + if (fecha != null) { + filtro = builder.and(filtro, builder.equal(from.get("fechaDeRegistro"), fecha)); + } + query = query.where(filtro); + return em.createQuery(query).getResultList(); + } +} +``` + +#### Sumario Aula 4 + +- Consultas JPQL con parámetros opcionales +- API de criterios JPA y consulta con parámetros opcionales + +## Embeddable + +Simplificación de entidades con anotaciones `@Embeddable` y `@Embedded`, ejm. +[Cliente.java](./jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/Cliente.java) +y +[DatosPersonales.java](./jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/DatosPersonales.java) + +## Mapeo de herencias + +### Join table + + + +#### Estrategia Single Table + +Una única tabla, ejm. +[Producto.java](./jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/Producto.java) + +```java +... +@Inheritance(strategy = InheritanceType.SINGLE_TABLE) +public class Producto { + ... +``` + +```mermaid +erDiagram + Productos + Productos { + id bigint PK + nombre varchar + descripcion varchar + precio decimal + categoria_id bigint FK + fecha_registro date + autor varchar + paginas int + marca varchar + modelo varchar + } +``` + +#### Estrategia Joined Table + +ejm. +[Producto.java](./jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/Producto.java) + +```java +... +@Inheritance(strategy = InheritanceType.JOINED) +public class Producto { + ... +``` + +```mermaid +erDiagram + Electronicos + Productos + Electronicos { + id bigint PK + marca varchar + modelo varchar + } + Productos { + id bigint PK + nombre varchar + descripcion varchar + precio decimal + fecha_registro date + } + Libros { + id biging PK + autor varchar + paginas int + } +``` + +## Mapeo de llaves compuestas + +ejm. +[Categoria.java](./jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/Categoria.java) +[CategoriaId.java](./jpa/tienda2/src/main/java/com/latam/alura/tienda/modelo/CategoriaId.java)