Muitos problemas para entender a conexão com banco de dados

9 respostas
C

Galera!!!

Fiz uma aplicação bem simples, que estou armazenando dados em uma array. Mas agora quero guardar em um banco MySql. Daí criei meu banco, chamado cintia e coloquei dentro dele uma tabela chamada pessoa que possui 3 campos: nome, email e idade, e quero armazenar dados através da minha palicação nesse bd. Estou pesquisando na internet, e peguei alguns exemplos mas estou com muita dificuldade para entender. Baixei o drive do Mysql: mysql-connector-java-5.0.6, mas não faço a minima idéia de onde coloco ele, em que pasta, junto com os meus fontes da minha aplicação (estou usando NetBeans)??? Tem que configurar alguma coisa dentro desse conector, pois tem vários arquivos dentro dele??? Por favor se alguém puder me ajudar!!! :grin: :slight_smile: :lol: :wink:

Valeu!!!

9 Respostas

B

Ola,

Em resposta a pergunta de “onde colocar o conector” a resposta é no classpath da aplicação, tem alguns artigos aqui no PJ sobre como fazer isto… faz uma busca lá.

Para questões de organização do seu projeto, geralmente se cria uma pasta na raiz da aplicação/projeto, com o nome “lib” onde se coloca as libs externas, e as coloca nos classpath da aplicação/projeto.

C

Olá Bruno

Eu pesquisei pelo fórum e acehi uma aplicação exemplo com bd bem simples para download… mas continuo sem entender, vou colocar o código principal dessa aplicação que faz a conexão com o bd:

import java.sql.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.ScrollPaneLayout;

public class Clientes extends JFrame {
    private BotoesPainel controls;
    private RotuloClientes scrollArea;
    private JTextArea output;
    private String url;
    private Connection connect;
    private JScrollPane textpane;
    
    public Clientes() {
        super( "Aplicação de Banco de Dados de Agenda de Endereços" );
        
        Container c = getContentPane();
        
        // Inicia o layout da tela
        scrollArea = new RotuloClientes();
        c.setLayout( new BorderLayout() );
        c.add( new JScrollPane( scrollArea ),
                BorderLayout.CENTER );
        
        // Configura a conexão de banco de dados
        try {
            url = "jdbc:odbc:AddressBook";
            Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" );
            connect = DriverManager.getConnection( url );
        } catch ( ClassNotFoundException cnfex ) {
            // processa ClassNotFoundExceptions aqui
            JOptionPane.showMessageDialog(
                    null, "A conexão falhou!\n" + cnfex.toString(), "Aviso",
                    JOptionPane.WARNING_MESSAGE );
        } catch ( SQLException sqlex ) {
            // processa SQLExceptions aqui
            JOptionPane.showMessageDialog(
                    null, "A conexão falhou!\n", "Aviso",
                    JOptionPane.WARNING_MESSAGE );
        } catch ( Exception ex ) {
            // processa Exceptions remanescentes aqui
            JOptionPane.showMessageDialog(
                    null, ex.toString(), "Aviso",
                    JOptionPane.WARNING_MESSAGE );
        }
        
        // Completa layout de tela
        controls =
                new BotoesPainel( connect, scrollArea, output);
        c.add( controls, BorderLayout.NORTH );
        
        setSize( 500, 400 );
        move(150, 150);
        show();
    }
    
    public static void main( String args[] ) {
        Clientes app = new Clientes();
        
        app.addWindowListener(
                new WindowAdapter() {
            public void windowClosing( WindowEvent e ) {
                System.exit( 0 );
            }
        }
        );
    }
}

Nesta parte aqui:

url = jdbc:odbc:AddressBook;

Class.forName( sun.jdbc.odbc.JdbcOdbcDriver );

connect = DriverManager.getConnection( url );

o que seria essa String que esta sendo atribuída a url???
e o Class.forName, o que seria??? E o driver de conexão??? eu crio uma pasta dentro do meu projeto chamado lib e jogo tudo que eu baixei do site do mysql lá dentro??? e a senha e o usuário do bd onde eu passo???

Desculpe tantas perguntas, mas é que eu tô desesperada para fazer uma aplicação que use bd!! e de preferência mysql…

Valeu!!!
:grin:

B

Ola

Bom, por partes :wink:

O exemplo que vc achou era uma exemplo usando ODBC, dae a pergunta… o que é ODBC, o que é de simples resposta, ODBC é quando vc cria um banco ACCESS e configura, no windows, um nome para este banco… bom o que vc já deve ter percebido que não é bom…
Então as linhas:

url = "jdbc:odbc:AddressBook";
Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" );
connect = DriverManager.getConnection( url );

Que vc perguntou o que seria… é simples, o “jdbc:odbc:AddressBook” é a passagem para o nome do banco, no caso o AddressBook é o banco configurado lá na fonte ODBC do windows… que vc pode ver como cadastrar lá em “Iniciar->configurações->ferramentas administrativas->Fontes de dadoas ODBC”.
O Class.forName é a carga do driver… quando fizer um DriverManager.getConnection ele retornará uma instancia do drive carregado… mas vc o vê como uma implementação da interface java.sql.Connection… bom, mas relação a isto não se preocupe, somente conheça a java.sql.Connection :wink:

Em resposta a “E o driver de conexão???”, é o arquivo que vc baixou lá do mysql…
Em resosta a onde e o que fazer com o arquivo… é isto ae, descompacte ele na pasta “lib” que vc criou… o arquivo importante para vc é o **.jar… com o ** é o nome do arquivo da qual não me lembro exatamente como é.
A parada de onde vc passa o nome e senho do usuário de banco… é no metodo getConnection do DriverManager. Um exemplo de como vc usaria para o mysql… (o que vc pode achar em exemplos na web :wink: )

String driver = "org.gjt.mm.mysql.Driver"; // classe que está dentro do jar que vc baixou na mysql.org. String url = "jdbc:mysql://localhost:3306/my_db"; // url de conexão.. segue o formato [fonte = jdbc] : [nome do driver, no caso "mysql", e como vc pode ver no exemplo que vc postou, o outro era "odbc"] :// [host para a conexão, no exemplo o mysql está na mesma máquina que eu estou rodando o programa..] / [nome do banco que vc criou lá no mysql] String user = "admin"; // usuário do banco String passwd = "1234";//senha do usuário de banco. Class.forName(driver); // carrega o driver Connection conn = DriverManager.getConnection(url, user, passwd); // abre a conexão.

Para saber outros metodos que vc pode usar para abrir conexões… como usar estes esquemas do conecido JDBC aconselho que vc consulte a documentação, API, e ache materiáis na net…

Até, e lembrando que para o codigo que postei funcionar o jar do conectro TEM que estar no classpath.

C

Oi

Funcionou!!! Tô conseguindo me conectar ao banco de dados, mas agora apareceu outro problema na inserção. O seguinte: estou tentando fazer uma inserção utilizando o mysql, daí criei uma base, que possui uma tabela chamada “pessoa” e três campos: “nome”, “email” e “idade”. Criei o seguinte código para inserir os dados:

import java.io.IOException;
import javax.swing.JOptionPane;
import java.sql.*;

public class Cadastro {
    
    String n;
    String e;
    String id;
    private Connection connection;
       
    //variavel do tipo pes sendo inicializada com vazio
    Pessoa pes= null;
    Conectar con= null;
    
       /*******************************************************************
     * construtor da classe cadastro, aqui é feito o cadastro de pessoas
     *******************************************************************/
    public Cadastro() throws SQLException{
        
        
        pes = new Pessoa();
        n = JOptionPane.showInputDialog("Entre com o seu nome:");
        
        e = JOptionPane.showInputDialog("Entre com o seu email:");
        
        id = JOptionPane.showInputDialog("Entre com a sua idade:");
        
        
        try {
            con=new Conectar();
            String sql = "";
            sql += " INSERT INTO pessoa";
            sql += " (nome, email, idade)";
            sql += " VALUES";
            sql += " ("+n+",'"+e+"','"+id+"')";
            
            PreparedStatement ps = connection.prepareStatement(sql);
            
            ps.execute(sql);
            
            
            //aqui tá comentado, pois era uma outra forma que eu havia     //tentado e deu o mesmo erro
            /*Statement statement = connection.createStatement();
            
            System.out.println("Statement:" + statement);
            
            
            int result = statement.executeUpdate(sql);
            if ( result == 1 )
                JOptionPane.showMessageDialog(
                        null, "A inseção foi um sucesso.", "Aviso",
                        JOptionPane.PLAIN_MESSAGE );
            else {
                JOptionPane.showMessageDialog(
                        null, "A inserção falhou!.", "Aviso",
                        JOptionPane.WARNING_MESSAGE );
            }*/
            
            System.out.println("Executou!!!!");
        } catch (Exception e) {
            System.out.println("Erro na inserção:" + e);
        }
    }

A seguir a classe de conexão:

import java.sql.*;
import javax.swing.JOptionPane;

public class Conectar {
    
    private static String url;
    private static String driver;
    private static String usuario;
    private static String senha;
    
    public Conectar(){
        // Configura a conexão de banco de dados
        try {
            driver = "org.gjt.mm.mysql.Driver";
            url = "jdbc:mysql://localhost:3306/cintia";
            usuario = "user"; // usuário do banco
            senha = "";//senha do usuário de banco.
            Class.forName(driver); // carrega o driver
            System.out.println("Conectou!!!!!!!");
            
            Connection conn = DriverManager.getConnection(url, usuario, senha);
            
            
        }catch ( SQLException sqlex ) {
            // processa SQLExceptions aqui
            JOptionPane.showMessageDialog(
                    null, "A conexão falhou!\n", "Aviso",
                    JOptionPane.WARNING_MESSAGE );
            
            
        } catch ( ClassNotFoundException cnfex ) {
            // processa ClassNotFoundExceptions aqui
            JOptionPane.showMessageDialog(
                    null, "A conexão falhou!\n" + cnfex.toString(), "Aviso",
                    JOptionPane.WARNING_MESSAGE );
            
            
        } catch ( Exception ex ) {
            // processa Exceptions remanescentes aqui
            JOptionPane.showMessageDialog(
                    null, ex.toString(), "Aviso",
                    JOptionPane.WARNING_MESSAGE );
        }
        
    }
    
    
}

Ele dá a mensagem avisando que conectou ao banco, mas quando vai executar a linha:
PreparedStatement ps = connection.prepareStatement(sql);

Erro que ocorre:
init:
deps-jar:
compile-single:
run-single:
Conectou!!!
Erro na inserção:java.lang.NullPointerException
BUILD SUCCESSFUL (total time: 16 seconds)

Se puder dar um help!!!
Valeu!!!
:grin: :slight_smile:

B

Ola,

Pô, tipo, maneiro, vc está abrindo a conexão… mas vc guarda ela e não dá ela pra ninguem?! 8O vamas fazer assim:

Na classe Conectar->
1->Crie um atributo de classe para guardar a conexão.
2->Crie um metodo get para a conexão, para que vc de fora dela consiga “pegar” a conexão que vc abriu.

Na classe Cadastro->
Tá vendo a linha em que vc faz isto: con=new Conectar(); , legal, até aqui tudo certo… mas aqui:

PreparedStatement ps = connection.prepareStatement(sql); Onde mesmo vc abriu esta conexão???
dae que vc usa aquele metodo que vc crio lá na classe Conectar…

P

o problema é q na linha:

o objeto connection não foi inicializado, repare q vc declara ele no incio da classe

e depois não faz mais nada…o objeto do tipo Connection q vc precisa, esta dentro da sua classe Conectar…

o q vc deve fazer eh colocar a declaração do objeto Connection fora do construtor, assim como vc faz com as String…assim, na hora q vc fizer

vc vai ter o objeto do tipo Connection disponivel pra vc…e aih sim vc chama o método prepareStatement() a partir do objeto do tipo Connection de dentro da sua classe Conectar…

bom eh mais ou menos isso, hehehehe…

espero ter ajudado…

ps: não concordo muito com a forma com q vc esta gerenciando suas conexões com o banco…depois vc vai ter q estudar sobre alguns padrões como Factory, DAO, entre outros…

C

Oi Pessoa!!

Funcionou… eu fiz como vcs mandaram, só que agora o erro é outro, e eu já reisntalei o mysql, criei o banco e a tabela de novo e o erro continua… Já procurei na web alguma coisa sobre esse erro, e a única coisa que eu encontrei sobre esse erro é que a coluna não existe, mas a coluna esta lá…
Se alguém der umas dicas… segue os códigos e erros:

Classe Cadastro

import java.io.IOException;
import javax.swing.JOptionPane;
import java.sql.*;

public class Cadastro {
    
    String n;
    String e;
    String id;
    String query;
          
    //variavel do tipo pes sendo inicializada com vazio
    Pessoa pes= null;
    Conectar con= null;
    
       
    /*******************************************************************
     * construtor da classe cadastro, aqui é feito o cadastro de pessoas
     *******************************************************************/
    public Cadastro() throws SQLException{
        
        
        pes = new Pessoa();
        n = JOptionPane.showInputDialog("Entre com o seu nome:");
        
        e = JOptionPane.showInputDialog("Entre com o seu email:");
        
        id = JOptionPane.showInputDialog("Entre com a sua idade:");
        
                
        try {
            con=new Conectar();
            String sql = "";
            sql += " INSERT INTO pessoa";
            sql += " (nome, email, idade)";
            sql += " VALUES";
            sql += " ("+n+",'"+e+"','"+id+"')";
            
            PreparedStatement ps = con.getConexao().prepareStatement(sql);
            System.out.println("chegou1");
            ps.execute(sql);
            
            System.out.println("Chegou aqui");
            
                        
            System.out.println("Executou!!!!");
        } catch (Exception e) {
            System.out.println("Erro na inserção:" + e);
        }
    }

Classe Conexão

import java.sql.*;
import javax.swing.JOptionPane;

public class Conectar {
    
    private static String url;
    private static String driver;
    private static String usuario;
    private static String senha;
    public static Connection conn;
    
    public Conectar(){
        // Configura a conexão de banco de dados
        try {
            driver = "org.gjt.mm.mysql.Driver";
            url = "jdbc:mysql://localhost:3306/cintia";
            usuario = "root"; // usuário do banco
            senha = "123456";//senha do usuário de banco.
            Class.forName(driver); // carrega o driver
            System.out.println("Conectou!!!!!!!");
            
            conn = DriverManager.getConnection(url, usuario, senha);
            
            
        }catch ( SQLException sqlex ) {
            // processa SQLExceptions aqui
            JOptionPane.showMessageDialog(
                    null, "A conexão falhou!\n", "Aviso",
                    JOptionPane.WARNING_MESSAGE );
            
            
        } catch ( ClassNotFoundException cnfex ) {
            // processa ClassNotFoundExceptions aqui
            JOptionPane.showMessageDialog(
                    null, "A conexão falhou!\n" + cnfex.toString(), "Aviso",
                    JOptionPane.WARNING_MESSAGE );
            
            
        } catch ( Exception ex ) {
            // processa Exceptions remanescentes aqui
            JOptionPane.showMessageDialog(
                    null, ex.toString(), "Aviso",
                    JOptionPane.WARNING_MESSAGE );
        }
        
    }
    
    public Connection getConexao(){
        return conn;
    }
    
    
}

E esse é o erro que ocorre:
init:
deps-jar:
compile-single:
run-single:
Conectou!!!
chegou1
Erro na inserção:com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: Unknown column ‘Cintia’ in 'field list’
BUILD SUCCESSFUL (total time: 21 seconds)

O nome do meu banco é cintia, existe somente uma tabela chamada pessoa, que possui as seguintes colunas: nome (char), email (char), idade (int).
Pode ser alguma coisa com os tipos String dos meus campos e no banco estar como char???

Valeu!!!
:grin:
[/b]

B

Ola,

Bom, dá uma verificada na sua query, mas o nome está sem as aspas e a idade com as aspas… o que te gera um erro.

Procure trabalhar com os recursos que o preparedStatement te fornece para evitar isto… ficaria +/- assim:

String sql = "insert into pessoa (nome, email, idade) values (?,?,?)" PreparedStatement ps = con.getConexao().prepareStatement(sql); ps.setString(1, n); ps.setString(2, e); ps.setInt(3, id); ...

C

Oi Bruno!!!!
Funcionou, estou conseguindo gravar no meu banco!!!!! Valeu!!!!

Mas olha só, daquele jeito que vc mostrou deu esse erro aqui:

Erro na inserção:com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?,?,?)' at line 1

Daí eu dei uma pesquisada no Google, e achei um outro método para utilizar em vez desse:
ps.execute(sql);
então utilizei esse e funcionou:
ps.executeUpdate();
ps.close();
e FUNCIONOU!!!!!!!!!
Meu código ficou assim para inserção:

import java.io.IOException;
import javax.swing.JOptionPane;
import java.sql.*;

public class Cadastro {
    
    String n;
    String e;
    String id;
    String query;
    
      
    //variavel do tipo pes sendo inicializada com vazio
    Pessoa pes= null;
    Conectar con= null;
    
    
    
    /*******************************************************************
     * construtor da classe cadastro, aqui é feito o cadastro de pessoas
     *******************************************************************/
    public Cadastro() throws SQLException{
        
        
        pes = new Pessoa();
        n = JOptionPane.showInputDialog("Entre com o seu nome:");
        
        e = JOptionPane.showInputDialog("Entre com o seu email:");
        
        id = JOptionPane.showInputDialog("Entre com a sua idade:");
        
        
        try {
            con=new Conectar();
                      
            String sql = "insert into pessoa (nome, email, idade) values (?,?,?)";
            PreparedStatement ps = con.getConexao().prepareStatement(sql);
            ps.setString(1, n);
            ps.setString(2, e);
            ps.setInt(3, Integer.parseInt(id));
                        
            ps.executeUpdate();             
            ps.close();   
            
                        
           
        } catch (Exception e) {
            System.out.println("Erro na inserção:" + e);
        }
    }

Valeu Galera!!!!!!!Vcs ajudaram e muito!!!!!
É bom saber que podemos contar com o fórum!!!!!!
:grin: :) :wink:

Criado 6 de julho de 2007
Ultima resposta 17 de jul. de 2007
Respostas 9
Participantes 3