Statement X PreparedStatement

5 respostas
alexandremanowar

E ae galera blz

Estou testando conexão com banco de dados e estou usando Statement por exemplo dessa forma:

/*
 * DAO_usuario.java
 *
 * Created on 22 de Maio de 2007, 21:44
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package DAO;

import java.io.*;
import java.net.*;
import java.util.*;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.ResultSet;

import conexao.Conexao;

/**
 *
 * @author alexandre
 */
public class DAO_usuario 
{
    
    public String usuario;
    public String senha;
    public String consulta;
    public String logado;
    
    private ResultSet rs = null;
    private Connection conn;
    private Statement sql = null;
  
    
    public DAO_usuario() 
    {
        
    }
    
      
    public void DAO_dados(String getUsuario, String getSenha) throws SQLException, IOException
    {
      
            conn = Conexao.connect(); 
            sql = conn.createStatement();   
            
            
            usuario = getUsuario; 
            senha = getSenha;
       
            consulta = "select * from senhadeals where senha='"+senha+"' and usuario='"+usuario+"' limit 1  ";
            
            
            rs = sql.executeQuery(consulta);
            
            while(rs.next())
            {
                logado = rs.getString("nome");
            }
        
        
        
       
    }
    
    public String setLogado()
    {
        return logado;
    }
    
    
}

Mas ouvi falar do PreparedStatement e andei analisando e parece que ele é melhor. Estou certo? Se for melhor alguém poderia medar um exemplo de como usar ele ou me indicar um tutorial aqui na net de como usar?
Valeu

Outro problema que estou tendo é o seguinte, nesse meu exemplo eu coloquei a conexão dentro do método public void DAO_dados(String getUsuario, String getSenha) throws SQLException, IOException desse jeito ela serve apenas para esse método. Se eu tiver outro método na class tenho que repetir o código, onde e como eu declaro a conexão de forma que sirva para todos os métodos que eu tiver na minha class?
Eu tentei algo assim:

...
public Connection getConnection()
{
 conn = Conexao.connect(); 
 sql = conn.createStatement();   
}
public void DAO_dados(String getUsuario, String getSenha) throws SQLException, IOException
    {
            usuario = getUsuario; 
            senha = getSenha;
       
            consulta = "select * from senhadeals where senha='"+senha+"' and usuario='"+usuario+"' limit 1  ";
             
            rs = sql.executeQuery(consulta);
            
            while(rs.next())
            {
                logado = rs.getString("nome");
            }
        
      
    }

Mas deu pau não funcionou. Alguém poderia dar um exemplo de como declarar a conexão para ela ficar padrão para qualquer método que eu criar na classe?

5 Respostas

alberto_ribeiro

Bom dia, o preparedstatement é melhor que o statement porque ele permite que você faça uma query mais flexivel…

segue este link aqui do guj para você ver como é bem flexível:

http://www.guj.com.br/java.article.get.print.chain?article.id=115

[]'s

alexandremanowar

ok cara valeu pela força vou testar e posto aqui!

alberto_ribeiro

boa tarde cara, então eu costumo fazer uma classe que me retorna a conexão com um método static nela assim em qualquer lugar que precisar eu chamo ele: RetornaConexaoSqlServer.getCon();

public class RetornaConexaoSqlServer {

	private static Connection conexao;

	public static Connection getCon() {
		try {
			if (conexao == null || conexao.isClosed()) {
				Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
				conexao = DriverManager
						.getConnection(
								"jdbc:sqlserver://localhost:1433;databaseName=teste,
								"user", "senha");
			} else {
				return conexao;
			}
		} catch (ClassNotFoundException ex) {
			System.out
					.println("Não foi possível encontrar a classe do Driver do SqlServer");

		} catch (SQLException ex) {
			System.out.println("Não foi possível conectar ao servidor");
			conexao = null;
		}

		return conexao;
	}

}

[]'s

alexandremanowar

Então fiz da seguinte forma.
Fiz a class de conexão dessa forma:

/*
 * Conexao.java
 *
 * Created on 22 de Maio de 2007, 21:00
 */

package conexao;
 
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;



/**
 *
 * @author alexandre
 * @version
 */
public class Conexao {
 	
 	private static String NAME	= "com.mysql.jdbc.Driver";
 	private static String URL	= "jdbc:mysql://localhost/basedados";
 	private static String LOGIN	= "root";
 	private static String PASS	= "";
        private static Connection conn;
 	
 	/**
 	 * 
 	 * @return Conexao.
 	 * @throws SQLException
 	 * @throws IOException
 	 */
 	public static Connection connect() throws SQLException, IOException {
 		
 		try {
 			Class.forName(NAME);
 			conn = DriverManager.getConnection(URL, LOGIN, PASS);
 		} catch (ClassNotFoundException e) {
 			System.out.print("\nNão foi possível estabelecer conexão com a base de dados.\n");
 			e.printStackTrace();
 			return null;
 		}
 		return conn;
 	}
 }

E uso essa conexão em outra class da seguinte forma:

/*
 * DAO_usuario.java
 *
 * Created on 22 de Maio de 2007, 21:44
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package DAO;

import java.io.*;
import java.net.*;
import java.util.*;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.ResultSet;

import conexao.Conexao;

/**
 *
 * @author alexandre
 */
public class DAO_usuario 
{
    
    public String usuario;
    public String senha;
    public String consulta;
    public String logado;
    public String outros;
    
    private ResultSet rs;
    private Connection conn;
    private Statement sql;
  
    
      
    public void DAO_dados(String getUsuario, String getSenha) throws SQLException, IOException
    {
      
            conn = Conexao.connect(); 
            sql = conn.createStatement();   
            
            
            usuario = getUsuario; 
            senha = getSenha;
       
            consulta = "select * from senhadeals where senha='"+senha+"' and usuario='"+usuario+"' limit 1  ";
            
            
            rs = sql.executeQuery(consulta);
            
            
            while(rs.next())
            {
                logado = rs.getString("nome");
            }
        
        
        
       
    }

   public void DAO_outros(String getOutros) throws SQLException, IOException
    {
      
            conn = Conexao.connect(); 
            sql = conn.createStatement();   
            
            
            outros = getOutros; 

            consulta = "select * from tabela2 where outros='"+outros+"'  limit 1  ";
            
            
            rs = sql.executeQuery(consulta);
            
            
            while(rs.next())
            {
                resultado = rs.getString("outros");
            }
        
        
        
       
    }
    
    public String setLogado()
    {
        return logado;
    }

    public String setOutros()
    {
        return outros;
    }
    
    
}

Eu tenho a class que faz a conexão e a class que usa a conexão. O código esta funcionando. Acho apenas que essa class DAO_usuario tem uma falha não sei se é uma falha ou se é dessa forma mesmo! Eu me refiro ao seguinte eu tenho dois métodos que são:
1) public void DAO_dados(String getUsuario, String getSenha) throws SQLException, IOException
2) public void DAO_outros(String getOutros) throws SQLException, IOException
Em cada um desses métodos eu chamo o comando:
conn = Conexao.connect();
Tenho que chamar ele em cada método mesmo ou tem alguma forma de chamar ele apenas em algum lugar dessa classe e ja sirva para todos os métodos? É a única dúvida que ficou.

alexandremanowar

E ae galera será que alguém pode me ajudar com esse último post que fiz acima?
Valeu

Criado 5 de junho de 2007
Ultima resposta 6 de jun. de 2007
Respostas 5
Participantes 2