Update Java

Olá Pessoal, estava criando meu projeto de conexão com o banco de dados, quase fechando, porém me apareceu algo que naum estou vendo uma saida par resolver:
Por favor, avaliem: quando chamoo controle ele me traz a opção da classe visao que o usuario escolheu(incluir, alterar, exlcuir…), ai dependendo da opção ele me direciona para a classe Dao, para puxar o objeto vo preenchido na visao, e direciona para a canexao com o banco para fazer o procedimento(inlcusao. exclusão…etc, me retornando uma msgn de erro ou acerto.

Porém na parte de update, ele altera o campo que eu escolherEX: Ricardo, é alterado para manoel…entre outros…
Mas eu gostaria que ele verificasse no banco primeiro para depois retonar a msgn que alterou ou não alterou, pois se existe ou não no banco o valor que o usuario digitar ele retona alterado com sucesso, a unica diferença é que se existe ele altera realmente, e se não, ele so retorna a msng de alterado com sucesso, mas não altera nd(obviamente).Estou mandando trechos das classes separados:Por favor me ajudem

Classe controle:

[code]
public class Controle
{
public void EscolherOpcao() throws SQLException
{
Visao v = new Visao();//Cria um objeto de Visão
int escolha = v.Opcao();//Atribui o retorno da escolha do usuário na variável escolha
UsuarioDao dao = new UsuarioDao();//Cria um novo objeto de UsuárioDao
switch(escolha)//Verifica a escolha
{//Chama o método correspondente no UsuárioDao
case 1:
dao.IncluirUsuario();
break;
case 2:
dao.ExcluirUsuário();
break;
case 3:
dao.LocalizarUsuário();
break;
case 4:
dao.AlterarUsuário();
break;
case 5:
System.exit(0);
break;
default:
System.out.println(“Opção Inválida!”);
break;
}
}

}[/code]

Classe Usuario Dao

public void AlterarUsuário() throws SQLException
    {
        int opcaoEscolha = new Visao().AlterarUsuarioOpcao();
        switch(opcaoEscolha)
        {
            case 1:
            {
                UsuarioVo vAlter = new Visao().AlterarUsuarioNomeVisao();
                cb.Alterar("UPDATE usuario SET nome = '" + vAlter.getNome() + "' WHERE nome = '" + vAlter.getNomeAlter() +"';");
                break;
            }
            case 2:
            {
                UsuarioVo vAlter = new Visao().AlterarUsuarioCpfVisao();
                cb.Alterar("UPDATE usuario SET cpf = '" + vAlter.getCpfAlter() + "' WHERE cpf = '" + vAlter.getCpf() +"';");
                break;
            }
            case 3:
            {
                UsuarioVo vAlter = new Visao().AlterarUsuarioBairroVisao();
                cb.Alterar("UPDATE usuario set bairro = '" + vAlter.getBairroAlter() + "' WHERE bairro = '" +vAlter.getBairro() + "';");
                break;
            }
            default:
            {
                System.out.println("Opção Inválida!");
            }
        }
        Controle crtl = new Controle();//Chama o controle novamente para selecionar a proxima opção
        crtl.EscolherOpcao();
    }

Classe Visao:Onde o usuario primeiro chama a alterarUsuarioOpcao,para saber o que quer alterar, depois chama as de baixo!

public int AlterarUsuarioOpcao()//Caso a opção escolhida seja de modificação
    {
        System.out.println("Escolha uma opção de alteração no banco: 1-Nome, 2-CPF, 3-Bairro");
        //Escolhe-se o tipo de modificação que se quer
        int escolhaTroca = Integer.parseInt(s.next());
        return escolhaTroca;
    }
    public UsuarioVo AlterarUsuarioNomeVisao()//Caso escolha a modificação do NOME
    {
        UsuarioVo voAlter = new UsuarioVo();
        System.out.println("Digite o nome do Usuario que deseja alterar:");
        voAlter.setNomeAlter(s.next());
        System.out.println("Digite por qual nome " +voAlter.getNomeAlter()+ " deve ser trocado:");
        voAlter.setNome(s.next());
        return voAlter;
    }
    public UsuarioVo AlterarUsuarioCpfVisao()//Caso escolha a modificação do CPF
    {
        UsuarioVo voAlter = new UsuarioVo();
        System.out.println("Digite o numero de cpf que deseja alterar:");
        voAlter.setCpf(s.next());
        System.out.println("Digite por qual cpf " + voAlter.getCpf() + " deve ser trocado:");
        voAlter.setCpfAlter(s.next());
        return voAlter;
    }
    public UsuarioVo AlterarUsuarioBairroVisao()//Caso escolha a modificação do BAIRRO
    {
        UsuarioVo voAlter = new UsuarioVo();
        System.out.println("Digite o bairro que deseja alterar:");
        voAlter.setBairro(s.next());
        System.out.println("Digite poor qual bairro " + voAlter.getBairro() + " deve ser trocado:");
        voAlter.setBairroAlter(s.next());
        return voAlter;
    }

ClasseConecta Banco

public void Alterar(String s)
    {
        try
        {
            Class.forName("com.mysql.jdbc.Driver").newInstance();
            try
            {
                Connection conn = DriverManager.getConnection(getUrl(), getLogin(), getSenha());
                try
                {
                    String sql = s;//String que recebe o valor que veio de parametro 
                    Statement stm = conn.createStatement();
                    try
                    {
                        stm.executeUpdate(s);
                        System.out.println("Alterado com Sucesso!\n\n");
                    }
                    catch(Exception e)
                    {
                        System.out.println("Erro no Update!!!");
                    }
                }
                catch(Exception e)
                {
                    System.out.println("Erro No statement!");
                }
            }
            catch(Exception e)
            {
                System.out.println("Deu erro na conexão!");
            }
        }
        catch(Exception e)
        {
            System.out.println("Deu erro na parte de carregar o driver!");
        }
    }

Por favor me ajudem

Antes de mais, deves substituir o uso de Statement por PreparedStatement

Depois, deves validar esses SQL. Queres mesmo mudar TODOS os registos com o nome, cpf ou bairro indicado e não apenas um registo de um utilizador específico?

Em relação à tua dúvida, o executeUpdate devolve um int com o número de registos alterados. Se esse valor for 0 é porque não alterou nada.

Não sei se ficaria muito elegante, mas você poderia verificar se o objeto dessa instrução:

UsuarioVo vAlter = new Visao().AlterarUsuarioNomeVisao();

… é nulo, por exemplo, daí então você implementaria sua regra no próprio DAO. Existem outras possibilidades, como por exemplo o hibernate 3! :smiley:

Espero ter ajudado.

abraço!

Opa, então eu posso receber o execute update num int, bacana , não sabia, deu certinho, era exatamente o que eu queria, havia tentado verificar se retornava um booleno, mas nem imaginei que pudesse retornar um int…

Referente ao Statement por que voce me disse que Devo utilizar o PreparedStatement???Qual seria a diferença entre os dois???caso trocasse por esse, deveria alterar mais algo em meu código em virtude disso???

Abrção

Indica aí ao teu programa que queres alterar o nome Manuel’;delete from usuarios;– para outro nome qualquer e vê o que acontece à tua tabela

Referente a sua dúvida:

http://www.guj.com.br/posts/list/184930.java

Como assim pmlm, vou direto ao banco de dou um delete from usuario where nome = ‘manuel’;???
Poderia me explicar de outra forma???

Ah ja troquei, mas não senti diferença, se bem que meu banco é constituido de uma tabela!!!

Obrigado tbm getAdicted(li la no link)!!!

[quote=Ronald_lima]Como assim pmlm, vou direto ao banco de dou um delete from usuario where nome = ‘manuel’;???
[/quote]
Não. Quando a aplicação perguntar “Digite o nome do Usuario que deseja alterar:” tu escreves exactamente Manuel’;delete from usuarios;–

Com PreparedStatement vai tentar mudar o nome a alguém com este nome e obviamente não vai mudar nada.

Com Statement, vai mudar o nome de quem se chama Manuel e depois apaga todos os teus registos da tabela usuario.

Para saber mais procura por SQL Injection