Método de conexão ao BD

Olá pessoal, estou tentando criar um método de conexão mais fácil para não ter que ficar toda hora abrindo a classe do banco em geral… mais não estou conseguindo imaginar como.

Código:

    try {
        Class.forName("com.mysql.jdbc.Driver");
        Connection con = DriverManager.getConnection("jdbc:mysql://127.0.0.1/Test","root","");
        String SQL = "INSERT INTO test.Teste(Razao) VALUES(?)"; 
        PreparedStatement stmt = con.prepareStatement(SQL);
        stmt.setString(1, jTRazaoSocial.getText());
        stmt.executeUpdate();
        stmt.close();
        con.close();
        jTRazaoSocial.setText("");

        
    } catch (ClassNotFoundException ex) {
        System.out.println(ex);
    } catch (SQLException ex) {
        System.out.println(ex);
    }

Eu estava tentando fazer +/- assim:

    public Connection getConnection(){
        Connection con=null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            con=DriverManager.getConnection("jdbc:mysql://127.0.0.1/Test","root","");
        } catch (ClassNotFoundException ex) {
            System.out.println("ERROR NA CLASSE: "+ex);
        } catch (SQLException ex) {
            System.out.println("ERROR NO SQL: "+ex);
        }
        return null;   
    }

Mais empaquei na parte onde fica a criação do “stmt”:

PreparedStatement stmt = con.prepareStatement(SQL);

No caso a conexão foi criada no método, mais o stmt é criado no projeto e tem que ser igualado ao con.
Eu não estou conseguindo pegar bem a lógica correta disso, alguem pode ajudar?

Procure por um padão chamado Factory. Resolve seu problema e eh bem legal aprender. :wink:

Seu PreparedStatement vai ter q ter em toda classe que for fazer alguma interacao com o banco de dados mesmo, disso nao vai ter como fugir (com essa arquitetura)
Deixa seu método de conexão em alguma classe separada (classe Conexao por exemplo) e nas suas classes vc chama o seu getConnection. É claro que precisa ser singleton, senao vai abrir uma conexao pra cada statement

Ai vc faz igual vc deu mesmo o exemplo

PreparedStatement stmt = con.prepareStatement(SQL);  

Eu implementei assim:

    public Connection getConnection(){
        try {
            Class.forName("com.mysql.jdbc.Driver");
            return DriverManager.getConnection("jdbc:mysql://127.0.0.1/Test","root","");
        } catch (ClassNotFoundException ex) {
            System.out.println("ERROR NA CLASSE: "+ex);
        } catch (SQLException ex) {
            System.out.println("ERROR NO SQL: "+ex);
        }
        return null;
    }
    try {
        Modulo md = new Modulo();
        Connection con = md.getConnection();
        String SQL = "INSERT INTO test.Teste(Razao) VALUES(?)"; 
        PreparedStatement stmt = con.prepareStatement(SQL);
        stmt.setString(1, jTRazaoSocial.getText());
        stmt.executeUpdate();
        stmt.close();
        con.close();
        jTRazaoSocial.setText("");
        
    } catch (SQLException ex) {
        System.out.println(ex);
    }

Está correto, ou fugi do padrão?

Veja este capítulo da apostila da Caelum. Se não conhece ainda, recomendo, são muito boas.

http://www.caelum.com.br/apostila-java-web/bancos-de-dados-e-jdbc/#2-6-exercicios-connectionfactory.

Eu recebi um exemplo de um amigo que funcionou no dele, e nem ele não acheu o motivo de n funcionar comigo.

Código da Classe do Banco:

package SGP;
import java.sql.*;
import javax.swing.*;

/**
 *
 * @author wolney
 */
public class BDConnection
{
    final private String driver = "com.mysql.jdbc.Driver"; // Driver do banco de dados que sera utilizado
    final private String URL = "jdbc:mysql://127.0.0.1/Test"; // URL que localiza bando de dados
    final private String Usuario = "root"; //usuario de acesso ao banco de dados
    final private String Senha = "";//senha de acesso ao bando de dados
    private Connection conexao;
    public Statement statement;
    public ResultSet resultset;
    
    public boolean conectar()// Metodo de conexao com banco de dado
    {
       boolean result = true;
       
       try
       {
           Class.forName(driver);
           conexao = DriverManager.getConnection(URL, Usuario, Senha);
                   JOptionPane.showMessageDialog(null, "Conectado");
       }
       catch(ClassNotFoundException Driver)
               {
                   JOptionPane.showMessageDialog(null, "Driver nao localizado" + Driver);
                        result = false;
               }
       catch(SQLException Fonte)
       {
                   JOptionPane.showMessageDialog(null, "Deu erro na conexão" + 
                           "  Com a Fonte de Dados" + Fonte);
                      result = false;
       }
        return result;
    }
    
    public void desconecta() //Metodo que desconecta banco de dados apos ter gravado os dados
    {
        boolean result = true;
        try
        {
            conexao.close();
            JOptionPane.showMessageDialog(null,"Banco Fechado");
        }
        catch(SQLException erroSQL)
                {
                    JOptionPane.showMessageDialog(null,"Não foi possivel" + 
                            "Facha o banco de dados" +erroSQL.getMessage()  );
                }
    }
    
    public void executeSQL(String sql)  //Metodo que execulta a Query do SQL 
    {
        
        try
        {
            statement = conexao.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
            resultset = statement.executeQuery(sql);
        }
        catch(SQLException sqlex)
        {
            JOptionPane.showMessageDialog(null,"erro ao execultar o comando sql " + sqlex.getMessage() + "Verificar comando sql " + sql );
        }
    }   
}

Código do botão de teste do cadastro:

    try {
            String sqlinsert = ("INSERT INTO test.Teste(Razao) VALUES("+jTRazaoSocial.getText()+")");
            bdc.statement.executeUpdate(sqlinsert);
    } catch (SQLException ex) {
        System.out.println("Erro de SQL: "+ex);
    }

Código do Erro:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at SGP.JIF_CadCliente.jBCadClienteActionPerformed(JIF_CadCliente.java:137)
	at SGP.JIF_CadCliente.access$000(JIF_CadCliente.java:21)
	at SGP.JIF_CadCliente$1.actionPerformed(JIF_CadCliente.java:62)
	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
	at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
	at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
	at java.awt.Component.processMouseEvent(Component.java:6505)
	at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
	at java.awt.Component.processEvent(Component.java:6270)
	at java.awt.Container.processEvent(Container.java:2229)
	at java.awt.Component.dispatchEventImpl(Component.java:4861)
	at java.awt.Container.dispatchEventImpl(Container.java:2287)
	at java.awt.Component.dispatchEvent(Component.java:4687)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
	at java.awt.Container.dispatchEventImpl(Container.java:2273)
	at java.awt.Window.dispatchEventImpl(Window.java:2719)
	at java.awt.Component.dispatchEvent(Component.java:4687)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:735)
	at java.awt.EventQueue.access$200(EventQueue.java:103)
	at java.awt.EventQueue$3.run(EventQueue.java:694)
	at java.awt.EventQueue$3.run(EventQueue.java:692)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
	at java.awt.EventQueue$4.run(EventQueue.java:708)
	at java.awt.EventQueue$4.run(EventQueue.java:706)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:705)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
BUILD SUCCESSFUL (total time: 5 seconds)

Bom, este botão… criei só para testar uma adição ao meu banco… a tabela tmb só possui o campo Razao. Só para testar.
Mais não deu certo… ele usa este código normalmente.

Obrigado