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. 
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?
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