olá, eu fiz uma agenda com nome, email, dt. nascimento e telefone. e criei um BD com duas tabelas, uma tabela de contatos, e outra de telefone, pois telefone é multivalorado, não consigo trabalhar com as duas tabelas, quero adicionar um contato com nome, email, e data de nascimento na tabela contato,e telefones na tabela telefone, não sei como trablhar em java com chave primaria em duas tabelas, sou iniciante… se alguem ajudar desde jah agradeço
package Agenda;
import Agenda.Contato;
import Dao.ContatoDao;
import java.sql.Date;
import java.sql.SQLException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.List;
import javax.swing.*;
public class ContatoController {
private Date formatarData(String data) throws ParseException{
DateFormat formatter = new SimpleDateFormat ("dd/MM/yyyy");
return new Date(formatter.parse(data).getTime());
}
public void salvar(String nome, String email, String dtNascimento, String telefone, String celular) throws SQLException,
ParseException{
Contato contato = new Contato();
contato.setNome(nome);
contato.setEmail(email);
contato.setData_nascimento(formatarData(dtNascimento));
contato.setTelefone(telefone);
contato.setCelular(celular);
new ContatoDao().salvar(contato);
}
public void alterar( long id, String nome, String email, String dtNascimento, String telefone, String celular) throws SQLException,
ParseException{
Contato contato = new Contato();
contato.setId(id);
contato.setNome(nome);
contato.setEmail(email);
contato.setData_nascimento(formatarData(dtNascimento));
contato.setTelefone(telefone);
contato.setCelular(celular);
new ContatoDao().alterar(contato);
}
public List<Contato>listaContatos(){
ContatoDao dao = new ContatoDao();
try{
return dao.findContatos();
}catch(SQLException e){
JOptionPane.showMessageDialog(null, "Não foi possivel localizar esse contato\n" +
e.getLocalizedMessage());
}
return null;
}
public void excluir (long id) throws SQLException{
new ContatoDao().excluir(id);
}
public Contato buscaContatoPorNome(String nome) throws SQLException{
ContatoDao dao = new ContatoDao();
return dao.finfByName(nome);
}
}
package Agenda;
import java.sql.*;
public class ConnectionDataBase {
private static final String URL_MYSQL = "jdbc:mysql://localhost/agenda";
private static final String DRIVER_CLASS = "com.mysql.jdbc.Driver";
private static final String USER = "root";
private static final String PASS = "root123";
public static Connection getConnetion (){
try{
Class.forName(DRIVER_CLASS);
return DriverManager.getConnection(URL_MYSQL, USER, PASS);
}catch (ClassNotFoundException e){
e.printStackTrace();
}catch (SQLException e){
throw new RuntimeException(e);
}
return null;
}
}
package Dao;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import Agenda.Contato;
import Agenda.GenericDao;
public class ContatoDao extends GenericDao {
public void salvar(Contato contato) throws SQLException{
String insert = " INSERT INTO CONTATOS ( nome, email, data_nascimento) VALUES (?,?,?)";
save(insert, contato.getNome(), contato.getEmail(), contato.getData_nascimento());
}
public void alterar (Contato contato) throws SQLException{
String update = "UPDATE CONTATOS"+
"SET nome = ?, email = ? , data_nascimento = ?"+
"WHERE id = ?";
update(update, contato.getId(), contato.getNome(), contato.getEmail(), contato.getData_nascimento());
}
public void excluir (long id) throws SQLException{
String delete = "DELETE FROM CONTATOS WHERE id= ?";
delete(delete, id);
}
public List<Contato> findContatos() throws SQLException{
List<Contato> contatos = new ArrayList<Contato>();
String select = "SELECT * FROM CONTATOS";
PreparedStatement stmt = getConnection().prepareStatement(select);
ResultSet rs = stmt.executeQuery();
while (rs.next()){
Contato contato = new Contato();
contato.setId(rs.getLong("id"));
contato.setNome(rs.getString("nome"));
contato.setEmail(rs.getString("email"));
contato.setData_nascimento(rs.getDate("data_nascimento"));
contatos.add(contato);
}
rs.close();
stmt.close();
return contatos;
}
public Contato finfByName(String nome) throws SQLException{
String select = " SELECT * FROM CONTATOS WHERE nome = ?";
Contato contato = null;
PreparedStatement stmt = getConnection().prepareStatement(select);
stmt.setString(1, nome);
ResultSet rs = stmt.executeQuery();
while (rs.next()){
contato = new Contato();
contato.setId(rs.getLong("id"));
contato.setNome(rs.getString("nome"));
contato.setEmail(rs.getString("email"));
contato.setData_nascimento(rs.getDate("data_nascimento"));
contato.getTelefone();
}
rs.close();
stmt.close();
return contato;
}
}
package Frame;
import java.awt.Color;
import java.awt.Container;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import Agenda.Contato;
import Agenda.ContatoController;
@SuppressWarnings("serial")
public class ContatoFrame extends JFrame {
private JLabel lbNome, lbEmail, lbDtNascimento, lbTelefone, lbCelular;
private JTextField txtNome, txtEmail, txtDtNascimento, txtLocalizar, txtTelefone, txtCelular;
private JButton btnSalvar, btnAlterar, btnExcluir, btnClear, btnLocalizar;
private JButton btnPrimeiro, btnProximo, btnAnterior, btnUltimo;
private List<Contato> contatoList = new ContatoController().listaContatos();
private int registroAtual = 0;
public ContatoFrame() {
super("Contatos");
Container tela = getContentPane();
setLayout(null);
lbNome = new JLabel("Nome");
lbEmail = new JLabel("Email");
lbDtNascimento = new JLabel("Data de Nascimento(dd/mm/aaaa)");
lbTelefone = new JLabel("Telefone ");
lbCelular = new JLabel ("Celular ");
lbNome.setBounds(10, 10, 240, 15);
lbEmail.setBounds(10, 50, 240, 15);
lbDtNascimento.setBounds(10, 90, 240, 15);
lbTelefone.setBounds(10, 130, 240, 15);
lbCelular.setBounds(10, 170, 240, 15);
lbNome.setForeground(Color.BLACK);
lbEmail.setForeground(Color.BLACK);
lbDtNascimento.setForeground(Color.BLACK);
lbTelefone.setForeground(Color.BLACK);
lbCelular.setForeground(Color.BLACK);
lbNome.setFont(new Font("Courier New", Font.BOLD, 14));
lbEmail.setFont(new Font("Courier New", Font.BOLD, 14));
lbDtNascimento.setFont(new Font("Courier New", Font.BOLD, 14));
lbTelefone.setFont(new Font("Courier New", Font.BOLD, 14));
lbCelular.setFont(new Font("Courier New", Font.BOLD, 14));
tela.add(lbNome);
tela.add(lbEmail);
tela.add(lbDtNascimento);
tela.add(lbTelefone);
tela.add(lbCelular);
txtNome = new JTextField();
txtEmail = new JTextField();
txtDtNascimento = new JTextField();
txtTelefone = new JTextField();
txtCelular = new JTextField();
txtNome.setBounds(10, 25, 370, 20);
txtEmail.setBounds(10, 65, 370, 20);
txtDtNascimento.setBounds(10, 105, 370, 20);
txtTelefone.setBounds(10, 145, 370, 20);
txtCelular.setBounds(10, 185, 370, 20);
tela.add(txtNome);
tela.add(txtEmail);
tela.add(txtDtNascimento);
tela.add(txtTelefone);
tela.add(txtCelular);
btnSalvar = new JButton("Salvar");
btnAlterar = new JButton("Alterar");
btnExcluir = new JButton("Excluir");
btnClear = new JButton("Limpar");
btnPrimeiro = new JButton("|<");
btnAnterior = new JButton("<<");
btnProximo = new JButton(">>");
btnUltimo = new JButton(">|");
btnSalvar.setBounds(10, 250, 80, 20);
btnAlterar.setBounds(110, 250, 80, 20);
btnExcluir.setBounds(300, 250, 80, 20);
btnClear.setBounds(210, 250, 75, 20);
tela.add(btnSalvar);
tela.add(btnAlterar);
tela.add(btnExcluir);
btnPrimeiro.setBounds(50, 210, 75, 20);
btnAnterior.setBounds(120, 210, 75, 20);
btnProximo.setBounds(180, 210, 75, 20);
btnUltimo.setBounds(255, 210, 75, 20);
tela.add(btnPrimeiro);
tela.add(btnAnterior);
tela.add(btnClear);
tela.add(btnProximo);
tela.add(btnUltimo);
JLabel lbLocalizar = new JLabel("Localizar por nome");
lbLocalizar.setBounds(10, 280, 230, 20);
txtLocalizar = new JTextField();
txtLocalizar.setBounds(10, 300, 280, 20);
btnLocalizar = new JButton("Buscar");
btnLocalizar.setBounds(300, 298, 80, 20);
tela.add(lbLocalizar);
tela.add(txtLocalizar);
tela.add(btnLocalizar);
setSize(400, 365);
setVisible(true);
setLocationRelativeTo(null);
btnSalvar.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
onClickSalvar();
}
}
);
btnAlterar.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
onClickAlterar();
}
}
);
btnExcluir.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
onClickExcluir();
}
}
);
btnClear.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
clearFields();
registroAtual = 0;
}
}
);
btnLocalizar.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
onClickLocalizar();
}
}
);
btnPrimeiro.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
onClickPrimeiro();
}
}
);
btnAnterior.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
onClickAnterior();
}
}
);
btnProximo.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
onClickProximo();
}
}
);
btnUltimo.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
onClickUltimo();
}
}
);
}
private void onClickUltimo() {
registroAtual = contatoList.size() - 1;
getValores(registroAtual);
}
private void onClickProximo() {
if (registroAtual != contatoList.size() - 1) {
getValores(++registroAtual);
}
}
private void onClickAnterior() {
if (registroAtual != 0) {
getValores(--registroAtual);
}
}
private void onClickPrimeiro() {
registroAtual = 0;
getValores(registroAtual);
}
private void getValores(int index) {
if (index <= contatoList.size() - 1) {
Contato contatoAtual = contatoList.get(index);
txtNome.setText(contatoAtual.getNome());
txtEmail.setText(contatoAtual.getEmail());
txtTelefone.setText(contatoAtual.getTelefone());
txtCelular.setText(contatoAtual.getCelular());
txtDtNascimento.setText(new SimpleDateFormat("dd/MM/yyyy").format(contatoAtual.getData_nascimento()));
}
}
private void onClickAlterar() {
ContatoController cc = new ContatoController();
long id = contatoList.get(registroAtual).getId();
try {
cc.alterar(id, txtNome.getText(), txtEmail.getText(), txtDtNascimento.getText(), txtTelefone.getText(), txtCelular.getText());
JOptionPane.showMessageDialog(this, "Contato alterado com sucesso!");
clearFields();
contatoList = new ContatoController().listaContatos();
} catch (SQLException e) {
JOptionPane.showMessageDialog(this, "Nao foi possivel alterar contato!\n" + e.getLocalizedMessage());
} catch (ParseException e) {
JOptionPane.showMessageDialog(this, "Data possui formato inválido!\n" + e.getLocalizedMessage());
}
}
private void onClickSalvar() {
ContatoController cc = new ContatoController();
try {
cc.salvar (txtNome.getText(), txtEmail.getText(), txtDtNascimento.getText(), txtTelefone.getText(), txtCelular.getText());
JOptionPane.showMessageDialog(this, "Contato salvo com sucesso!");
clearFields();
contatoList = new ContatoController().listaContatos();
} catch (SQLException e) {
JOptionPane.showMessageDialog(this, "Nao foi possivel salvar contato!\n" + e.getLocalizedMessage());
} catch (ParseException e) {
JOptionPane.showMessageDialog(this, "Data possui formato inválido!\n" + e.getLocalizedMessage());
}
}
private void onClickExcluir() {
ContatoController cc = new ContatoController();
long id = contatoList.get(registroAtual).getId();
try {
cc.excluir(id);
JOptionPane.showMessageDialog(this, "Contato excluido com sucesso!");
clearFields();
contatoList = new ContatoController().listaContatos();
} catch (SQLException e) {
JOptionPane.showMessageDialog(this, "Nao foi possivel excluir o contato!\n" + e.getLocalizedMessage());
}
}
private void onClickLocalizar() {
ContatoController cc = new ContatoController();
try {
Contato c = cc.buscaContatoPorNome(txtLocalizar.getText());
txtNome.setText(c.getNome());
txtEmail.setText(c.getEmail());
txtDtNascimento.setText(new SimpleDateFormat("dd/MM/yyyy").format(c.getData_nascimento()));
txtTelefone.setText(c.getTelefone());
txtCelular.setText(c.getCelular());
} catch (SQLException e) {
JOptionPane.showMessageDialog(this, "Ocorreu um erro, tente novamente!\n" + e.getLocalizedMessage());
} catch (NullPointerException e){
JOptionPane.showMessageDialog(this, "Contato não localizado ou não existe!\n" + e.getLocalizedMessage());
}
}
private void clearFields() {
txtNome.setText("");
txtEmail.setText("");
txtDtNascimento.setText("");
txtLocalizar.setText("");
txtTelefone.setText("");
txtCelular.setText("");
}
public static void main(String[] args) {
ContatoFrame frame = new ContatoFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
jah tenho as tabelas criadas no banco de dados, se vcs presizarem mando os codigos dela tb… desde jah agradeço a todos… abraços
é a primeira vez q tento programar com chave primaria, e multivalorados… sou iniciante estudante…
e tb n tah todos os codigos q eu fiz ae, se precisar coloco o restante…
se precisar mando o restante dos codigos q eu fiz, n estão todos ae…
Iniciante e já ralou tudo isso ? Eu diria que está indo bem, colega !!
Bom, se quer fazer bonito no banco de dados, comece criando a foreign key entre as tabelas CONTATOS e TELEFONES (estou supondo que este é o nome da tabela já que não está aí). Se tiver dúvidas com essa etapa poste o script de criação das duas tabelas.
Para te explicar o que vem depois acho que fica mais fácil olhando o código do GenericDao. Pelo seguinte: imagine que você vai salvar um contato novo. Precisa obter o ID que ele vai gerar e então passá-lo como valor para o campo ID que vai existir na tua tabela TELEFONES. Como estás usando jdbc por baixo disso tudo, tem um método chamado getGeneratedKeys() da classe Statement que vai te dar exatamente isso. Veja esse exemplo: http://dev.mysql.com/tech-resources/articles/autoincrement-with-connectorj.html. O que não ficar claro pra você volte a postar e a galera não te faltará em ajuda.
obrigado amigo, mas tenho as tabelas prontas, mas o problema é que quero pegar o Id de uma pessoa e atribuir a tebela telefone, com isso posso identificar qual pessoa tem os telefones, mas não consigo fazer isso, inserir os dados nas duas tabelas, esse é o problema… obrigado
create table telefone(
id int not null,
telefone varchar(13) not null,
constraint pktelefone primary key (id, telefone),
constraint fktelefoneContatos foreign key (id)
references contatos (id)
on update cascade
on delete cascade
);
minha tabela telefone, ae tenho a tabela contatos com id, nome, email, data de nascimento, o id está com auto_increment… obrigado
agora tenho q inserir os dados nas duas tabelas…
Posta o método save() do teu GenericDao. Partindo dele acho que consigo te dar uma idéia de como fazer.
package Agenda;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class GenericDao {
private Connection connection;
protected GenericDao(){
this.connection = ConnectionDataBase.getConnetion();
}
protected Connection getConnection(){
return connection;
}
protected void save(String insertSql, Object... parametros)throws SQLException{
PreparedStatement pstmt = getConnection().prepareStatement(insertSql);
for (int i=0; i<parametros.length; i++){
pstmt.setObject(i+1, parametros[i]);
}
pstmt.execute();
pstmt.close();
}
protected void update (String updateSql, Object id, Object... parametros) throws SQLException{
PreparedStatement pstmt = getConnection().prepareStatement(updateSql);
for (int i=0; i<parametros.length; i++){
pstmt.setObject(i+1, parametros[i]);
}
pstmt.setObject(parametros.length + 1, id);
pstmt.execute();
pstmt.close();
}
protected void delete(String deleteSql, Object... parametros) throws SQLException{
PreparedStatement pstmt = getConnection().prepareStatement(deleteSql);
for (int i=0; i<parametros.length; i++){
pstmt.setObject(i+1, parametros[i]);
}
pstmt.execute();
pstmt.close();
}
}
Reescrevendo o método save para algo como isso, você vai ter o retorno do ID do contato que salvou.
[code]protected int save(String insertSql, Object… parametros)throws SQLException{
PreparedStatement pstmt = getConnection().prepareStatement(insertSql,Statement.RETURN_GENERATED_KEYS);
for (int i=0; i<parametros.length; i++){
pstmt.setObject(i+1, parametros[i]);
}
pstmt.execute();
Resultset rs = pstm.getGeneratedKeys();
int retorno = -1;
if(rs.next()){
retorno = rs.getInt("ID");
}
rs.close();
pstmt.close();
return retorno;
} [/code]
Daí, seu método salvar da classe ContatoDao seria tipo isso:
public void salvar(Contato contato) throws SQLException{
String insertContato = " INSERT INTO CONTATOS ( nome, email, data_nascimento) VALUES (?,?,?)";
String insertTelefones = "INSERT INTO TELEFONES(id, telefone) values(?,?)";
int id = save(insertContato, contato.getNome(), contato.getEmail(), contato.getData_nascimento());
if(id > -1){
save(insertTelefones, id, contato.getTelefone());
save(insertTelefones, id, contato.getCelular());
}
}
Palpite de um cara já sonolento… não testei mas tá nesse rumo aí. Continue postando qualquer problema
agora tah dando o erro “column “id” not found”, oq q tah acontecendo, não sei pra onde correr… hehe… abraços
consegui aki amigo, é desse jeito msm, só esta com um erro no seu codigo
protected int save(String insertSql, Object... parametros)throws SQLException{
PreparedStatement pstmt = getConnection().prepareStatement(insertSql,Statement.RETURN_GENERATED_KEYS);
for (int i=0; i<parametros.length; i++){
pstmt.setObject(i+1, parametros[i]);
}
pstmt.execute();
Resultset rs = pstm.getGeneratedKeys();
int retorno = -1;
if(rs.next()){
retorno = rs.getInt(1);
}
rs.close();
pstmt.close();
return retorno;
}
tem q retornar 1 e não “ID”, obrigado, agora vou tentar arrumar os outros erros, valeu msm amigão… agradeço mt
agora tah dano erro ao listar os contatos, alguem pode dá uma luz, arruma um problema mais aparece outro, mas é assim q se aprende… obrigado
obrigado
Se ainda estiver com erro posta qual é pra galera ver.
olá agora tah dando erro ao buscar o contato, está imprimindo nome, email, dt de nascimento, ams não imprime os telefones, eu sei q está errado o metodo de busca mas não tenho ideia de como fazer, e tb outro erro é que quando quero excluir um contato, exclui, mas esxclui o contato errado, não e que eu quero excluir de verdade…
na minha opinião o erro esta na classe ContatoDao… desde jah agradeço