RESOLVIDO: conectar mysql via método main

Estou tentando conectar ao mysql enviando parâmetros via método main.
Tenho que usar essa mesma aplicação em vários locais (bancos/usuários diferentes) e essa foi a única forma razoável que encontrei (baseado no meu pouco conhecimento em java).

Esses dias um colega aqui do fórum me ajudou num problema parecido.

Tenho três classes:

FormaPgto.java

package br.com.formaspagamento;

import java.awt.*;
import java.awt.event.*;
import java.text.NumberFormat;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.util.List;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

public class FormaPgto extends javax.swing.JFrame {

    public String servidor;  
    public String nome_banco;  
    public String nome_usuario;  
    public String senha_banco;  
    
    FormaPgto variaveis;
    
    DefaultTableModel tmFormaPgtos = new DefaultTableModel(null, new String[]{"Código","Tipo","Descrição"});
    ListSelectionModel lsmFormaPgtos;
    List<FormaPgtoBean> formaPgtos;
    
    public FormaPgto() {
        initComponents();
    }

    // inicio do código gerado pelo netbeans                          
    private void initComponents() {
	//...código, código, código, ...
        //deixei a chamada desse método, pode ajudar na resolução do problema
	//listar formas de pagamento ao iniciar janela
        listarFormaPgtos();
	//...código, código, código, ...
    }// fim do código gerado pelo netbeans                        

    public static void main(String args[]) {
        FormaPgto variaveis = new FormaPgto();

        variaveis.servidor = "localhost";
        variaveis.nome_banco = "database";
        variaveis.nome_usuario = "root";
        variaveis.senha_banco = "";
        
        //vou receber os parâmetros assim:
        //variaveis.servidor = args[0];
        //variaveis.nome_banco = args[1];
        //variaveis.nome_usuario = args[2];
        //variaveis.senha_banco = args[3];
        
    }
        
    
}

FormaPgtoControl.java

package br.com.formaspagamento;
import br.com.acessobd.AcessoMySql;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

public class FormaPgtoControl {
    
    PreparedStatement pstm;
    ResultSet rs;
    String consultaFormaPgto = "SELECT * FROM formas_pagamento WHERE descricao LIKE ? ORDER BY ID ASC";
    String cadastraFormaPgto = "INSERT INTO formas_pagamento (TIPO, DESCONTO, DESCRICAO, " +
    "TX_ADMINISTRACAO, ENTRADA, PERC_MIN_ENTRADA, NUM_PARCELAS, INTERVALO_PARC, " +
    "DIAS_PRIM_VENC, TX_JURO) VALUES (?,?,?,?,?,?,?,?,?,?)";
    String alteraFormaPgto = "UPDATE formas_pagamento SET TIPO = ?, DESCONTO = ?, " + 
            "DESCRICAO = ?, TX_ADMINISTRACAO = ?, ENTRADA = ?, PERC_MIN_ENTRADA = ?, " +
            "NUM_PARCELAS = ?, INTERVALO_PARC = ?, DIAS_PRIM_VENC = ?, TX_JURO = ? " +
            "WHERE ID = ?";
    String excluiFormaPgto = "DELETE FROM formas_pagamento WHERE ID = ?";

    //ESSAS VARIAVEIS EU QUERO RECEBER DO MÉTODO MAIN!!!!!!!!!!!!!    
    private String servidor = "localhost";  
    private String nomeBanco = "database";  
    private String usuario = "root";  
    private String senha = "";  

    public FormaPgtoControl(){
    }
    
    AcessoMySql bd = new AcessoMySql();   
    
    public void cadastrarFormaPgto(FormaPgtoBean forma_pgto){
        try {
            pstm = bd.conectar(servidor,nomeBanco,usuario,senha).prepareStatement(cadastraFormaPgto);
            pstm.setString(1, forma_pgto.getTipo());
            pstm.setInt(2, forma_pgto.getDesconto());
            pstm.setString(3, forma_pgto.getDescricao());
            pstm.setDouble(4, forma_pgto.getTx_administracao());
            pstm.setInt(5, forma_pgto.getEntrada());
            pstm.setDouble(6, forma_pgto.getPerc_min_entrada());
            pstm.setInt(7, forma_pgto.getNum_parcelas());
            pstm.setInt(8, forma_pgto.getIntervalo_parc());
            pstm.setInt(9, forma_pgto.getDias_prim_venc());
            pstm.setDouble(10, forma_pgto.getTx_juro());
            pstm.executeUpdate();
            bd.desconectar();
        }catch(Exception e){
            e.printStackTrace();
        }
    }
    
    public List<FormaPgtoBean> listarFormaPgtos(String descricao){
        List<FormaPgtoBean> formas_pgto = new ArrayList();
        try {
            pstm = bd.conectar(servidor,nomeBanco,usuario,senha).prepareStatement(consultaFormaPgto);
            pstm.setString(1, descricao);
            rs = pstm.executeQuery();
            FormaPgtoBean fp;
            while (rs.next()){
                fp = new FormaPgtoBean();
                fp.setId(rs.getInt("id"));
                fp.setTipo(rs.getString("tipo"));
                fp.setDesconto(rs.getInt("desconto"));
                fp.setDescricao(rs.getString("descricao"));
                fp.setTx_administracao(rs.getDouble("tx_administracao"));
                fp.setEntrada(rs.getInt("entrada"));
                fp.setPerc_min_entrada(rs.getDouble("perc_min_entrada"));
                fp.setNum_parcelas(rs.getInt("num_parcelas"));
                fp.setIntervalo_parc(rs.getInt("intervalo_parc"));
                fp.setDias_prim_venc(rs.getInt("dias_prim_venc"));
                fp.setTx_juro(rs.getDouble("tx_juro"));
                formas_pgto.add(fp);
            }
            bd.desconectar();
        } 
        catch (Exception e){
            e.printStackTrace();
        }
        return formas_pgto;
    }

    public void alterarFormaPgto(FormaPgtoBean forma_pgto){
        try {
            pstm = bd.conectar(servidor,nomeBanco,usuario,senha).prepareStatement(alteraFormaPgto);
            pstm.setString(1, forma_pgto.getTipo());
            pstm.setInt(2, forma_pgto.getDesconto());
            pstm.setString(3, forma_pgto.getDescricao());
            pstm.setDouble(4, forma_pgto.getTx_administracao());
            pstm.setInt(5, forma_pgto.getEntrada());
            pstm.setDouble(6, forma_pgto.getPerc_min_entrada());
            pstm.setInt(7, forma_pgto.getNum_parcelas());
            pstm.setInt(8, forma_pgto.getIntervalo_parc());
            pstm.setInt(9, forma_pgto.getDias_prim_venc());
            pstm.setDouble(10, forma_pgto.getTx_juro());
            pstm.setInt(11, forma_pgto.getId());
            pstm.executeUpdate();
            bd.desconectar();
        } catch (Exception e){
            e.printStackTrace();
        }
            
    }
    
    public void excluirFormaPgto(int codigoFormaPgto){
        try {
            pstm = bd.conectar(servidor,nomeBanco,usuario,senha).prepareStatement(excluiFormaPgto);
            pstm.setInt(1, codigoFormaPgto);
            pstm.executeUpdate();
            bd.desconectar();
        }catch(Exception e){
            e.printStackTrace();
        }
    }
    
}

AcessoMySql.java

package br.com.acessobd;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class AcessoMySql {
    Connection con;
    public AcessoMySql(){
    }
    public Connection conectar(String host, String database, String user, String pass){
        try {
        Class.forName("com.mysql.jdbc.Driver");
        con = DriverManager.getConnection("jdbc:mysql://"+host+"/"+database+"?user="+user+"&password="+pass+"");
        } catch (ClassNotFoundException ex){
            ex.printStackTrace();
            System.out.println("Não foi possível encontrar o Driver");
        } catch (SQLException ex){
            ex.printStackTrace();
            System.out.println("Não foi possível conectar ao banco!");
        }
        return con;
    }
    
    public void desconectar(){
        try {
            con.close();
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
    }

}

Quero executar dessa forma:
java -jar FormaPgto.jar localhost database root

Deve ter um monte de gambiarra ai, mas estou iniciando, qualquer ajuda é bem vinda!

então, nao entendi bem sua duvida…mas se vc quer so msm passar os parametros na chamada do FormaPagtoControl precisa adicionar um construtor que receba estes parametros e os sete em variaveis globais desta classe…se não for isso explica melhor ae por favor pra ver se consigo te ajudar…

Pois bem, vamos ao problema…

Método main() se não me engano, pra exercer sua função de principal e ser chamado na hora da execução, precisa ter um Array de Strings como Parametros… ao que tudo indica, da forma que vc quer passar, teria que ser assim mesmo

public static void main(String args[]) {  
         FormaPgto variaveis = new FormaPgto();  
           
         //vou receber os parâmetros assim:  
         variaveis.servidor = args[0];  
         variaveis.nome_banco = args[1];  
         variaveis.nome_usuario = args[2];  
         variaveis.senha_banco = args[3];  
           
}  

Tente aí… se aparecer algum erro, poste aqui…

Obrigado pelas respostas!

devel.andrerocha
Vou usar esse arquivo FormaPgto.jar em vários locais/clientes, que possuem diferentes servidores e usuários de banco de dados.
Pensei em não fazer uma compilação especifica para cada um, então me veio essa idéia de executar a aplicação já passando os parâmetros de conexão com o banco de dados:
java -jar FormaPgto.jar localhost database root

Não sei se essa é a melhor maneira de fazer isso.

Já tentei criar um segundo construtor na classe FormaPgtoControl.java, com parâmetros:

    public FormaPgtoControl(String host, String database, String user, String pass){
    }  

minha dúvida é a seguinte: pegar os parâmetros recebidos pelo main (já consigo fazer isso)

public static void main(String args[]) {    
         FormaPgto variaveis = new FormaPgto();    
         variaveis.servidor = args[0];    
         variaveis.nome_banco = args[1];    
         variaveis.nome_usuario = args[2];    
         variaveis.senha_banco = args[3];    
} 

e fazer esses parâmetros chegaram na classe FormaPgtoControl.java (NÃO consigo fazer isso), antes de estabelescer a conexão com o banco de dados, de fato.

Ola adriano_si, obrigado por responder.

Eu já consigo capturar os parâmetros enviados no momento que executo o jar, exatamente como vc descreveu:

[code]public static void main(String args[]) {
FormaPgto variaveis = new FormaPgto();

     //vou receber os parâmetros assim:    
     variaveis.servidor = args[0];    
     variaveis.nome_banco = args[1];    
     variaveis.nome_usuario = args[2];    
     variaveis.senha_banco = args[3];    

}[/code]
porém, o meu problema é fazer esse parâmetros chegarem na classe FormaPgtoControl, antes de iniciar a conexão propriamente dita.

O caminho parece ser o que o devel.andrerocha sugeriu, um construtor no FormaPgtoControl com esses parâmetros.
O fato é que não estou conseguindo fazer essas variáveis chegarem onde desejo e estabelescer a conexão.

hum… o Main() é só a ponte então ??? tendi… faz o que o amigo em cima disse então…

Falows :wink:

Na classe FormaPgtoControl.java, crie um método como por exemplo setVariaveis(String, String, String, String) e chame esse método a partir do main. Algo como:

public class FormaPgtoControl {
.....
public void setVariaveis(String server, String bd, String user, String pass) {
    servidor = server;
    nomeBanco = bd;
    usuario = user;
    senha = pass;
}
.....
}

E realizar uma chamada desse método assim:

public class FormaPgto extends javax.swing.JFrame {

    FormaPgtoControl controle;
    /*public String servidor;  
    public String nome_banco;  
    public String nome_usuario;  
    public String senha_banco;  */
    // não são mais necessárias, pois a alteração é feita direto no controle
......
    public FormaPgto(String server, String bd, String user, String pass) {
        initComponents();
        controle.setVariaveis(server, bd, user, pass);
    }
......
}

E no método main:

public static void main(String[] args) {
    new FormaPgto(args[0], args[1], args[2], args[3]);
}

Se o seu problema são os diferentes parametros de acordo com cada cliente, acho que seria viável um arquivo de configurações em xml.

[quote=FernandoMelo]Se o seu problema são os diferentes parametros de acordo com cada cliente, acho que seria viável um arquivo de configurações em xml.
[/quote]

Ou mesmo um arquivo properties, que é hiper simples…

Olá FernandoMelo e renatocustodio, obrigado por responder.

Algum de vocês tem um exemplo de como fazer esse arquivo de configuração xml ou o arquivo properties?
pode ser em inglês, qualquer tutorial ou texto que me ajude fazer isso.

Já iniciei uma pesquisa no google sobre esse assunto, também vou tentar dessa maneira, pois parece ser (bem) mais eficiente e resolve o problema que tenho no momento.

Sou iniciante em Java, então desculpem as perguntas meio noob.

Bom dia marcobiscaro2112, obrigado pela ajuda.

Ontem a noite fiquei tentando resolver esse problema, baseado na solução que me passou.

Implantei o método setVariaveis e as demais orietações, porém tive um NullPointerException:

Exception in thread "main" java.lang.NullPointerException
        at br.com.formaspagamento.FormaPgto.<init>(FormaPgto.java:44)
        at br.com.formaspagamento.FormaPgto.main(FormaPgto.java:998)

LINHA 44

controle.setVariaveis(server, db, user, pass);

LINHA 998 (criei essas variaveis somente para compilar e testar com minha conexão local)

FormaPgto variaveis = new FormaPgto("localhost","sistema","userdb","senha123");

Pelo que puder ver aqui no fórum, um NullPointerException ocorre quando você tenta chamar um método de uma variavel de referencia que está setada como nula.

coloque um JOptionpane antes do

controle.setVariaveis(server, db, user, pass);

e consegui ver todas as variaveis, não entendo o porque o programa parou nesse ponto.

Se todas as variáveis estão setadas corretamente, talvez o problemas não sejam as variáveis. Lembre-se que o objeto “controle”, foi um exemplo. Certifique-se que instanciou corretamente esse objeto antes de chamar o método setVariaveis (talvez o que seja null, é a variável controle).

Agora vc me confundiu!!! hehehe entendi mas não compreendi o que você escreveu.

O null não está nas variáveis, e sim no controle. Realmente o objeto controle não foi instanciado.

então, pra resolver isso, tenho que instanciar ele? ficaria assim:

...
initComponents();  
FormaPgtoControl controle = new FormaPgtoControl();
controle.setVariaveis(server, bd, user, pass);
...

Tenho uma dúvida: o fato de instanciar o método controle não irá requerer uma conexão - antes de eu setar as variáveis no FormaPgtoControl?

Não tenho essa aplicação aqui no trabalho, está em casa, só vou poder testá-la a noite.

Desculpe por essas perguntas bobas, mas estou tentando realmente entender como funciona isso. Sou iniciante em Java e Orientação a Objetos pra mim está sendo uma das maiores dificuldades de aprender na prática.

Acompanhe a sequência de execução do programa:

método main chama o construtor de FormaPgto, passando os argumentos da linha de comando.

public static void main(String[] args) {
    new FormaPgto(args[0], args[1], args[2], args[3]);
}

O construtor de FormaPgto deve criar uma nova instância da classe FormaPagtoControl e chamar seu método setVariaveis:

public class FormaPgto extends javax.swing.JFrame {

    FormaPgtoControl controle;
    // outras variáveis

    public FormaPgto(String server, String bd, String user, String pass) {
        initComponents();
        controle = new FormaPgtoControl();
        controle.setVariaveis(server, bd, user, pass);
    }

    // o resto da classe
}

O método setVariaveis armazena as variáveis corretamente:

public class FormaPgtoControl {
// construtores, variáveis, etc.
public void setVariaveis(String server, String bd, String user, String pass) {
    servidor = server;
    nomeBanco = bd;
    usuario = user;
    senha = pass;
}
// outros métodos
}

Por fim, quando sua classe precisar de uma consulta, basta chamar:

controle.cadastrarFormaPgto(algumObjeto);
// ou:
obj = controle.listarFormaPgtos(string);

E assim por diante…

Meus dois centavos:

http://guj.com.br/java.tutorial.artigo.115.1.guj

marcobiscaro2112, obrigado mesmo pela ajuda, consegui resolver da maneira que você orientou.

Agradeço também pela aula sobre Orientação a Objetos.

peczenyj, já tinha dado uma olhada nesse artigo, mas tinha resolvido “adiar” ele.
Vou tentar na próxima semana fazer um exercício baseado nele.
Obrigado pela dica!