JAVAFX com JPA e MySQL
Há muitos tutoriais, apostilas e vídeos ensinando e passando dicas de como programar em javafx de maneira rápida, simples e até básica demais. Isso ajuda a todos os iniciantes e até quem já programa em java, mas em JPA com conexão em Bancos como MySQL são poucos.
Por isso vou iniciar um projeto simples, para exemplificar de forma padronizada usando o modelo MVC, para que o programa seja de fácil manutenção.
O projeto será construído usando Netbeans 8.1, Banco MySQL, JPA e JavaFX. O JDK é o mais recente, no meu caso 1.8.1, o driver do MySQL será usado o da bibioteca no netbeans.
Vamos começar pelo banco de dados, se você já tem um banco pronto, fica mais fácil para iniciar o projeto, caso contrário crie-o para poder usá-lo. A criação do banco não é o escopo do Blog, mas postarei futuramente sobre o assunto.
O banco é sobre uma agenda de consultório médico, que possui quatro classes, sendo uma de relacionamento entre elas. As três principais:
A classe consulta receberá as chaves primárias das classes principais, assim ela será a classe que dará vida ao programa:
Coloque o nome que preferir no projeto e no FXMDocument, e finalize:
Após criação do projeto no netbeans, deverá criar os pacotes seguintes: controller, modelo, tela, jpa, principal (controlefx) e dao. Ele deverá ficar parecido com o que segue abaixo.
Selecione os drivers e adicione-os ao projeto:
Agora clique o direito do mouse sobre o projeto e selecione classes de entidade do banco..., ou em outros, Persistencia e Classes de entidade do banco, depois em próximo:
Selecione a conexão de banco que você criou e depois selecione as classes em tabelas disponíveis e adicione em tabelas Selecionadas:
O projeto será construído usando Netbeans 8.1, Banco MySQL, JPA e JavaFX. O JDK é o mais recente, no meu caso 1.8.1, o driver do MySQL será usado o da bibioteca no netbeans.
Vamos começar pelo banco de dados, se você já tem um banco pronto, fica mais fácil para iniciar o projeto, caso contrário crie-o para poder usá-lo. A criação do banco não é o escopo do Blog, mas postarei futuramente sobre o assunto.
O banco é sobre uma agenda de consultório médico, que possui quatro classes, sendo uma de relacionamento entre elas. As três principais:
- Cliente
- Técnico
- Exame.
A classe consulta receberá as chaves primárias das classes principais, assim ela será a classe que dará vida ao programa:
- Consulta
Abra o NetBeans e crie um novo projeto com aplicacao fxml do javafx, clique em próximo.
Coloque o nome que preferir no projeto e no FXMDocument, e finalize:
Após criação do projeto no netbeans, deverá criar os pacotes seguintes: controller, modelo, tela, jpa, principal (controlefx) e dao. Ele deverá ficar parecido com o que segue abaixo.
Agora vamos adicionar o driver do MySQL para conexão do banco e EclipseLink (JPA 2.1)
Agora clique o direito do mouse sobre o projeto e selecione classes de entidade do banco..., ou em outros, Persistencia e Classes de entidade do banco, depois em próximo:
Selecione a conexão de banco que você criou e depois selecione as classes em tabelas disponíveis e adicione em tabelas Selecionadas:
Agora verifique os nomes das classes e inclua no pacote modelo, depois clique em finalizar.
Observação: Após inserir o driver remova o driver EclipseLink-ModelGen da aba processador no item bibliotecas na propriedades do projeto, o netbeans insere automaticamente esta biblioteca no projeto, causando erro ao executar o programa:
Verá que no pacote modelo contêm todas as classes do banco:
Agora podemos desenvolver o projeto, no pacote jpa clique com o direito do mouse e em novo -> outros -> Persistencia -> Classe do Controlador JPA de Classes de Banco ..., e em próximo. Em seguida adicione todas as classes do banco relacionada ao seu banco:
Classes do pacote modelo descritas abaixo:
package modelo;
import java.io.Serializable;
import java.util.List;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;
/**
*
* @author claudio
*/
@Entity
@Table(name = "tecnicos")
@XmlRootElement
@NamedQueries({
@NamedQuery(name = "Tecnicos.findAll", query = "SELECT t FROM Tecnicos t"),
@NamedQuery(name = "Tecnicos.findByTcnId", query = "SELECT t FROM Tecnicos t WHERE t.tcnId = :tcnId"),
@NamedQuery(name = "Tecnicos.findByTcnNome", query = "SELECT t FROM Tecnicos t WHERE t.tcnNome = :tcnNome"),
@NamedQuery(name = "Tecnicos.findByTcnFone", query = "SELECT t FROM Tecnicos t WHERE t.tcnFone = :tcnFone"),
@NamedQuery(name = "Tecnicos.findByTcnEspecialidade", query = "SELECT t FROM Tecnicos t WHERE t.tcnEspecialidade = :tcnEspecialidade")})
public class Tecnicos implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "tcn_id")
private Integer tcnId;
@Basic(optional = false)
@Column(name = "tcn_nome")
private String tcnNome;
@Basic(optional = false)
@Column(name = "tcn_fone")
private String tcnFone;
@Basic(optional = false)
@Column(name = "tcn_especialidade")
private String tcnEspecialidade;
@OneToMany(mappedBy = "cnsTecnico")
private List<Consultas> consultasList;
public Tecnicos() {
}
public Tecnicos(Integer tcnId) {
this.tcnId = tcnId;
}
public Tecnicos(Integer tcnId, String tcnNome, String tcnFone, String tcnEspecialidade) {
this.tcnId = tcnId;
this.tcnNome = tcnNome;
this.tcnFone = tcnFone;
this.tcnEspecialidade = tcnEspecialidade;
}
public Integer getTcnId() {
return tcnId;
}
public void setTcnId(Integer tcnId) {
this.tcnId = tcnId;
}
public String getTcnNome() {
return tcnNome;
}
public void setTcnNome(String tcnNome) {
this.tcnNome = tcnNome;
}
public String getTcnFone() {
return tcnFone;
}
public void setTcnFone(String tcnFone) {
this.tcnFone = tcnFone;
}
public String getTcnEspecialidade() {
return tcnEspecialidade;
}
public void setTcnEspecialidade(String tcnEspecialidade) {
this.tcnEspecialidade = tcnEspecialidade;
}
@XmlTransient
public List<Consultas> getConsultasList() {
return consultasList;
}
public void setConsultasList(List<Consultas> consultasList) {
this.consultasList = consultasList;
}
@Override
public int hashCode() {
int hash = 0;
hash += (tcnId != null ? tcnId.hashCode() : 0);
return hash;
}
@Override
public boolean equals(Object object) {
// TODO: Warning - this method won't work in the case the id fields are not set
if (!(object instanceof Tecnicos)) {
return false;
}
Tecnicos other = (Tecnicos) object;
if ((this.tcnId == null && other.tcnId != null) || (this.tcnId != null && !this.tcnId.equals(other.tcnId))) {
return false;
}
return true;
}
@Override
public String toString() {
return tcnNome + " ";
}
}
package modelo;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;
/**
*
* @author claudio
*/
@Entity
@Table(name = "pacientes")
@XmlRootElement
@NamedQueries({
@NamedQuery(name = "Pacientes.findAll", query = "SELECT p FROM Pacientes p"),
@NamedQuery(name = "Pacientes.findByPctId", query = "SELECT p FROM Pacientes p WHERE p.pctId = :pctId"),
@NamedQuery(name = "Pacientes.findByPctNome", query = "SELECT p FROM Pacientes p WHERE p.pctNome = :pctNome"),
@NamedQuery(name = "Pacientes.findByPctEndereco", query = "SELECT p FROM Pacientes p WHERE p.pctEndereco = :pctEndereco"),
@NamedQuery(name = "Pacientes.findByPctSexo", query = "SELECT p FROM Pacientes p WHERE p.pctSexo = :pctSexo"),
@NamedQuery(name = "Pacientes.findByPctFone", query = "SELECT p FROM Pacientes p WHERE p.pctFone = :pctFone"),
@NamedQuery(name = "Pacientes.findByPctNascimento", query = "SELECT p FROM Pacientes p WHERE p.pctNascimento = :pctNascimento")})
public class Pacientes implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "pct_id")
private Integer pctId;
@Basic(optional = false)
@Column(name = "pct_nome")
private String pctNome;
@Basic(optional = false)
@Column(name = "pct_endereco")
private String pctEndereco;
@Basic(optional = false)
@Column(name = "pct_sexo")
private String pctSexo;
@Column(name = "pct_fone")
private String pctFone;
@Column(name = "pct_nascimento")
@Temporal(TemporalType.DATE)
private Date pctNascimento;
@OneToMany(mappedBy = "cnsPaciente")
private List<Consultas> consultasList;
public Pacientes() {
}
public Pacientes(Integer pctId) {
this.pctId = pctId;
}
public Pacientes(Integer pctId, String pctNome,String pctSexo, String pctFone,Date pctNascimento, String pctEndereco) {
this.pctId = pctId;
this.pctNome = pctNome;
this.pctEndereco = pctEndereco;
this.pctSexo = pctSexo;
this.pctFone = pctFone;
consultasList = new ArrayList<>();
}
public Integer getPctId() {
return pctId;
}
public void setPctId(Integer pctId) {
this.pctId = pctId;
}
public String getPctNome() {
return pctNome;
}
public void setPctNome(String pctNome) {
this.pctNome = pctNome;
}
public String getPctEndereco() {
return pctEndereco;
}
public void setPctEndereco(String pctEndereco) {
this.pctEndereco = pctEndereco;
}
public String getPctSexo() {
return pctSexo;
}
public void setPctSexo(String pctSexo) {
this.pctSexo = pctSexo;
}
public String getPctFone() {
return pctFone;
}
public void setPctFone(String pctFone) {
this.pctFone = pctFone;
}
public Date getPctNascimento() {
return pctNascimento;
}
public void setPctNascimento(Date pctNascimento) {
this.pctNascimento = pctNascimento;
}
@XmlTransient
public List<Consultas> getConsultasList() {
return consultasList;
}
public void setConsultasList(List<Consultas> consultasList) {
this.consultasList = consultasList;
}
@Override
public int hashCode() {
int hash = 0;
hash += (pctId != null ? pctId.hashCode() : 0);
return hash;
}
@Override
public boolean equals(Object object) {
// TODO: Warning - this method won't work in the case the id fields are not set
if (!(object instanceof Pacientes)) {
return false;
}
Pacientes other = (Pacientes) object;
if ((this.pctId == null && other.pctId != null) || (this.pctId != null && !this.pctId.equals(other.pctId))) {
return false;
}
return true;
}
@Override
public String toString() {
return pctNome;
}
}
package modelo;
import java.io.Serializable;
import java.util.List;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;
/**
*
* @author claudio
*/
@Entity
@Table(name = "exames")
@XmlRootElement
@NamedQueries({
@NamedQuery(name = "Exames.findAll", query = "SELECT e FROM Exames e"),
@NamedQuery(name = "Exames.findByExmId", query = "SELECT e FROM Exames e WHERE e.exmId = :exmId"),
@NamedQuery(name = "Exames.findByExmDescricao", query = "SELECT e FROM Exames e WHERE e.exmDescricao = :exmDescricao"),
@NamedQuery(name = "Exames.findByExmValor", query = "SELECT e FROM Exames e WHERE e.exmValor = :exmValor")})
public class Exames implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "exm_id")
private Integer exmId;
@Basic(optional = false)
@Column(name = "exm_descricao")
private String exmDescricao;
// @Max(value=?) @Min(value=?)//if you know range of your decimal fields consider using these annotations to enforce field validation
@Column(name = "exm_valor")
private Double exmValor;
@OneToMany(mappedBy = "cnsExame")
private List<Consultas> consultasList;
public Exames() {
}
public Exames(Integer exmId) {
this.exmId = exmId;
}
public Exames(Integer exmId, String exmDescricao, Double exmValor) {
this.exmId = exmId;
this.exmDescricao = exmDescricao;
this.exmValor = exmValor;
}
public Integer getExmId() {
return exmId;
}
public void setExmId(Integer exmId) {
this.exmId = exmId;
}
public String getExmDescricao() {
return exmDescricao;
}
public void setExmDescricao(String exmDescricao) {
this.exmDescricao = exmDescricao;
}
public Double getExmValor() {
return exmValor;
}
public void setExmValor(Double exmValor) {
this.exmValor = exmValor;
}
@XmlTransient
public List<Consultas> getConsultasList() {
return consultasList;
}
public void setConsultasList(List<Consultas> consultasList) {
this.consultasList = consultasList;
}
@Override
public int hashCode() {
int hash = 0;
hash += (exmId != null ? exmId.hashCode() : 0);
return hash;
}
@Override
public boolean equals(Object object) {
// TODO: Warning - this method won't work in the case the id fields are not set
if (!(object instanceof Exames)) {
return false;
}
Exames other = (Exames) object;
if ((this.exmId == null && other.exmId != null) || (this.exmId != null && !this.exmId.equals(other.exmId))) {
return false;
}
return true;
}
@Override
public String toString() {
return exmDescricao + " ";
}
}
package modelo;
import java.io.Serializable;
import java.util.Date;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.xml.bind.annotation.XmlRootElement;
/**
*
* @author claudio
*/
@Entity
@Table(name = "consultas")
@XmlRootElement
@NamedQueries({
@NamedQuery(name = "Consultas.findAll", query = "SELECT c FROM Consultas c"),
@NamedQuery(name = "Consultas.findByCnsId", query = "SELECT c FROM Consultas c WHERE c.cnsId = :cnsId"),
@NamedQuery(name = "Consultas.findByCnsData", query = "SELECT c FROM Consultas c WHERE c.cnsData = :cnsData"),
@NamedQuery(name = "Consultas.findByCnsHora", query = "SELECT c FROM Consultas c WHERE c.cnsHora = :cnsHora")})
public class Consultas implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "cns_id")
private Integer cnsId;
@Basic(optional = false)
@Column(name = "cns_data")
@Temporal(TemporalType.DATE)
private Date cnsData;
@Basic(optional = false)
@Column(name = "cns_hora")
@Temporal(TemporalType.TIME)
private Date cnsHora;
@JoinColumn(name = "cns_paciente", referencedColumnName = "pct_id")
@ManyToOne
private Pacientes cnsPaciente;
@JoinColumn(name = "cns_tecnico", referencedColumnName = "tcn_id")
@ManyToOne
private Tecnicos cnsTecnico;
@JoinColumn(name = "cns_exame", referencedColumnName = "exm_id")
@ManyToOne
private Exames cnsExame;
public Consultas() {
}
public Consultas(Integer cnsId) {
this.cnsId = cnsId;
}
public Consultas(Integer cnsId, Date cnsData, Date cnsHora) {
this.cnsId = cnsId;
this.cnsData = cnsData;
this.cnsHora = cnsHora;
cnsPaciente = new Pacientes(cnsPaciente.getPctId());
cnsTecnico = new Tecnicos(cnsTecnico.getTcnId());
cnsExame = new Exames(cnsTecnico.getTcnId());
}
public Integer getCnsId() {
return cnsId;
}
public void setCnsId(Integer cnsId) {
this.cnsId = cnsId;
}
public Date getCnsData() {
return cnsData;
}
public void setCnsData(Date cnsData) {
this.cnsData = cnsData;
}
public Date getCnsHora() {
return cnsHora;
}
public void setCnsHora(Date cnsHora) {
this.cnsHora = cnsHora;
}
public Pacientes getCnsPaciente() {
return cnsPaciente;
}
public void setCnsPaciente(Pacientes cnsPaciente) {
this.cnsPaciente = cnsPaciente;
}
public Tecnicos getCnsTecnico() {
return cnsTecnico;
}
public void setCnsTecnico(Tecnicos cnsTecnico) {
this.cnsTecnico = cnsTecnico;
}
public Exames getCnsExame() {
return cnsExame;
}
public void setCnsExame(Exames cnsExame) {
this.cnsExame = cnsExame;
}
@Override
public int hashCode() {
int hash = 0;
hash += (cnsId != null ? cnsId.hashCode() : 0);
return hash;
}
@Override
public boolean equals(Object object) {
// TODO: Warning - this method won't work in the case the id fields are not set
if (!(object instanceof Consultas)) {
return false;
}
Consultas other = (Consultas) object;
if ((this.cnsId == null && other.cnsId != null) || (this.cnsId != null && !this.cnsId.equals(other.cnsId))) {
return false;
}
return true;
}
@Override
public String toString() {
return "modelo.Consultas[ cnsId=" + cnsId + " ]";
}
}











Comentários
Postar um comentário