Dúvida a respeito do código de JAVA

Estou começando a estudar sobre interfaces e estou com uma dúvida bastante boba, mas é o seguinte, tenho o botão de cadastrar uma nova categoria, ele está funcionando como se espera, mas caso ocorra algum problema no SQL ele mostra a mensagem, mas também mostra a mensagem que foi inserida com sucesso, mas se ocorreu erro de SQL não deveria aparecer a mensagem se ocorreu erro no SQL.

[code]
private void btnCadastrarActionPerformed(java.awt.event.ActionEvent evt) {
String NOME_CATEGORIA = txtNomeCat.getText().toUpperCase();

    if (txtNomeCat.getText().trim().isEmpty()) {
        JOptionPane.showMessageDialog(null, "O campo não pode ser nulo, favor verificar.");

    } else {
        String query = "INSERT INTO sistema_financas.tbl_categoria (SK_CATEGORIA, NOME_CATEGORIA,DATA_CADASTRO) VALUES (nextval('sistema_financas.seq_tbl_categoria'), '" + NOME_CATEGORIA + "', current_date)";
        try {
            Statement stmt = conexao.createStatement();
            stmt.executeUpdate(query);
        } catch (SQLException e) {
            JOptionPane.showMessageDialog(null, e);
        }
        JOptionPane.showMessageDialog(null, "Categoria Cadastrada!");
        txtNomeCat.setText("");
    }
}  [/code]

Você deve ter uma garantia de que a operação de inserção ocorreu com sucesso para só então mostrar a mensagem. Você deve criar uma estrutura de seleção para avaliar se a operação de inserção foi exitosa, para só então exibir a mensagem. Porém você colocou o JOptionPane depois do catch, quando certo seria dentro do try. Eu faria assim:

}else{
	String query = "INSERT INTO sistema_financas.tbl_categoria (SK_CATEGORIA, NOME_CATEGORIA,DATA_CADASTRO) VALUES (nextval('sistema_financas.seq_tbl_categoria'), '" + NOME_CATEGORIA + "', current_date)";
	try{
		Statement stmt = conexao.createStatement();
		stmt.executeUpdate(query);
	
		JOptionPane.showMessageDialog(null, "Categoria Cadastrada!");
		txtNomeCat.setText("");
		
	}catch (SQLException e) {
		JOptionPane.showMessageDialog(null, e);
	}

[Dica]: eu particularmente não gosto de exibir informações corriqueiras em diálogos porque obriga o usuário a ficar fechando a janela de diálogo ou clicando em o Ok. Assim, no seu exemplo, em toda inserção o usuários tem que clicar em Ok. Eu, por meu turno gosto de exibir essas informações em um label no rodapé da janela, reservando a eventos de alerta o uso de diálogos.

1 curtida

Bom dia. o método executeUpdate(query); retorna um int com a quantidade de rows afetadas na tabela:

o método da classe Statement é assim:
int executeUpdate(String sql)

você deve verificar se este número é maior que 0 (pelo menos 1 row afetada).

crie uma variavel do tipo int com com escopo global e valor 0;

poderia ser algo como:

public class NomeDaClasse {
int affectedRows = 0; //esta variável será o contador de rows afetadas



resto do código até a execução da query


try{

affectedRows = stmt.executeUpdate(query); // em vez de simplesmente executar a query, armazenar a quantidade de rows afetadas na variável criada anteriormente como contador

if(affectedRows > 0) { // Se alguma row foi afetada no banco de dados:
            JOptionPane.showMessageDialog(null, "Categoria Cadastrada!");
            txtNomeCat.setText("");
        } else { // Se nenhuma row foi afetada:
            JOptionPane.showMessageDialog(null, "Ocorreu um erro ao cdastrar a categoria!");
            txtNomeCat.setText("");
        }
        affectedRows = 0; // resetar o valor para que não seja incrementado cada vez que executar
} catch(ClassNotFoundException ex) { // Exception lançada por "Class.forName(...)"
...
} catch(SQLException ex) {
...
}

Porem uma sugestão para lidar melhor com variáveis nas queries é usar a classe PreparedStatement em vez de Statement e adicionar as variáveis com os métodos para cada tipo de dado (é parecido com o Statement, pesquise sobre caso não conheça)

1 curtida

Pessoal, muito obrigado pelas suas respostas.
Eu entendi que estava informado o usuário não no momento correto, mas sim após todos os eventos, não importando o que ocorreu.]

@Jothar_Aleksander
Obrigado pela explicação e pela dica, irei aplicar elas em algumas situações.
@SamuelLira99
Obrigado pela outra forma de codificar, não tinha pensando. Vou dar uma olhada melhor nesses métodos que eu uso nas queries.