Como assim eu deveria utilizar o PrepareStatement e em qual das classe.
Como funciona a Orientação a Objetos para fazer manipulação de dados?
Vamos dividir, Classes, Interfaces, Janelas.
As classes são divididas em:
Dados (onde contém os atributos de uma entidade)
Manipulação das tabelas (onde contém sql para manipulação de Inserir, Alterar, Excluir, Pesquisar etc)
Interface
Onde contém os métodos de uma determinada classe (Inserir, Alterar, Excluir, Pesquisar etc.)
Não confunda aqui só é o escopo do método, não é a codificação do método.
Janelas
São os frames de preenchimento de dados.
Ou seja, pelo que percebi você está no caminho, mas segue a dica, sempre padronize, para não haver dor de cabeça
caso o sistema crescer, enquanto é pequeno sem padrão é facil, mas depois, hunf…
Classes:
Classe de Conexao (exemplo: clsConexao)
Classe da Entidade (exemplo: clsClientes)
Classe de SQL (exemplo: clsSQLClientes)
Interface
Interface para classe de conexao (exemplo: interfaceConexao)
Interface para classe de SQL (exemplo: interfaceClientes)
A interface de conexão vao ter as funçoes de Conectar e Desconectar o banco de dados onde voce implementa na classe de Conexao
A interface de SQL você implementa na classe de clsSQLClientes onde vai ter a função de Inserir, Alterar, Excluir, Pesquisar etc…
Vida da POO…
CLASSE -> Conecta Banco -> usuario Abre Janela -> usuario Preenche os campos -> janela Passa dados pra Classe -> Janela recebe função cadastrar -> Classe executa função inserir -> usuario Fecha aplicação -> Classe desconecta Banco.
Na classe de cadastro, sobre o PrepareStatement segue o link abaixo.
Do jeito que vc ta fazendo tambem da certo, mas só falta voce usar o PrepareStatement
Achei uma apostila boa e simples facil de entender http://www.ricardoterra.com.br/files/resources/PALESTRA%20-%20Trabalhando%20com%20BD.pdf
Exemplo:
[code]public interface interfaceClientes(){
public void Inserir() ;
public void Alterar(int ID) ;
public void Excluir(int ID) ;
}[/code]
[code]public class clsClientes(){
public static integer ID;
public static String Nome;
public static String Endereco;
public integer getID(){
return this.ID;
}
public String getNome(){
return this.nome;
}
public String getEndereco(){
return this.Endereco;
}
public void setID(integer ID){
return this.ID = ID;
}
public void setNome(String nome){
return this.Nome = nome;
}
public void setEndereco(String endereco){
return this.Endereco = endereco;
}
}[/code]
[code]
public class clsSQLClientes implements interfaceClientes(){
//chama sua classe para fazer conexao com o banco
clsConexao banco = new clsConexao();
banco.conectar;
public clsSQLClientes(){ } //metodo construtor
public void Inserir(){
//cria objeto
clsClientes cliente = new clsClientes();
String sql = "INSERT INTO Clientes(ID,Nome,Endereco) VALUES(?,?,?)";
try {
PreparedStatement stmt = connection.prepareStatement(sql);
stmt.setString(1, cliente.getID());
stmt.setString(2, cliente.getNome());
stmt.setString(3, cliente.getEndereco());
stmt.execute(); //executa comando
stmt.close();
} catch (SQLException u) {
throw new RuntimeException(u);
}
}
public void Alterar(int ID){
//bloco de codigo para realizar a alteração
}
public void Excluir(int ID){
//bloco de codigo para realizar a exclusão
}
}[/code]
Fiz um tuto no meu blog
http://www.brunorota.com.br/blog/tutorial-criar-crud-em-java-com-jdbc-parte-1/
e
http://www.brunorota.com.br/blog/tutorial-criar-crud-em-java-com-jdbc-parte-1-final/
Falows
Muito obrigado pela contribuição de todos. Observando o exemplo acima citado por “charleston10” desenvolvi o código abaixo:
package clsprincipal;
import java.sql.*;
public class clsConexao {
private Connection conecta;
public clsConexao(){
try{
//classe responsável pela conexão
Class.forName("com.mysql.jdbc.driver");
//criar a conexão
conecta = DriverManager.getConnection("jdbc:mysql://localhost/teste","root","1234");
}
catch(Exception e){
System.out.println("Erro na conexão");
}
}
}
package clsprincipal;
public class clsClientes {
public static int id;
public static String nome;
public void setid(int id){
this.id=id;
}
public int getid(){
return this.id;
}
public void setnome(String nome){
this.nome=nome;
}
public String getnome(){
return this.nome;
}
}
package clsprincipal;
public interface interfaceClientes() {
public void Inserir() ;
}
package clsprincipal;
import com.mysql.jdbc.PreparedStatement;
import java.sql.SQLException;
public class clsSQLClientes implements interfaceClientes(){
//chama sua classe para fazer conexao com o banco
clsConexao banco = new clsConexao();
//metodo construtor
public clsSQLClientes(){ }
public void Inserir(){
//cria objeto
clsClientes cliente = new clsClientes();
String sql = "INSERT INTO cadastro(id,nome) VALUES(?,?)";
try {
PreparedStatement stmt = connection.prepareStatement(sql);
stmt.setString(1, cliente.getid());
stmt.setString(2, cliente.getnome());
stmt.execute(); //executa comando
stmt.close();
} catch (SQLException u) {
throw new RuntimeException(u);
}
}
}
package clsprincipal;
public class Clsprincipal {
public static void main(String[] args) {
clsClientes cliente = new clsClientes();
cliente.setid(2);
cliente.setnome("Ana");
}
A pergunta que tenho é a seguinte o que devo inserir na classe Clsprincipal para que seja possível inserir os dados (2,“Ana”) no meu Banco de Dados. Pelo que vi preciso inserir algum comando que chame a classe clsSQLClientes. Estou certo disso se sim qual comando seria este? Obrigado
Falta uma coisa…
[code]public class ConectandoBanco {
public static void main(String[] args) {
cadastro c = new cadastro(); //essa classe so pega os dados, nada mais.
String sql = "INSERT INTO cadastro(id,nome) VALUES (?,?)"; //esse comando ja tem em outra classe, pq repetir ??
c.setid(1); //certo
c.setnome("Fábio"); //certo
}
} [/code]
[code]
public class ConectandoBanco {
public static void main(String[] args) {
cadastro c = new cadastro(); //objeto que so vai pegar os dados
c.setid(1); //pegando os dados
c.setnome("Fábio"); //pegando os dados´
//agora cria o outro objeto pra fazer o cadastro
clsSQLClientes tabela = new clsSQLClientes();
tabela.Inserir();
}
} [/code]
Fiz as modificações solicitadas por vc, porém, agora ta gerando um erro:
Segue abaixo as classes:
package clsprincipal;
public class Clsprincipal {
public static void main(String[] args) {
clsClientes cliente = new clsClientes();
cliente.setid(2);
cliente.setnome("Ana");
clsSQLClientes tabela = new clsSQLClientes();
tabela.Inserir();
}
package clsprincipal;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.PreparedStatement;
import java.sql.SQLException;
public class clsSQLClientes implements interfaceClientes(){
//chama sua classe para fazer conexao com o banco
clsConexao banco = new clsConexao();
//metodo construtor
public clsSQLClientes(){ }
public void Inserir(){
//cria objeto
clsClientes cliente = new clsClientes();
String sql = "INSERT INTO cadastro(id,nome) VALUES(?,?)";
try {
PreparedStatement stmt = Connection.prepareStatement(sql);
stmt.setString(1, cliente.getid());
stmt.setString(2, cliente.getnome());
stmt.execute(); //executa comando
stmt.close();
} catch (SQLException u) {
throw new RuntimeException(u);
}
}
}
Voce fez um importação incorreta.
substitui essa
import com.mysql.jdbc.PreparedStatement;
por essa
import java.sql.PreparedStatement
Nossa parece brincadeira fiz a modificação, mas ainda continua com erro. Estou te enviando todas as classes para que possa olhar. O problema ainda persiste como descrito abaixo:
Códigos
package clsprincipal;
import java.sql.*;
public class clsConexao {
private Connection conecta;
public clsConexao(){
try{
//classe responsável pela conexão
Class.forName("com.mysql.jdbc.driver");
//criar a conexão
conecta = DriverManager.getConnection("jdbc:mysql://localhost/teste","root","1234");
System.out.println("Conexão OK");
}
catch(Exception e){
System.out.println("Erro na conexão");
}
}
}
package clsprincipal;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class clsSQLClientes implements interfaceClientes() {
//chama sua classe para fazer conexao com o banco
clsConexao banco = new clsConexao();
//metodo construtor
public clsSQLClientes(){
}
@Override
public void Inserir() {
//cria objeto
clsClientes cliente = new clsClientes();
String sql = "insert into cadastro(id,nome)VALUES(?,?)";
try {
PreparedStatement stmt = connection.prepareStatement(sql);
stmt.setInt(1, cliente.getid());
stmt.setString(2, cliente.getnome());
stmt.execute(); //executa comando
stmt.close();
} catch (SQLException u) {
throw new RuntimeException(u);
}
}
}
Baseando o código da minha classe “clsSQLClientes.java” com o código abaixo que tinha vc já tinha postado
import factory.ConnectionFactory;
import modelo.Usuario;
import java.sql.*;
import java.sql.PreparedStatement;
public class UsuarioDAO {
private Connection connection;
public UsuarioDAO(){
this.connection = new ConnectionFactory().getConnection();
}
public void adiciona(Usuario usuario){
String sql = "INSERT INTO usuario(nome,cpf,email,telefone) VALUES(?,?,?,?)";
try {
PreparedStatement stmt = connection.prepareStatement(sql);
stmt.setString(1, usuario.getNome());
stmt.setString(2, usuario.getCpf());
stmt.setString(3, usuario.getEmail());
stmt.setString(4, usuario.getTelefone());
stmt.execute();
stmt.close();
} catch (SQLException u) {
throw new RuntimeException(u);
}
}
}
Vejo que na minha classe não possui nada no construtor e não criei o atributo private Connection connection;
Graças e Graças agora sim tudo certo segue abaixo um exemplo de manipulação de dados com o MySQL com as classes. Considere que o Banco de Dados chama “teste” e possui uma tabela chamada cadastro com os campos(id, nome).
Classe principal
package clsprincipal;
public class Clsprincipal {
public static void main(String[] args) {
clsClientes cliente = new clsClientes();
cliente.setid(3);
cliente.setnome("Paula");
clsSQLClientes tabela = new clsSQLClientes();
tabela.Inserir();
}
}
Classe de Conexão
package clsprincipal;
import java.sql.*;
public class clsConexao {
public Connection getConnection() {
try {
return DriverManager.getConnection("jdbc:mysql://localhost/teste", "root", "1234");
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
classe cliente
package clsprincipal;
public class clsClientes {
public static int id;
public static String nome;
public void setid(int id){
this.id=id;
}
public int getid(){
return this.id;
}
public void setnome(String nome){
this.nome=nome;
}
public String getnome(){
return this.nome;
}
}
Interface
package clsprincipal;
public interface interfaceClientes{
public void Inserir();
}
Classe utilizada para inserir os dados
package clsprincipal;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class clsSQLClientes implements interfaceClientes() {
//chama sua classe para fazer conexao com o banco
Connection con = new clsConexao().getConnection();
//metodo construtor
public clsSQLClientes(){
}
public void Inserir() {
//cria objeto
clsClientes cliente = new clsClientes();
String sql = "insert into cadastro(id,nome)VALUES(?,?)";
try {
PreparedStatement stmt = con.prepareStatement(sql);
stmt.setInt(1, cliente.getid());
stmt.setString(2, cliente.getnome());
stmt.execute(); //executa comando
stmt.close();
} catch (SQLException u) {
throw new RuntimeException(u);
}
}
}
Problema resolvido com os códigos postados acima. Obrigado a todas as contribuições. Uma dica que deixo de apostila:http://www.caelum.com.br/apostila-java-web/bancos-de-dados-e-jdbc/#2-9-inserindo-dados-no-banco
;]
Pessoal, estou com um problema no PreparedStatement, segue o código e explico o problema
@Override
public void salvar(Contato cont) {
Connection conn = this.getCon()//metodo que pega a conexão;
PreparedStatement insereSt = null;
String sql ="INSERT INTO Contato(Nome, Tel, Email, Dt_Cad, Obs) VALUES (?,?,?,?,?)";
try{
insereSt = (PreparedStatement) conn.prepareStatement(sql)//erro nessa linha quando roda;
insereSt.setString(1, cont.getNome());
insereSt.setString(2, cont.getTel());
insereSt.setString(3, cont.getEmail());
insereSt.setDate(4, cont.getData_cad());
insereSt.setString(5, cont.getObs());
insereSt.executeUpdate();
}catch(SQLException e)
{System.out.println("erro ao incluir"+e.getMessage());}
finally
{
try{
insereSt.close();
}catch(Throwable t)
{System.out.println("erro ao fechar st"+t.getMessage());}
}
}
Estou vendo vários códigos de PreparedStatement, e em todos eles nessa linha:
insereSt = (PreparedStatement) conn.prepareStatement(sql);
não tem esse CAST e se eu tiro esse CAST, o java manda refazer e reclama
e quando eu debugo o erro da exatamente nessa linha, ele nem entra nos setString.
alguem sabe o que pode ser?
Como estão os import?
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import javax.swing.JOptionPane;
import cursojava.fit.banco.conexao.*;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.PreparedStatement;
import com.mysql.jdbc.Statement;
Edgard, qual é o erro? Se falar qual fica mais fácil. Pelo que vi aí só falta o ; onde você comentou.
esse ponto e virgula ai fico no comentário porque eu comentei quando coloquei o código aqui no fórum, no meu código esse comentário não existe, então o ponto e virgula ta certinho.
O primeiro problema é que nos códigos que vejo, nenhum tem esse CAST antes do conn.prepareStatement(sql); na linha 9
que tanto o netbeans quanto o eclipse tão mandando eu por.
se eu debugo, o primeiro erro (No operations allowed after connection closed.) da exatamente nessa linha 9
depois da outro erro (stnull) ao fechar o insereSt, linha 25
o que me parece é que esse CAST ta deixando o insereSt nulo
aparece isso nos Problems
Description Resource Path Location Type
Type mismatch: cannot convert from java.sql.PreparedStatement to com.mysql.jdbc.PreparedStatement ContatoCrudJDBC.java /CursoJDBC/src/cursojava/fit/banco/crudjdbc line 28 Java Problem
verifiquei os imports das duas classes e bate o
com.mysql.jdbc.
segue o código das duas classes:
import java.sql.DriverManager;
import java.sql.SQLException;
import com.mysql.jdbc.Connection;
public class ConectaMySQL {
public Connection Conecta()
{
Connection conn=null;
try{
String url="jdbc:mysql://localhost/agenda_contato";
String usu= "root";
String senha="sa";
conn=(Connection) DriverManager.getConnection(url,usu,senha);
System.out.println("conectou");
}catch(SQLException e)
{System.out.println("erro de sql"+e.getMessage());}
// finally
// {
// try
// {
// conn.close();
// }catch(SQLException e )
// {System.out.println("erro fechar conexao"+e.getMessage());}
// }
return conn;
}
}
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import javax.swing.JOptionPane;
import cursojava.fit.banco.conexao.*;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.PreparedStatement;
public class ContatoCrudJDBC implements Icontato
{
@Override
public void salvar(Contato cont)
{
Connection conn = this.getCon();
PreparedStatement insereSt = null;
String sql ="insert into contato(nome, telefone, email, dt_cad, obs) values(?,?,?,?,?)";
try{
insereSt = conn.prepareStatement(sql);
insereSt.setString(1, cont.getNome());
insereSt.setString(2, cont.getTel());
insereSt.setString(3, cont.getEmail());
insereSt.setDate(4, cont.getData_cad());
insereSt.setString(5, cont.getObs());
insereSt.executeUpdate();
}catch(SQLException e)
{JOptionPane.showMessageDialog(null, "erro ao incluir"+e.getMessage());}
finally
{
try{
insereSt.close();
}catch(Throwable t)
{JOptionPane.showMessageDialog(null, "erro ao fechar st"+t.getMessage());}
}
}
@Override
public void atualizar(Contato cont) {
// TODO Auto-generated method stub
}
@Override
public void excluir(Contato cont) {
// TODO Auto-generated method stub
}
@Override
public Contato buscarcontato(int val) {
// TODO Auto-generated method stub
return null;
}
public ArrayList<Contato> listar()
{
Connection conn = this.getCon();
ArrayList<Contato> list = new ArrayList<Contato>();
Statement consulta = null;
ResultSet result = null;
Contato contato = null;
String sql = "select * from agenda_contato";
try{
consulta= (Statement) conn.createStatement();
result= (ResultSet)consulta.executeQuery(sql);
while(result.next())
{
contato = new Contato();
contato.setCod(new Integer(result.getInt("codigo")));
contato.setNome(result.getString("nome"));
contato.setTel(result.getString("Telefone"));
contato.setEmail(result.getString("email"));
contato.setData_cad(result.getDate("data"));
contato.setObs(result.getString("obs"));
list.add(contato);
}
}catch(SQLException e){JOptionPane.showMessageDialog(null, "erro no contato"+e.getMessage());}
finally
{
try{
consulta.close();
result.close();
conn.close();
}catch(Exception e){JOptionPane.showMessageDialog(null, "erro ao fechar"+e.getMessage());}
}
return list;
}
public Connection getCon()
{
ConectaMySQL con = new ConectaMySQL();
return con.Conecta();
}
}
no meu código, a linha 28, que o erro indica é essa:
insereSt.setString(1, cont.getNome());
alguem sabe o que pode ser?
pessoal, no ContatoCrudJDBC eu mudei esse import:
import com.mysql.jdbc.PreparedStatement;
para esse import
import java.sql.PreparedStatement;
o erro sumiu, agora eu só preciso achar um pc com mysql instalado pra testar, esse que eu to num tem
qualquer coisa aviso aqui
[quote=Edgard.Pavanelli]pessoal, no ContatoCrudJDBC eu mudei esse import:
import com.mysql.jdbc.PreparedStatement;
para esse import
import java.sql.PreparedStatement;
o erro sumiu, agora eu só preciso achar um pc com mysql instalado pra testar, esse que eu to num tem
qualquer coisa aviso aqui[/quote]
Pessoal, era esse mesmo o problema, agora ta funcionando certinho!