Problema com dao

boa tarde gente…

na classe abaixo eu tenho o metodo “update”
que se um registro existir na tabela ele faz o update normalmente
porem eu preciso fazer uma rotina que:

se for dado um update e o registro nao existir o metodo “update” chamara o
metodo “Insere” para inserir o registro

meu problema:

da lina 100 ate a linha 120

observem que ja tentei de tudo
ou seja

primeiro, achei que se o reistro nao existisse ele iria sair num SQLException
porque pelo SQLException eu iria testar o codigo do erro e sendo -2601 que e o erro do SQLSERVER (banco que uso)
de registro inexistente eu iria chamar o metodo “Insere” porem ele nao sai como SQLException
inclusive coloquei para aparecer qualquer mensagem para verificar se estava passando por ali

depois eu pensei que o smtm.execute, como ele retorna um boolean
se fosse false pensei que era porque nao tinha encontrado o registro porem
ele me retorna false se existir o registro ou nao existir o registro

em fim:

como eu consigo verificar se o Update que estou dando no metodo me diga se encontrou o registro ou nao…

desde ja agradeco…

[code]/*

  • To change this template, choose Tools | Templates
  • and open the template in the editor.
    */
    package Tabelas;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.swing.JOptionPane;
import master00.ConexaoDB;

/**
*

  • @author Jonas
    */
    public class UsuarioDAO {

    private Connection con;

    public UsuarioDAO() throws Exception {
    this.con = ConexaoDB.getConnection();
    }

    public Usuario getUsuario(String usucodigo) throws Exception {

     Usuario usuario;
    
     try {
         usuario = new Usuario();
     } catch (Exception e) {
         JOptionPane.showMessageDialog(null, "UsuarioDAO" + e);
         System.exit(0);
         throw new Exception(e); // se nao tiver o usuario vira erro
     }
    
     try {
         PreparedStatement smtm = con.prepareStatement("select * from usuario where usucodigo = ?");
         smtm.setString(1, usucodigo);
         ResultSet rs = smtm.executeQuery();
    
         if (rs.next()) {
             usuario.setUsucodigo(rs.getString("usucodigo"));
             usuario.setUsunome(rs.getString("usunome"));
             usuario.setUsutipo(rs.getString("usutipo"));
             usuario.setUsucodfunc(rs.getInt("usucodfunc"));
             usuario.setUsuloja(rs.getInt("usuloja"));
             usuario.setUsusenha(rs.getString("ususenha"));
             usuario.setUsuprivilegio(rs.getString("usuprivilegio"));
             usuario.setUsutipoimp(rs.getString("usutipoimp"));
             usuario.setUsudirtrab(rs.getString("usudirtrab"));
             usuario.setUsufuncaocaixa(rs.getString("usufuncaocaixa"));
             usuario.setUsugerimp(rs.getString("usugerimp"));
    
         } else {
             throw new Exception("Usuário Não Cadastrado");
         }
    
         rs.close();
         smtm.close();
    
     } catch (SQLException e) {
         JOptionPane.showMessageDialog(null, e);
         System.exit(0);
     }
    
     return usuario;
    

    }

    public void update(Usuario usuario) throws Exception {

System.out.println(usuario.getUsucodigo());
try {
PreparedStatement smtm = con.prepareStatement(
“update usuario "
+ " set usunome= ?, "
+ " usutipo= ?, "
+ " usucodfunc= ?, "
+ " usuloja= ?, "
+ " ususenha= ?, "
+ " usuprivilegio= ?, "
+ " usutipoimp= ?, "
+ " usudirtrab= ?, "
+ " usugerimp= ? "
+ " where usucodigo = ?”);
smtm.setString(1, usuario.getUsunome());
smtm.setString(2, usuario.getUsutipo());
smtm.setInt(3, usuario.getUsucodfunc());
smtm.setInt(4, usuario.getUsuloja());
smtm.setString(5, usuario.getUsusenha());
smtm.setString(6, usuario.getUsuprivilegio());
smtm.setString(7, usuario.getUsutipoimp());
smtm.setString(8, usuario.getUsudirtrab());
smtm.setString(9, usuario.getUsugerimp());
smtm.setString(10, usuario.getUsucodigo());

        System.out.println("alterando registro");

        boolean b;
        b=smtm.execute();
        
        System.out.println(b);
        
        if (!b) {
            Insere(usuario);
        }
        smtm.close();
        con.commit();

        System.out.println("alterando regis002");

    } catch (SQLException e) {
        System.out.println("alterando regis003");
        System.out.println(e);
        if (e.getErrorCode() == -2601) {
            Insere(usuario);
            return;
        }
        throw new Exception(e);
    }

}

private void Insere(Usuario usuario) throws Exception {
    try {
        PreparedStatement smtm = con.prepareStatement(
                "insert usuario (usucodigo,"
                + " usunome,usutipo,usucodfunc,"
                + " usuloja,ususenha,usuprivilegio,"
                + " usutipoimp,usudirtrab,usugerimp)"
                + " values "
                + "(?,?,?,?,?,?,?,?,?,?)");

        smtm.setString(1, usuario.getUsucodigo());
        smtm.setString(2, usuario.getUsunome());
        smtm.setString(3, usuario.getUsutipo());
        smtm.setInt(4, usuario.getUsucodfunc());
        smtm.setInt(5, usuario.getUsuloja());
        smtm.setString(6, usuario.getUsusenha());
        smtm.setString(7, usuario.getUsuprivilegio());
        smtm.setString(8, usuario.getUsutipoimp());
        smtm.setString(9, usuario.getUsudirtrab());
        smtm.setString(10, usuario.getUsugerimp());

        smtm.execute();
        smtm.close();
        con.commit();
        
        System.out.println("inserindo registro");

    } catch (Exception e) {
        throw new Exception(e);
    }

}

}[/code]

Porque você não faz de um jeito que repasse para a sua visão o codigo e no controlador você faz um if e chama ou o método de insert ou update.

Não acho muito legal no dao o método update chamar o insert, afinal o método se destina a fazer update e não validar lógica se tem o id ou não.

Tenta fazer essa checagem em outra camada.

este metodo eu preciso que ele funcione extamente
assim eu poderia ate mudar o nome do metodo
para outro
porem eu preciso saber se o update foi feito ou nao

Se não me engano retorna um boolean indicando se foi executado com sucesso ou não.

mas o que você quer pelo que percebi e chamar update quando tiver id e insert quando for registro novo.

Por isso eu te dei a idéia de levar o id para a tela e colocar em um campo hidden qualquer.

Daí é so você fazer um if e chamar um método ou outro.

Como o colega acima falou, receba esse código em outra camada, na de visão ou uma de negócio/controle e, então, faça algo como:

  1. Consulte o usuario.
  2. Existe? Então UPDATE, se não, INSERT.

Não misture as responsabilidades dos métodos, se o método é UPDATE, então ele deve fazer apenas UPDATE, e não um INSERT ninja.

Outra dica, não use Exception para casos como “Usuário Não Cadastrado”. Se o seu método de busca não encontra um usuário, ele pode simplesmente retornar null. Se você fizer questão de lançar uma exceção, pelo menos crie uma exceção de negócio, que identifique melhor o “problema”, algo como “BuscaVaziaException” (nome tosco, mas melhor que usar a Exception).

Resumindo, vc poderia fazer:

public void meuMetodoEmOutraClasse(Usuario usuarioEditado) {
  UsuarioDAO dao = new UsuarioDAO();
  Usuario usuario = dao.getUsuario(usuarioEditado.getCodigoUsuario());
  if (usuario == null) {
    dao.insert(usuarioEditado);
  } else {
    dao.update(usuarioEditado);
  }
}

[quote=Rendrys]Como o colega acima falou, receba esse código em outra camada, na de visão ou uma de negócio/controle e, então, faça algo como:

  1. Consulte o usuario.
  2. Existe? Então UPDATE, se não, INSERT.

Não misture as responsabilidades dos métodos, se o método é UPDATE, então ele deve fazer apenas UPDATE, e não um INSERT ninja.

Outra dica, não use Exception para casos como “Usuário Não Cadastrado”. Se o seu método de busca não encontra um usuário, ele pode simplesmente retornar null. Se você fizer questão de lançar uma exceção, pelo menos crie uma exceção de negócio, que identifique melhor o “problema”, algo como “BuscaVaziaException” (nome tosco, mas melhor que usar a Exception).

Resumindo, vc poderia fazer:

public void meuMetodoEmOutraClasse(Usuario usuarioEditado) { UsuarioDAO dao = new UsuarioDAO(); Usuario usuario = dao.getUsuario(usuarioEditado.getCodigoUsuario()); if (usuario == null) { dao.insert(usuarioEditado); } else { dao.update(usuarioEditado); } } [/quote]

++

para saber a quantidade de registro afetados, faça:

int rows = preparedStatement.executeUpdate();
System.out.printf("%d linhas afetadas", rows);

vamos usar o KISS (http://pt.wikipedia.org/wiki/Keep_It_Simple) neste problema. Se você quer usar a mesma view de cadastro para update, mande um parametro para o controller informando a ação que deve ser tomada ao ser submetido seus dados, OU, antes de dar o submit do seu form, mudar com javascript o action do seu formulario de acordo com o parâmetro passado para view (sendo esse, mais fácil de se testar em teste unitários, pois os actions de insert/update ficam totalmente separados).

Valeu Rendrys. Isso que eu queria dizer.