Galera, sou iniciante em JDBC. To fazendo um exemplo simples de uma agenda. O projeto em si tem 4 classes: Pessoa, Telefone, Dao e a Aplicação. Segue o código das classes:
Pessoa:
package Entidades;
import Entidades.Telefone;
import java.util.ArrayList;
import java.util.List;
public class Pessoa {
private int id;
private String nome;
private List<Telefone> telefone = new ArrayList<Telefone>();;
public Pessoa(int id, String nome) {
this.id = id;
this.nome = nome;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public List<Telefone> getTelefone() {
return telefone;
}
public void setTelefone(List<Telefone> telefone) {
this.telefone = telefone;
}
public void addTelefone(Telefone t){
telefone.add(t);
}
public String toString() {
return "pessoa: " + id + "-" + nome + ", telefones = " + telefone;
}
}
Telefone:
package Entidades;
public class Telefone {
private int idTelefone;
private int idPessoa;
private String numero;
public Telefone(int idTelefone, int idPessoa, String numero) {
this.idTelefone = idTelefone;
this.idPessoa = idPessoa;
this.numero = numero;
}
public int getIdTelefone() {
return idTelefone;
}
public void setIdTelefone(int idTelefone) {
this.idTelefone = idTelefone;
}
public int getIdPessoa() {
return idPessoa;
}
public void setIdPessoa(int idPessoa) {
this.idPessoa = idPessoa;
}
public String getNumero() {
return numero;
}
public void setNumero(String numero) {
this.numero = numero;
}
public String toString() {
return numero;
}
}
Dao:
package DAO;
import Entidades.Pessoa;
import Entidades.Telefone;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
public class Dao {
private static Connection con;
public static boolean abrirBanco() {
if(con == null) {
try {
System.out.println("Iniciando a conexão com o BD...");
Class.forName("com.mysql.jdbc.Driver");
String url= "jdbc:mysql://localhost:3306/Agenda";
con = DriverManager.getConnection(url,"root","admin");
System.out.println("Banco de Dados Ok e Pronto...");
return true;
}
catch(Exception erro) {
System.out.println(erro.getMessage());
System.out.println("Erro ao conectar ao BD: " + erro.getMessage());
return false;
}
}
return false;
}
public static boolean fecharBanco() {
if(con != null) {
try {
con.close();
System.out.println("Banco de Dados Fechado Com Sucesso...");
return true;
}
catch(Exception erro) {
System.out.println(erro.getMessage());
System.out.println("Erro ao conectar ao BD: " + erro.getMessage());
return false;
}
}
return false;
}
public static boolean droparTabelas() {
String sqlPessoa = "";
String sqlTelefone = "";
PreparedStatement st;
int verificadorDeErroOuAcerto = 0;
try{
sqlPessoa = "drop table Pessoa";
st = con.prepareStatement(sqlPessoa);
st.executeUpdate();
verificadorDeErroOuAcerto = 1;
}
catch(SQLException e) {
System.out.println(e.getMessage());
System.out.println("Erro ao executar :" + sqlPessoa);
verificadorDeErroOuAcerto = 0;
}
try {
sqlTelefone = "drop table Telefone";
st = con.prepareStatement(sqlTelefone);
st.executeUpdate();
verificadorDeErroOuAcerto = 1;
}
catch(SQLException e) {
System.out.println(e.getMessage());
System.out.println("Erro ao executar :" + sqlTelefone);
verificadorDeErroOuAcerto = 0;
}
if (verificadorDeErroOuAcerto == 0)
return false;
else
return true;
}
public static boolean gravar(Pessoa p) {
String sqlPessoa = "";
String sqlTelefone = "";
int verificadorDeErroOuAcerto = 0;
PreparedStatement st;
try {
sqlPessoa= "insert into Pessoa (nome) values (?)";
st = con.prepareStatement(sqlPessoa);
st.setString(1, p.getNome());
st.executeUpdate();
verificadorDeErroOuAcerto = 1;
}
catch(SQLException e) {
System.out.println(e.getMessage());
System.out.println("Erro ao inserir :" + sqlPessoa);
verificadorDeErroOuAcerto = 0;
}
try {
for(Telefone t : p.getTelefone()) {
sqlTelefone = "insert into Telefone (numero, idPessoa) values (?, ?)";
st = con.prepareStatement(sqlTelefone);
st.setString(1, t.getNumero());
st.setInt(2, p.getId());
st.executeUpdate();
verificadorDeErroOuAcerto = 1;
}
}
catch(SQLException e) {
System.out.println(e.getMessage());
System.out.println("Erro ao inserir :" + sqlTelefone);
verificadorDeErroOuAcerto = 0;
}
if (verificadorDeErroOuAcerto == 1) {
System.out.println("Dados Incluidos com Sucesso...");
return true;
}
else {
return false;
}
}
public static Pessoa localizarPessoa(int idPessoa) {
String sqlPessoa = "";
String sqlTelefone = "";
PreparedStatement st;
ResultSet rs = null;
String nome;
Pessoa p = null;
String numero;
try {
sqlPessoa = "select idPessoa, nome from Pessoa where idPessoa = " + idPessoa;
st = con.prepareStatement(sqlPessoa);
rs = st.executeQuery();
}
catch(SQLException e) {
System.out.println(e.getMessage());
System.out.println("Erro ao executar:" + sqlPessoa);
}
try {
if(rs.next()) {
idPessoa = rs.getInt("idPessoa");
nome = rs.getString("nome");
p = new Pessoa(idPessoa, nome);
p.setId(idPessoa);
}
sqlTelefone = "select idTelefone, numero from Telefone where idPessoa = " + idPessoa;
st = con.prepareStatement(sqlTelefone);
rs = st.executeQuery();
while(rs.next()) {
int idTelefone = rs.getInt("idTelefone");
numero = rs.getString("numero");
p.addTelefone(new Telefone(idTelefone, idPessoa, numero));
}
return p;
}
catch(SQLException e) {
System.out.println(e.getMessage());
System.out.println("Erro ao executar:" + sqlTelefone);
}
return null;
}
public static ArrayList<Pessoa> listar() {
int idPessoa;
String nome;
ArrayList<Pessoa> resultado = new ArrayList<Pessoa>();
String sqlPessoa = "";
String sqlTelefone = "";
ResultSet rs = null;
PreparedStatement st;
try {
sqlPessoa = "select idPessoa, nome from pessoa";
st = con.prepareStatement(sqlPessoa);
rs = st.executeQuery();
}
catch(SQLException e) {
System.out.println(e.getMessage());
System.out.println("Erro ao executar:" + sqlPessoa);
}
try {
while(rs.next()) {
idPessoa = rs.getInt("idPessoa");
nome = rs.getString("nome");
Pessoa p = new Pessoa(idPessoa, nome);
p.setId(idPessoa);
resultado.add(p);
}
//ler os telefones de cada pessoa
for(Pessoa p: resultado) {
sqlTelefone = "select idTelefone, numero from telefone where idPessoa = " + p.getId();
st = con.prepareStatement(sqlTelefone);
rs = st.executeQuery();
while(rs.next()) {
int idTelefone = rs.getInt("idTelefone");
String numero = rs.getString("numero");
p.addTelefone(new Telefone(idTelefone, p.getId(), numero));
}
}
}
catch(SQLException e) {
System.out.println(e.getMessage());
System.out.println("Erro ao executar:" + sqlTelefone);
}
return resultado;
}
}
Aplicação:
package Aplicacão;
import DAO.Dao;
import Entidades.Pessoa;
import Entidades.Telefone;
public class Main {
public Main() {
Dao.abrirBanco();
Pessoa p1,p2;
Telefone t1,t2,t3,t4;
p1 = new Pessoa(1, "joao");
p2 = new Pessoa(2, "maria");
t1 = new Telefone(1, p1.getId(), "111");
t2 = new Telefone(2, p1.getId(), "222");
t3 = new Telefone(3, p2.getId(), "333");
t4 = new Telefone(4, p2.getId(), "444");
p1.addTelefone(t1);
p1.addTelefone(t2);
p2.addTelefone(t3);
p2.addTelefone(t4);
System.out.println("\n-----------objetos criados-----------");
System.out.println(p1.toString());
System.out.println(p2.toString());
System.out.println("\n-------------------------------------");
Dao.gravar(p1);
Dao.gravar(p2);
Pessoa p = Dao.localizarPessoa(1);
System.out.println("\nlocalizou --> " + p.toString());
System.out.println("\n-----------listagem de Pessoas-----------");
for (Pessoa pess : Dao.listar()) {
System.out.println(pess.toString());
}
Dao.fecharBanco();
}
public static void main(String[] args) {
Main ap = new Main();
}
}
Querys de criação das tabelas do banco:
Pessoa:
create table Pessoa (
idPessoa INT NOT NULL AUTO_INCREMENT,
nome VARCHAR(45) NOT NULL,
PRIMARY KEY(idPessoa));
Telefone:
create table Telefone (
idTelefone int not null auto_increment,
numero varchar(20) null,
idPessoa int not null,
primary key(idTelefone),
foreign key(idPessoa) references pessoa(idPessoa)) engine = innodb;
Quando rodo o programa aparece na console:
[b]Iniciando a conexão com o BD…
Banco de Dados Ok e Pronto…
-----------objetos criados-----------
pessoa: 1-joao, telefones = [111, 222]
pessoa: 2-maria, telefones = [333, 444]
[size=18]Cannot add or update a child row: a foreign key constraint fails (agenda
.telefone
, CONSTRAINT telefone_ibfk_1
FOREIGN KEY (idPessoa
) REFERENCES pessoa
(idPessoa
))[/size]
Erro ao inserir :insert into Telefone (numero, idPessoa) values (?, ?)
[size=18]Cannot add or update a child row: a foreign key constraint fails (agenda
.telefone
, CONSTRAINT telefone_ibfk_1
FOREIGN KEY (idPessoa
) REFERENCES pessoa
(idPessoa
))[/size]
Erro ao inserir :insert into Telefone (numero, idPessoa) values (?, ?)[/b]
Qual o problema de ter a falha na chave estrangeira presente em telefone?
Então é isso…
Agradeço quem puder ajudar.
Vlw!