Modo de inserir dados sem usar if

15 respostas
rafa120

Opaa!
Gostaria que alguém pudesse me ajudar a dizer como eu faço um outro jeito para inserir dados no mysql
Pq o que eu tenho aqui funciona legal, mas ai se eu NAO preenho um campo que é do tipo inteiro ai da aquele errinho la
Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: ""
Caso eu coloco um valor, ai ele aceita e beleza
Eu sei que se dizer um IF resolve o negócio, mas fica meio gambiarra na minha opnião, pq se nao tiver nada ali ai aparece um 0.

Ai não tem um jeito que possa fazer um insert e que grave tanto string quanto numéricos sem ter que criar IF?
Ja pelejei com isso e nao sai nada, se tiver um jeito mais prático eu agradeço.
Segue um trecho do me código pra vcs verem como eu utilizo.

Abraços!

try
            {

                String RazaoSocial = txtRazaoSocial.getText();
                String NomeFantasia = txtNomeFantasia.getText();
                String Cnpj = txtCnpj.getText();
                String Ie = txtIE.getText();
                String Im = txtIM.getText();
                String Logradouro = txtLogradouro.getText();
                int Numero = Integer.parseInt(txtNumero.getText());

                String sqlinsert = "INSERT INTO cad_fornecedores" + 
                        "(razao_social,nome_fantasia,cnpj,ie,im,logradouro,numero)" +
                        "VALUES ("+"'"+RazaoSocial+"','"+NomeFantasia+"','"+Cnpj+"','"+Ie+"','"+Im+"','"+Logradouro+"',"+Numero+""+");";
                conexao_formulario.statement.executeUpdate(sqlinsert);
                JOptionPane.showMessageDialog(null, "Dados gravados com sucesso!");
            }
            catch (SQLException erro)
            {
                JOptionPane.showMessageDialog(null, "Erro ao tentar gravar o registro.");
            }

15 Respostas

brunobuild

Cara eu to um pouco sem tempo para colocar um exemplo.
Da uma olhada como funciona o PreparedStatement, é melhor do que ficar concatenando as variáveis, só setar os valores nele de acordo com o tipo do banco de dados e já era.
:smiley:

dudu_sps

Bom… voce poderia usar try… catch

e no catch voce não põe nenhuma resposta como erro
e seria bom voce estudar alguma forma de facilitar a sua vida, tirando esse sql dessa forma

como o amigo disse PreparedStatement, ou procure sobre padrão DAO

e uma forma de usar um if seria voce colocando que ao campo perder o foco if(campo.getText().equals("")) { campo.setText(“0”); }

cleiton_herrmann

vc pode usar operador condicional ternário (ifzinho kkk)

ao invés de ter isso

int numero; if (jTextField1.getText().equals("")) { numero = 0; } else { numero = Integer.parseInt(jTextField1.getText()); }
usar assim:

int numero = jTextField1.getText().equals("") ? 0 : Integer.parseInt(jTextField1.getText());

nao deixa se ser um if, mas pelo menos ocupa só uma linha

ViniGodoy

É mais claro usar o método isEmpty, ao invés de equals com vazio:

int numero = jTextField1.getText().isEmpty() ? 0 : Integer.parseInt(jTextField1.getText());
M

Sugiro que faça ambas as coisas (é realmente importante).

xjunior

marcobiscaro2112:
dudu_sps:

como o amigo disse PreparedStatement, ou procure sobre padrão DAO

Sugiro que faça ambas as coisas (é realmente importante).

Concordo com vcs, mas se puder procure uma framework para mapeamento de objeto relacional tipo hibernate, ok…

M

xjunior:
marcobiscaro2112:
dudu_sps:

como o amigo disse PreparedStatement, ou procure sobre padrão DAO

Sugiro que faça ambas as coisas (é realmente importante).

Concordo com vcs, mas se puder procure uma framework para mapeamento de objeto relacional tipo hibernate, ok…


Melhor ainda. O DAO com PreparedStatement seria o mínimo aceitável, digamos assim, mas um framework como o Hibernate seria melhor ainda.

rafa120

Tive revendo aqui e lendo um pouco, o melhor a usar realmente é o preparedstatement, eu ja tinha ouvido falar, mas achei que fosse coisa bem avançada, pois sou iniciante ainda.

Mas resolvi tentar implementar e só apareceu alguns erros.

Segue em código a classe de fornecedores

try
        {
            conn = new ConexaoBancos();
            conn.conecta("org.gjt.mm.mysql.Driver", "jdbc:mysql://localhost/db_obras", "root", "", "db_obras");

            // Cria um preparedStatement
            PreparedStatement stmt = conn.prepareStatement ("INSERT INTO cad_fornecedores (razao_social,cnpj) VALUES (?,?)");

            // Preenche os valores
            stmt.setString(1, txtRazaoSocial.getName());
            stmt.setString(2, txtCnpj.getName());

            //Executa
            stmt.executeUpdate();
            stmt.close();

            System.out.println("Gravado");
            conn.close();
        }
        catch (SQLException erro)
        {
            JOptionPane.showMessageDialog(null, "Erro ao tentar gravar o registro.");
        }

O erro que aponta é:

conn.prepareStatement
Criar método prepareStatement(java.lang.String) em ConexaoBanco.ConexaoBancos

.close()
Criar método close() em ConexaoBanco.ConexaoBancos

ps: PreparedStatement stmt = conn.prepareStatement
é assim mesmo?
Prepared = prepare ?

M

Sim é prepareStatement(String sql) (sem o ‘d’). Na verdade você não apontou o erro, e sim onde ele ocorre. Verifique exatamente qual o erro e coloque aqui. E certifique-se que importou o PreparedStatement do pacote java.sql.

peczenyj

Uma coisa interessante do seu Código é que ele é orientado à Strings.

Vc quer inserir um novo Fornecedor, certo? Que tal um objeto… Fornecedor?

Nesse caso vc não precisa se preocupar com tantos ifs explicitos, bastaria um objeto Fornecedor (que possui Razão Social e CNPJ), um objeto FornecedorDAO (que abstrai a persistencia no Banco de Dados, por exemplo) e alguma classe que controla esta interação de receber os dados dos seus txtCnpj (e ai pode validar se tem todos os dados, etc), criar um Fornecedor e salva-o no Banco através do DAO.

Veja a apostila do curso FJ-21 da Caelum, ficará mais claro.

rafa120

Bom, não está dando certo!

Ta osso, ta dando muito trabalho para uma coisa nao muito relevante. É um método muito ruim este que eu estava tentando.

Já comecei a implementar o preparedStatement.
Mas na hora de tentar criar o ConnectionFactory não da certo.

Pq será?

Eu já tenho o Mysql na biblioteca.

peczenyj

Sem ver o erro é dificil ajudar.

xjunior

Bom amigo, fiz um exemplo básico de testes, pois a melhor maneira de vc entender é ver um exemplo funcionando, lembre-se que fiz correndo e não cerquei erros ou coisas assim, só o básico mesmo, em Java SE, cria o pacote chamado teste2 e testa pra vc ver ele funcionando:

  1. Um factory para conexões com singleton, olha aí: Nome do arquivo::ConnectionFactory.java
package teste2;

import com.mysql.jdbc.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

/**
 *
 * @author xjunior
 */
public class ConnectionFactory {
    private static Connection instance=null;
    private static int banck=0;
    final static int B_MYSQL = 0;
    private ConnectionFactory() throws SQLException{
        try {
                switch(ConnectionFactory.banck){
                    case B_MYSQL:
                        Class.forName("com.mysql.jdbc.Driver");
                        ConnectionFactory.instance=(Connection) DriverManager.getConnection("jdbc:mysql://localhost/teste","root","");
                    break;
                }
            }
            catch (ClassNotFoundException e){
                throw new SQLException(e.getMessage());
            }

    }
    public static Connection getConnection(int TypeBanck) throws SQLException{
        if(ConnectionFactory.instance==null || ConnectionFactory.banck!=TypeBanck){
            ConnectionFactory.banck=TypeBanck;
            new ConnectionFactory();
        }
        return ConnectionFactory.instance;
    }
}

Um beans chamado Testes (pq a tabela chama testes)::Nome do arquivo::Testes.java

package teste2;

/**
 *
 * @author xjunior
 */
public class Testes {
    private int _codigo;
    private String _nome;

    /**
     * @return the _codigo
     */
    public int getCodigo() {
        return _codigo;
    }

    /**
     * @param codigo the _codigo to set
     */
    public Testes setCodigo(int codigo) {
        this._codigo = codigo;
        return this;
    }

    /**
     * @return the _nome
     */
    public String getNome() {
        return _nome;
    }

    /**
     * @param nome the _nome to set
     */
    public Testes setNome(String nome) {
        this._nome = nome;
        return this;
    }
}

Um DAO da Tabela Testes::Nome do arquivo::TestesDAO:

package teste2;

import com.mysql.jdbc.Connection;
import com.mysql.jdbc.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;

/**
 *
 * @author xjunior
 */
public class TestesDAO {
    private Connection connection;
    public TestesDAO() throws SQLException{
        this.connection = ConnectionFactory.getConnection(ConnectionFactory.B_MYSQL);
    }
    /**
     *
     * @param testes testes
     * @return TestesDAO
     * @throws SQLException
     */
    public TestesDAO addTestes(Testes testes) throws SQLException{
        String sql = "insert into testes (nome) values (?)";
        PreparedStatement stm = (PreparedStatement) this.connection.prepareStatement(sql);
        try{
            stm.setString(1, testes.getNome());
            stm.execute();
            JOptionPane.showMessageDialog(null, "Gravado Com suscesso!!!");
        }catch(SQLException e){
            this.connection.close();
            throw new SQLException(e);
        }
        finally{
            stm.close();
        }
        return this;
    }

    public List<Testes> searchTestes() throws SQLException{
        String sql = "select * from testes";                
        List<Testes> teste = new ArrayList<Testes>();
        PreparedStatement stm = (PreparedStatement) this.connection.prepareStatement(sql);
        ResultSet result = stm.executeQuery();
        while(result.next()){
            Testes test = new Testes();
            test.setCodigo(Integer.parseInt(result.getString("codigo"))).setNome(result.getString("nome"));
            teste.add(test);
        }
        return teste;
    }
    public List<Testes> searchTestes(String nome) throws SQLException{
        List<Testes> teste = new ArrayList<Testes>();
        try{
            String sql = "select * from testes where nome like ?";
            PreparedStatement stm = (PreparedStatement) this.connection.prepareStatement(sql);
            stm.setString(1,nome);
            ResultSet result = stm.executeQuery();
            while(result.next()){
                Testes test = new Testes();
                test.setCodigo(Integer.parseInt(result.getString("codigo"))).setNome(result.getString("nome"));
                teste.add(test);
            }
            stm.close();
        }catch(SQLException e){
            JOptionPane.showMessageDialog(null, e);
        }
        finally{
            return teste;
        }

    }
    public List<Testes> searchTestes(int codigo) throws SQLException{
        List<Testes> teste = new ArrayList<Testes>();
        try{
            String sql = "select * from testes where codigo = ?";
            PreparedStatement stm = (PreparedStatement) this.connection.prepareStatement(sql);
            stm.setInt(1,codigo);
            ResultSet result = stm.executeQuery();
            while(result.next()){
                Testes test = new Testes();
                test.setCodigo(Integer.parseInt(result.getString("codigo"))).setNome(result.getString("nome"));
                teste.add(test);
            }
            stm.close();
        }catch(SQLException e){
            JOptionPane.showMessageDialog(null, e);
        }
        finally{
            return teste;
        }

    }
    public void updateTestes(Testes testes) throws SQLException{
        try{
            String sql="UPDATE testes SET nome = ? WHERE codigo = ?";
            PreparedStatement stm = (PreparedStatement) this.connection.prepareStatement(sql);
            stm.setString(1, testes.getNome());
            stm.setInt(2, testes.getCodigo());
            stm.execute();
            stm.close();
            JOptionPane.showMessageDialog(null,"Atualizado Com Sucesso!!!");
        }catch(SQLException e){
            JOptionPane.showMessageDialog(null,"Ocorreu um erro ao atualizar!!!");
        }
    }
    public void removeTestes(Testes testes) throws SQLException{
        try{
            String sql="DELETE FROM testes WHERE codigo = ?";
            PreparedStatement stm = (PreparedStatement) this.connection.prepareStatement(sql);            
            stm.setInt(1, testes.getCodigo());
            stm.execute();
            stm.close();
            JOptionPane.showMessageDialog(null,"Posição "+testes.getCodigo()+" removida com Sucesso!!!");
        }catch(SQLException e){
            JOptionPane.showMessageDialog(null,"Ocorreu um erro ao remover posição!!!");
        }
    }
}

E o main::Nome do arquivo::Main.java

package teste2;
import java.sql.SQLException;
import java.util.List;
import javax.swing.JOptionPane;

/**
 *
 * @author xjunior
 */
public class Main {
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws SQLException, ClassNotFoundException {
        TestesDAO connect = new TestesDAO();
        int condition=1;
        while(condition==1){
            String str = "Escolha \n 1->Inserir\n 2->Visualizar Todos\n 3->Pesquisar por Nome(inserir % para estar entre)\n 4->Pesquisar por Código\n 5->Atualizar Testes por Código\n 6->Remover Testes por Código\n ";            switch(Integer.parseInt(JOptionPane.showInputDialog(str))){
                case 1:
                    do{
                        Main.insertElement(connect);
                    }while(JOptionPane.showConfirmDialog(null, "Deseja Inserir Outro Nome?")==0);
                break;
                case 2:
                    Main.searchElement(connect);
                break;
                case 3:
                    Main.searchNome(connect);
                break;
                case 4:
                    Main.searchCodigo(connect);
                break;
                case 5:
                    Main.updateTestes(connect);
                break;
                case 6:
                    Main.removeTestes(connect);
                break;
                default:
                    JOptionPane.showMessageDialog(null, "Você inseriu uma opção incorreta!!!");
                break;
            }
            condition = JOptionPane.showConfirmDialog(null, "Deseja Finalizar o aplicativo?");
        }
        
        
    }
    public static void insertElement(TestesDAO connect) throws SQLException{
        try{            
            Testes testes = new Testes();
            testes.setNome(JOptionPane.showInputDialog("Insira o nome do testes:"));
            connect.addTestes(testes);            
        }catch(SQLException e){
            JOptionPane.showMessageDialog(null, e);            
        }
    }
    public static void searchElement(TestesDAO connect) throws SQLException{        
        List<Testes> teste = connect.searchTestes();
        Main.listTestes(teste);
    }
    public static void searchNome(TestesDAO connect) throws SQLException{        
        List<Testes> teste = connect.searchTestes(JOptionPane.showInputDialog("insira uma parte do nome a ser buscado:"));
        Main.listTestes(teste);
    }
    public static void searchCodigo(TestesDAO connect) throws SQLException{        
        List<Testes> teste = connect.searchTestes(Integer.parseInt(JOptionPane.showInputDialog("insira o código do Testes:")));
        Main.listTestes(teste);
    }
    public static void listTestes(List<Testes> teste){
        String str = "";
        for(Testes test : teste){
            str+="Código: "+test.getCodigo()+" | Nome: "+test.getNome()+"\n";
        }
        JOptionPane.showMessageDialog(null, str);
    }
    public static void updateTestes(TestesDAO connect) throws SQLException{
        try{
            Testes testes = new Testes();
            testes.setCodigo(Integer.parseInt(JOptionPane.showInputDialog("Insira a posição que deseja atualizar:")));
            testes.setNome(JOptionPane.showInputDialog("Insira o nome para atualização:"));
            connect.updateTestes(testes);
        }catch(SQLException e){
            JOptionPane.showMessageDialog(null, e);
        }
    }
    public static void removeTestes(TestesDAO connect) throws SQLException{
        try{
            Testes testes = new Testes();
            testes.setCodigo(Integer.parseInt(JOptionPane.showInputDialog("Insira a posição que deseja remover:")));
            connect.removeTestes(testes);
        }catch(SQLException e){
            JOptionPane.showMessageDialog(null, e);
        }
    }
}

E a tabela do banco de dados pra vc testar:

--
-- Estrutura da tabela `testes`
--

CREATE TABLE IF NOT EXISTS `testes` (
  `codigo` int(11) NOT NULL auto_increment,
  `nome` varchar(50) NOT NULL,
  PRIMARY KEY  (`codigo`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 ;

Espero ter ajudado…

xjunior

Rafa, implementou e testou?
deu certo, vai ajudar vc na sua implementação?
flw

rafa120

xjunior, obrigado pela ajuda.

Eu nao vi seu topico antes, ai ja implementei e criei tudo novamente. Mas olhando aqui esta seguindo este modelo mesmo tipo o seu.

Usei o preparedstatement, to usando o metodo DAO. Inclsuive tambem agradecer aos que falaram para utilizar estes metodos e a apostila indicada do caelum fj21 que ajudou bastante.

Vivendo e aprendendo!

Pode encerrar este topico se quiser, ja avancei bastante no meu projeto utilizando este metodo, mas pintou outras duvidas agora e entao prefiro perguntar pra nao voltar mais tarde e refazer tudo. Dai depois eu abro um topico relacionado ao assunto, valeu!

Criado 6 de janeiro de 2010
Ultima resposta 13 de jan. de 2010
Respostas 15
Participantes 8