Camada que atua sob framework Spring, simplificando-o e modernizando-o, seguindo padrão MVC. Spring implementa padrão IoC (Inversion of Control), onde os objetos (Spring Beans / Beans) são instanciados automaticamente pelo container do Spring, dispensando criação manual.
JDK (Java Development Kit) é kit de ferramentas e bibliotecas para desenvolver aplicações Java. Gradle é automatizador de build moderno que usa linguagem baseada em Groovy ou Kotlin para configurar projetos. Maven é mais antigo que Gradle, gerenciando builds e dependências para projetos Java baseada em estrutura padronizada e arquivos XML de configuração.
Recomenda-se separar camadas criando-as em diferentes pacotes, dentro do pacote principal.
Pacote Controller ficará em "projeto/src/main/java/pacotePrincipal/pacoteController"
Nome do pacotePrincipal: grupoExemplo.com.nomeProjeto
Nome do pacoteController: grupoExemplo.com.nomeProjeto.pacoteController
Acesse o site Spring Initializr, e preencha os campos:
Object-Relational Mapping é padrão para integrar SQL ao código Java na aplicação, sem necessidade de códigos SQL (opcional). ORM visa abstrair camda de dados da aplicação. Tables geradas via definição de classes. Diferença entre OOP e SQL, respectivamente:
Framework Java que implementa padrão ORM, via especificações e pacotes JPA (Java Persistence API). Incorporar Hibernate JPA e MySQL em projeto Spring Boot:
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
runtimeOnly 'com.mysql:mysql-connector-j'
spring.jpa.hibernate.ddl-auto=update
spring.datasource.url=jdbc:mysql://localhost:3306/nomeBD
spring.datasource.username=nomeUsuarioBD
spring.datasource.password=senhaUsuarioBD
spring.datasource.driver-class-name = com.mysql.cj.jdbc.Driver
import jakarta.persistence.Entity;
@Entity
public class NomeEntidade {
}
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
@Entity
public class Plano {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private long id;
}
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
@Entity
public class Plano {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private long id;
@Temporal(TemporalType.TIMESTAMP)
private Date dataHora;
@Column(name="NOME_PLANO", length=50, nullable=false, unique=false)
private String nome;
@Enumerated(EnumType.STRING)
private Gender genero;
@Transient
private Integer idade; // Não armazenado em BD
}
@Entity
public class Operadora {
@OneToMany
@JoinColumn(name="operadora_id")
Set<Plano> planos;
}
@Entity
public class Endereco {
@ManyToOne
Cliente cliente;
}
@Entity
public class Cliente {
@OneToMany(mappedBy="cliente")
Set<Endereco> enderecos;
}
@Entity
public class Endereco {
@ManyToOne
Cliente cliente;
}
@Entity
public class Conta {
@ManyToMany
Set<Cliente> clientes;
}
@Entity
public class Conta {
@ManyToMany
Set<Cliente> clientes;
}
@Entity
public class Cliente {
@ManyToMany(mappedBy = "clientes")
Set<Conta> contas;
}
@Entity
public class Campus {
@OneToOne
Servidor diretor;
}
@Entity
public class Campus {
@OneToOne
Servidor diretor;
}
@Entity
public class Servidor {
@OneToOne(mappedBy = "diretor")
Campus campusDirigido;
}
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "class")
public class Cliente {
}
@Entity
@DiscriminatorValue(value="ClientePessoaFisica")
public class ClientePessoaFisica {
}
@Entity
@DiscriminatorValue(value="ClientePessoaJuridica")
public class ClientePessoaJuridica {
}
Projeto para conhecimento de estrutura Spring Boot, e geração de controllers. Gerar projeto Spring Boot Gradle-Groovy, com dados:
package ubsocial.com.proj1.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "Hello World!";
}
}
package ubsocial.com.proj1.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class CalendarController {
@GetMapping("/today")
public String today() {
return "Hoje é " + java.time.LocalDate.now();
}
@GetMapping("/tomorrow")
public String tomorrow() {
return "Amanhã é " + java.time.LocalDate.now().plusDays(1);
}
}
Projeto de operadora telefônica, com objetivo de criar aplicação com Models e incorporar, em código, relacionamentos entre classes Java, conforme acima. Relacionamentos unidirecionais (agregação, composição), somente o todo (losango) conhece sua parte (linha com seta), então será criado dado na classe do todo, cujo nome é o nome do relacionamento apontando para parte. Gerar projeto Spring Boot Gradle-Groovy, com dados:
package ubsocial.com.telefonia.model.entity;
public class Operadora {
private String nome;
}
package ubsocial.com.telefonia.model.entity.pessoal;
public class Cliente {
private String nome;
private String endereco;
}
package ubsocial.com.telefonia.model.entity.pessoal;
public class ClientePessoaFisica extends Cliente {
private String cpf;
}
package ubsocial.com.telefonia.model.entity.pessoal;
public class ClientePessoaJuridica extends Cliente {
private String cnpj;
}
package ubsocial.com.telefonia.model.entity.comercial;
import ubsocial.com.telefonia.model.entity.pessoal.Cliente;
import java.util.Set;
public class Celular {
private long numero;
private Cliente cliente;
private Set ligacoes;
private Plano plano;
}
package ubsocial.com.telefonia.model.entity.comercial;
public class CelularPosPago extends Celular {
private int diaVencimento;
}
package ubsocial.com.telefonia.model.entity.comercial;
import java.util.Date;
public class CelularPrePago extends Celular {
private double saldo;
private Date dataDeValidade;
}
package ubsocial.com.telefonia.model.entity.comercial;
import java.util.Date;
public class Ligacao {
private Date data;
private int duracao;
}
package ubsocial.com.telefonia.model.entity.comercial;
public class Plano {
private String nome;
private double valorPorMinuto;
}
Inclusão de padrões Hibernate JPA ORM no projeto 2.
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
runtimeOnly 'com.mysql:mysql-connector-j'
spring.application.name=telefonia
spring.jpa.hibernate.ddl-auto=update
spring.datasource.url=jdbc:mysql://localhost:3306/telefonia
spring.datasource.username=root
spring.datasource.password=
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
package ubsocial.com.telefonia.model.entity;
import ubsocial.com.telefonia.model.entity.comercial.Celular;
import ubsocial.com.telefonia.model.entity.comercial.Plano;
import ubsocial.com.telefonia.model.entity.pessoal.Cliente;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.OneToMany;
import java.util.Set;
@Entity
public class Operadora {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
private String nome;
@OneToMany
@JoinColumn(name = "operadora_id")
private Set<Cliente> clientes;
@OneToMany
@JoinColumn(name = "operadora_id")
private Set<Celular> celulares;
@OneToMany
@JoinColumn(name = "operadora_id")
private Set<Plano> planos;
}
package ubsocial.com.telefonia.model.entity.comercial;
import ubsocial.com.telefonia.model.entity.pessoal.Cliente;
import jakarta.persistence.DiscriminatorColumn;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Inheritance;
import jakarta.persistence.InheritanceType;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.OneToMany;
import java.util.Set;
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "class")
@Entity
public class Celular {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
private long numero;
@ManyToOne
private Cliente cliente;
@OneToMany
@JoinColumn(name = "celular_id")
private Set<Ligacao> ligacoes;
@ManyToOne
private Plano plano;
}
package ubsocial.com.telefonia.model.entity.comercial;
import jakarta.persistence.DiscriminatorValue;
import jakarta.persistence.Entity;
@Entity
@DiscriminatorValue(value = "CelularPosPago")
public class CelularPosPago extends Celular {
private int diaVencimento;
}
package ubsocial.com.telefonia.model.entity.comercial;
import java.util.Date;
import jakarta.persistence.DiscriminatorValue;
import jakarta.persistence.Entity;
import jakarta.persistence.Temporal;
import jakarta.persistence.TemporalType;
@Entity
@DiscriminatorValue(value = "CelularPrePago")
public class CelularPrePago extends Celular {
private double saldo;
@Temporal(TemporalType.DATE)
private Date dataDeValidade;
}
package ubsocial.com.telefonia.model.entity.comercial;
import java.util.Date;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Temporal;
import jakarta.persistence.TemporalType;
@Entity
public class Ligacao {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@Temporal(TemporalType.TIMESTAMP)
private Date data;
private int duracao;
}
package ubsocial.com.telefonia.model.entity.comercial;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
@Entity
public class Plano {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
private String nome;
private double valorPorMinuto;
}
package ubsocial.com.telefonia.model.entity.pessoal;
import jakarta.persistence.DiscriminatorColumn;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.Inheritance;
import jakarta.persistence.InheritanceType;
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "class")
@Entity
public class Cliente {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
private String nome;
private String endereco;
}
package ubsocial.com.telefonia.model.entity.pessoal;
import jakarta.persistence.DiscriminatorValue;
import jakarta.persistence.Entity;
@Entity
@DiscriminatorValue(value = "ClientePessoaFisica")
public class ClientePessoaFisica extends Cliente {
private String cpf;
}
package ubsocial.com.telefonia.model.entity.pessoal;
import jakarta.persistence.DiscriminatorValue;
import jakarta.persistence.Entity;
@Entity
@DiscriminatorValue(value = "ClientePessoaJuridica")
public class ClientePessoaJuridica extends Cliente {
private String cnpj;
}
Elaborado por Mateus Schwede
ubsocial.github.io