Ajuda para criar insert com PrepareStatment

Bom dia,

Estou precisando de uma ajuda para criar um “insert” com “PreparedStatement”.

Tenho a classe de conexão abaixo e nela adicionei um método PreparedStatement para executar a String sql enviada.

package util;

import java.sql.Connection;
//import java.sql.DriverManager;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.naming.InitialContext;
import javax.sql.DataSource;

public class ConexaoUtil {   
	  
	   private Connection conexao;   
	  
	   public ConexaoUtil() {   
	      conexao = abreConexao();   
	   }   
	  
	   private Connection abreConexao() {   
	      try {   
	         InitialContext ctx = new InitialContext();   
	         DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/bdxxx");   
	         return ds.getConnection();   
	      } catch (Exception e) {   
	         e.printStackTrace();   
	         throw new RuntimeException("Não foi possivel abrir a conexao", e);   
	      }   
	   }   
public PreparedStatement prepareStatement(String sql) throws SQLException {
		    PreparedStatement preparedStatement = conexao.prepareStatement(sql);
		    preparedStatement.executeUpdate();
		    return preparedStatement;
		}

public void fechaConexao() {   
	      try {   
	         conexao.close();   
	      } catch (Exception e) {   
	         e.printStackTrace();   
	      }   
	   }
	}  

Na outra classe que deveria chamar o método preparaStatment que criei com os dados, não estou conseguindo executar.

package servletsBiblioteca;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;

import dto.BibliotecaDto;
import util.ConexaoUtil;



public class Biblioteca {
	
	public void insert(BibliotecaDto biblioteca) {

			
		ConexaoUtil c = new ConexaoUtil();
		
		try{

			PreparedStatement st = c.prepareStatement("insert into leyes " +
									"(data," +
									"jerarquia," +
									"nbr_ley," +
									"fecha_ley," +
									"pais," +
					    			"ambito," +
					    			"idioma," +
					    			"vigencia," +
					    			"texto_descriptivo," +
					    			"texto_complementario," +
					    			"notas," +
									"dt_cadastro," +
									"nm_cadastro)values " +
									"(?,?,?,?,?,?,?,?,?,?,?,?,?)");
			
			
	
			st.setDate(1, c.toSqlDate(biblioteca.getDt_cadastro()));
			st.setString(2,biblioteca.getJerarquia());
			st.setInt(3,biblioteca.getNbr_ley());
			st.setDate(4,c.toSqlDate(biblioteca.getFecha_ley()));
			st.setInt(5,biblioteca.getId_pais());
			st.setString(6,biblioteca.getAmbito());
			st.setString(7,biblioteca.getIdioma());
			st.setString(8,biblioteca.getVigencia());
			st.setString(9,biblioteca.getTexto_descriptivo());
			st.setString(10,biblioteca.getTexto_complementario());
			st.setString(11,biblioteca.getNotas());
			st.setDate(12,c.toSqlDate(biblioteca.getDt_cadastro()));
			st.setInt(13,biblioteca.getNm_cadastro());
			
			
		} catch (Throwable e) {
			e.printStackTrace();

		} finally {
			c.fechaConexao();
		}
		
	}
}

Quando eu chamo o método “c.prepareStatement” sempre pede para eu alterar para int.

Acredito que não está certo, o que estou fazendo de errado?

Alguém poderia me dar uma ajuda para corrigir meus erros?

Marcos

  1. Isso é não dúvida web.
  2. Quando dá erro, poste o erro também.

deixe um espaço em branco entre o parentese e o values:

Bom dia Valério,

Sei que não é um erro Web, mas como estou iniciando o desenvolvimento para web, achei melhor postar aqui. Mas fique tranquilo, não precisa me ajudar se não quiser.

O meu problema é que não estou conseguindo fazer funcionar, ou seja criar os métodos corretamente.

Pedi para alguém dar uma olhada no código e verificar se estou no caminho certo, e me ajudar a corrigir.

Marcos

Ah você não chegou a executar ? Ou executou e deu erro ? Se deu erro, poste o erro.

esse metodo ta errado

public PreparedStatement prepareStatement(String sql) throws SQLException {  
            PreparedStatement preparedStatement = conexao.prepareStatement(sql);  
            preparedStatement.executeUpdate();  // o executeUpdate(); deve ser executado apos vc settar as propridades
            return preparedStatement;  
        }  

vc chama o executeUpdate() sem ter setado os paramentros antes

seria uma boa ideia vc revisar o design das suas classes

[quote]Bom dia Valério,

Sei que não é um erro Web, mas como estou iniciando o desenvolvimento para web, achei melhor postar aqui. Mas fique tranquilo, não precisa me ajudar se não quiser.

O meu problema é que não estou conseguindo fazer funcionar, ou seja criar os métodos corretamente.

Pedi para alguém dar uma olhada no código e verificar se estou no caminho certo, e me ajudar a corrigir.

Marcos[/quote]

Alem de ter dificuldade em coisas extremamente simples com milhares de materias na net e ainda postar as coisas no lugar errado aqui no forum ainda quer fica brabinho por ser corrigido atidude de filhinho da mamae…

Obrigado Danilo,

Corrigi o problema.

Quanto ao postar errado, desculpe me aos ofendidos por este meu erro. Tenho idade e educação suficiente para admimitir e corrigir meus erros, afinal até hoje que eu saiba após meus 43 anos de vida ninguém nasceu com todos os conhecimentos e obrigações.

Encerra-se a discussão sem ressentimentos.

Obrigado a todos.

public class ConexaoUtil {     
        
       private Connection conexao;     
        
       public ConexaoUtil() {     
          conexao = abreConexao();     
       }     
        
       private Connection abreConexao() {     
          try {     
             InitialContext ctx = new InitialContext();     
             DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/bdxxx");     
             return ds.getConnection();     
          } catch (Exception e) {     
             e.printStackTrace();     
             throw new RuntimeException("Não foi possivel abrir a conexao", e);     
          }     
       }     
public PreparedStatement prepareStatement(String sql) throws SQLException {  
            PreparedStatement preparedStatement = conexao.prepareStatement(sql);  
            preparedStatement.executeUpdate();  
            return preparedStatement;  
        }  
  
public void fechaConexao() {     
          try {     
             conexao.close();     
          } catch (Exception e) {     
             e.printStackTrace();     
          }     
       }  
    }    

voce esta inventando a roda nessa classe o unico metodo que vc precisa realmente implementar nessa classe é o getConection(); onde vc encapsula a complexidade da criação da conexão e vai retorna a Connection para sua classe biblioteca os outros metodos não tem a menos necessidade

public class ConexaoUtil {     
        
      
        
       public ConexaoUtil() {     
               
       }     
        
       public Connection getConnection() {     
          try {     
             InitialContext ctx = new InitialContext();     
             DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/bdxxx");     
             return ds.getConnection();     
          } catch (Exception e) {     
             e.printStackTrace();     
             throw new RuntimeException("Não foi possivel abrir a conexao", e);     
          }     
       }     
  
}    

Marcos não fiquei ofendido não, até por que acho que você falou com educação. Só quis chamar atenção, principalmente no segundo ponto.

Eita agora que me liguei, não reparei na primeira classe, apenas na segunda :stuck_out_tongue:

Sem problemas Valério…

Se puder me ajudar com a primeira e segunda classe, sou muito agradecido, pois ainda estou com problemas.

Como você faria essas classes, pode me dar um exemplo?

Obrigado

[quote=Marcos_rhs]Sem problemas Valério…

Se puder me ajudar com a primeira e segunda classe, sou muito agradecido, pois ainda estou com problemas.

Como você faria essas classes, pode me dar um exemplo?

Obrigado[/quote]

a primeira ja dei um exemplo

a segunda

public class Biblioteca {  
      
    public void insert(BibliotecaDto biblioteca) {  
  
              
        Connection connection = new ConexaoUtil().getConnection();  
          
        try{  
  
            PreparedStatement st = connection.prepareStatement("insert into leyes " +  
                                    "(data," +  
                                    "jerarquia," +  
                                    "nbr_ley," +  
                                    "fecha_ley," +  
                                    "pais," +  
                                    "ambito," +  
                                    "idioma," +  
                                    "vigencia," +  
                                    "texto_descriptivo," +  
                                    "texto_complementario," +  
                                    "notas," +  
                                    "dt_cadastro," +  
                                    "nm_cadastro)values " +  
                                    "(?,?,?,?,?,?,?,?,?,?,?,?,?)");  
              
              
      
            st.setDate(1, c.toSqlDate(biblioteca.getDt_cadastro()));  
            st.setString(2,biblioteca.getJerarquia());  
            st.setInt(3,biblioteca.getNbr_ley());  
            st.setDate(4,c.toSqlDate(biblioteca.getFecha_ley()));  
            st.setInt(5,biblioteca.getId_pais());  
            st.setString(6,biblioteca.getAmbito());  
            st.setString(7,biblioteca.getIdioma());  
            st.setString(8,biblioteca.getVigencia());  
            st.setString(9,biblioteca.getTexto_descriptivo());  
            st.setString(10,biblioteca.getTexto_complementario());  
            st.setString(11,biblioteca.getNotas());  
            st.setDate(12,c.toSqlDate(biblioteca.getDt_cadastro()));  
            st.setInt(13,biblioteca.getNm_cadastro());  
              
           st.excuteUpdate();
           st.close();
              
        } catch (Throwable e) {  
            e.printStackTrace();  
  
        } finally {  
            connection.close();  
        }  
          
    }  
}  

Danilo,

Obrigado mais uma vez.

Acredito que este método sumiria, pois este método é feito para cada tabela, ou seja quando para cada classe.

Ok Valério, entendi…

Obrigado

Sobre o padrão acho que você teria que procurar o padrão DAO. Ou então mudar para Hibernate que é muito mais produtivo.

Padrao DAO:

package model:

Onde vai ficar suas classe para representar as tabelas no banco, apenas com atributos e get e set, exemplo:

public class Biblioteca {
  private int id;
  private int nome;

  // get e set
}

package dao:

Onde ficaria as classes que iria fazer a ligação entre sua classe java com o banco de dados.

package view:

Onde ficaria suas telas

Mas aí você procura direito por que eu não lembro muito de DAO, pois utilizo hoje em dia Hibernate.