Inserir no banco mysql, dados do teclado através do java

10 respostas
programaçãojavamysql
H

Prezados;
Estou tentando fazer um programa onde vou inserir, deletar, alterar e consultar em um banco de dados, já fiz algumas classes como a de Conexão, DTO, DAO e uma para entrada de dados via teclado com o uso da Classe Scanner.
Porém estou tendo dificuldades para inserir no banco, chamando as classes na classe principal (MAIN). Já tentei algumas formas, mas todas sem sucesso.
Será poderiam me dar um exemplo de como ficaria a classe MAIN?

Desde já, agradeço a ajuda de todos.

Classe DTO

public class Pessoa {
        private int id_pessoa;
        private String nome;
        
        public int getid_pessoa (){
            return id_pessoa;
        }
        
        public void setid_pessoa(int id_pessoa){
            this.id_pessoa = id_pessoa;
        }
        
        public String getnome(){
            return nome;
        }
        
        public void setnome (String nome){
            this.nome = nome;
        }
        
        public String toString(){
            return getid_pessoa() + " " + getnome();
        }
        
    }

Classe DAO

public class pessoa {
    public void inserir (Pessoa pessoa) {
        try{
            Connection connection = (Connection) ConDB.getInstance().getConnection();
        
        String sql = "INSERT INTO pessoa(nome) VALUES (?)";
                
          PreparedStatement statement = connection.prepareStatement(sql);
          statement.setString(2, pessoa.getnome());
          statement.execute();
          connection.close();
        
        } catch (Exception e){
            e.printStackTrace();
        }
        
        System.out.println("Cleinte inserido");
    }
    
    public void remover(int idpessoa) {
        try{
            try (Connection connection = (Connection) ConDB.getInstance().getConnection()) {
                String sql = "DELET FROM pessoa WHERE id_pessoa = ?";
                
                PreparedStatement statement = connection.prepareStatement(sql);
                
                statement.setInt(1, idpessoa);
                statement.execute();
            }
            
            
        } catch (Exception e){
            e.printStackTrace();
        }
    }
    
    public List<Pessoa> listaTodos(){
        List<Pessoa> listaPessoas = new ArrayList<Pessoa>();
        try{
            Connection connection = (Connection) ConDB.getInstance().getConnection();
            
            String sql = "SELECT * FORM pessoa";
            PreparedStatement statement = connection.prepareStatement(sql);
            ResultSet resultset = statement.executeQuery();
            
            while(resultset.next()){
                Pessoa pessoalist = new Pessoa();
                pessoalist.setid_pessoa(resultset.getInt("id_pessoa"));
                pessoalist.setnome(resultset.getString("nome"));
                
                listaPessoas.add(pessoalist);
            }
            connection.close();
            
        }catch(Exception e){
            e.printStackTrace();
        }
        return listaPessoas;
    }
    
    
    public void atualaizar (Pessoa pessoaat){
        try{
            Connection connection = (Connection) ConDB.getInstance().getConnection();
            
            String sql = "UPDATE FROM SET nome = ? WHERE id_pessoa = ?";
            //caso haja mais elementos colocar ""UPDATE FROM SET nome = ?,tel = ?, valor =?,... WHERE id_pessoa = ?"
                    
            PreparedStatement statement = connection.prepareStatement(sql);
            statement.setString(1, pessoaat.getnome());
            statement.setInt(2, pessoaat.getid_pessoa());
            //acrescentar statement para cada campo da tabela do banco
            statement.execute();
            connection.close();
            
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

Classe Entradas do Teclado

public class dados {
    Scanner ler = new Scanner (System.in);
    
     public String nome (String nomein){ 
      Pessoa dados = new Pessoa();
       System.out.println("insira o nome do clinte: \n");
         dados.setnome(ler.nextLine());
       System.out.println("nome inserido com sucesso: \n" + dados.getnome());
          return nomein;
    }    
}

10 Respostas

J

Informa o problema que ocorre.

H

Tem algumas coisas no seu código que me deixou confuso, por exemplo o nome da classe ser igual ao nome de um atributo

public class pessoa {
public void inserir (Pessoa pessoa) {

aconselho a mudar o nome da classe para ClasseDAO, depois no main você pega os dados através de um jtextfield e coloca em um objeto do tipo pessoa, conforme exemplo abaixo que pode usar no main.

Pessoa pessoa = new Pessoa();
pessoa.setNome(jTextField1.getText());
ClasseDAO classeDAO = new ClasseDAO();
classeDAO.inserir(pessoa);
H

Posta todo o seu código de todas as classes e o erro que você acha no main para podermos ajudar melhor.

H

Heitor;
De ante mão, já agradeço sua ajudo.
segue abaixo o método MAIN que tentei fazer, também realizei a mudança que você indicou e modifiquei o nome da classe “pessoa” para CRUD.

Método MAIN

public class UsandoDB {

    private static Object rec;
    private static Object jTextField1;

    public static void main(String[] args) {
        
        
        dados in = new dados();
        Pessoa pessoa = new Pessoa();
        crud inser = new crud();
        String setnome = in.nome(null);
        inser.inserir(pessoa);     
    }
}

Classe ConDB

public class ConDB {
    private static ConDB condb;
    
public static ConDB getInstance(){
    if (condb == null){
        condb = new ConDB();
    }
    return condb;
}

public java.sql.Connection getConnection() throws ClassNotFoundException, SQLException{
    Class.forName("com.mysql.jdbc.Driver");
    return DriverManager.getConnection("jdbc:mysql://localhost:3306/teste","root","Ed!r145792");
}
public static void main(String[] args){
    try{
        System.out.println(getInstance().getConnection());
    }catch (ClassNotFoundException | SQLException e){
        e.printStackTrace();
    }
}
}

Erros apresentado ao compilar

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.

at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)

at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)

at java.lang.reflect.Constructor.newInstance(Constructor.java:423)

at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)

at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1117)

at com.mysql.jdbc.MysqlIO.(MysqlIO.java:355)

at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2461)

at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2498)

at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2283)

at com.mysql.jdbc.ConnectionImpl.(ConnectionImpl.java:822)

at com.mysql.jdbc.JDBC4Connection.(JDBC4Connection.java:47)

at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)

at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)

at java.lang.reflect.Constructor.newInstance(Constructor.java:423)

at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)

at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:404)

at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:317)

at java.sql.DriverManager.getConnection(DriverManager.java:664)

at java.sql.DriverManager.getConnection(DriverManager.java:247)

at usandodb.conDB.ConDB.getConnection(ConDB.java:28)

at usandojdbc.dao.crud.inserir(crud.java:25)

at usandodb.UsandoDB.main(UsandoDB.java:31)

Caused by: java.net.ConnectException: Connection refused: connect

at java.net.DualStackPlainSocketImpl.connect0(Native Method)

at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)

at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)

at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)

at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)

at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)

at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)

at java.net.Socket.connect(Socket.java:589)

at java.net.Socket.connect(Socket.java:538)

at java.net.Socket.(Socket.java:434)

at java.net.Socket.(Socket.java:244)

at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:259)

at com.mysql.jdbc.MysqlIO.(MysqlIO.java:305) 17 more
H

olá amigo;

Não é bem um problema.
Mas sim uma dica. Tipo estou querendo executar o programa a partir do método MAIN, porem não tenho ideia de como fazer, pois já procurei algumas formas na internet porém nenhuma deu certo.
a minha primeira tentativa de fazer foi:

public class UsandoDB {

   
    public static void main(String[] args) {
        
        dados in = new dados();
        in.nome(null);
        Pessoa ins = new Pessoa();
        ins.setnome(in); // ERRO: não esta aceitando o IN
        crud inser = new crud();
        inser.inserir(ins);  //ERRO: não aceita o INS    
    }
}

Mas ele não aceita onde onde esta o “//ERRO”. Vi essa forma pesquisando na internet.

Erro apresentado após a compilação

Exception in thread main java.lang.RuntimeException: Uncompilable source code - Erroneous sym type: usandojdbc.dto.Pessoa.setnome

at usandodb.UsandoDB.main(UsandoDB.java:27)

C:\Users\Edir Herison\AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml:53: Java returned: 1

FALHA NA CONSTRUÇÃO (tempo total: 6 segundos)
J

De onde é esse material que está estudando? Tenta esses que são mais didáticos:

https://www.caelum.com.br/apostila-java-web/bancos-de-dados-e-jdbc/
https://www.caelum.com.br/apostila-java-orientacao-objetos/

D

O erro acima ocorre quando

  • O endereço do banco está incorreto
  • A porta na qual o banco está “ouvindo” está errada (windows/linux é 3306, Mac 3307, normalmente)
  • O banco de dados não foi inicializado
H

Prezados;

Consegui inserir no banco, porem o que foi inserido foi o “NULL” e não o que eu digitei, como posso corrigir isso.
Segue abaixo código que usei para a inserção:

public static void main(String[] args) {
       dados in = new dados();
       Pessoa pessoa = new Pessoa();
       crud inser = new crud();
        String setnome = in.nome(null);
         inser.inserir(pessoa);   
        }
D

Cara, teu código está uma bagunça.
Por favor, conscientize-se desde já de algumas convenções do java:

  • Classes devem ter nomes claros e intuitivos, SEMPRE iniciando com letra maiúscula e seguindo a regra do CamelCase para nomes compostos, ex:

    public class Pessoa
    public class Vendedor
    public class Veiculo
    public class ClasseComNomeCompostoECamelCase

  • Atributos e métodos devem ter nome começando com letra minúscula e seguir a regra do camelCase:

    private String nome;
    
    private int idade;
    
    private Date dataDeAniversario;
    

    public void escrever() {}
    public int calcularsoma(int n1, int n2){}

  • Variáveis devem ter um nome claro, intuitivo e segue a mesma regra de nomenclatura de atributos, incluindo o camelCase:

    Integer contador;
    
    Date dataDeAniversario;
    
    Pessoa pessoa;
    

Estas convenções ajudam a legibilidade do teu código e facilitam o entendimento do mesmo, evitando dúvidas e checagens desnecessárias. É óbvio que, vez ou outra, isso vai acontecer, mas, quanto mais puder evitar, melhor.

Além dos padrões de nomes, o teu código está sem pé nem cabeça.
Veja:

Instancia uma pessoa

Instancia o crud, instancia uma String com o valor recebido do nome de in (dados).
Depois manda salvar a pessoa, sem informar nenhum atributo da pessoa?

Cara, segue logo o que o @javaflex sugeriu e vá atrás de um material decente.

H

é porque no seu método MAIN, você não deu nenhum valor para pessoa, por exemplo, hora nenhum teve pessoa.setNome(in.nome); ou algo parecido, você pode fazer o teste usando o que chamamos forca bruta, que é colocar valor manual para a variável para ver se dará certo a inserção, e depois se der certo então você testa com dados externos. Tenta fazer igual exemplo abaixo. Como eu ainda estou nesse fórum com status iniciante, infelizmente é limitado o quanto posso postar, por isso demoro a responder.

public static void main(String[] args) {
       //dados in = new dados();
       Pessoa pessoa = new Pessoa();
       pessoa.setNome("Teste BD");
       crud inser = new crud();
        //String setnome = in.nome(null);
         inser.inserir(pessoa);   
        }
Criado 5 de abril de 2018
Ultima resposta 6 de abr. de 2018
Respostas 10
Participantes 4