Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Pitacos no meu código

Boa tarde estimados, abaixo segue o meu código, se puderem apontar alguma melhoria:

package br.com.crud.jdbc;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Scanner;

/**
 * <b>Classe criada para testar inserções no banco HQSQLDB</b>
 * 
 * @author <i>RCARAUJO - Renato Cézar Silva de Araújo.</i>
 * @category Testes
 * @since 04/02/2020 - 11:27hs
 * @since 12/02/2020 - 13:13
 * @version 1.0
 */

public class TestaInsercaoModificado {

    private static String nome;
    private static String descricao;
    private static String entrada;
    private static Scanner ler = new Scanner(System.in);

    public static String getNome() {
        return nome;
    }

    public static void setNome(String nome) {
        TestaInsercaoModificado.nome = nome;
    }

    public static String getDescricao() {
        return descricao;
    }

    public static void setDescricao(String descricao) {
        TestaInsercaoModificado.descricao = descricao;
    }

    public static String getEntrada() {
        return entrada;
    }

    public static void setEntrada(String entrada) {
        TestaInsercaoModificado.entrada = entrada;
    }

    public static Scanner getLer() {
        return ler;
    }

    public static void main(String[] args) throws SQLException {

        System.out.println("Informe o Nome: ");
        setNome(getLer().next());

        System.out.println("Informe a Descrição: ");
        setDescricao(getLer().next());

        Connection connection = Database.getConnection();
    connection.setAutoCommit(false);

        try {

            String sql = "insert into produto (nome, descricao) values (?, ?)";
            PreparedStatement statement = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);

            adiciona(getNome(), getDescricao(), statement);
            connection.commit();
            statement.close();

        } catch (Exception e) {

            e.printStackTrace();
            connection.rollback();

        }

        connection.close();

    }

    private static void adiciona(String nome, String descricao, PreparedStatement statement) throws SQLException {

        if(getNome().equals("Teste") || getNome().equals("teste")) {

            throw new IllegalArgumentException("Problema ocorrido na inserção...");
        }

        nome = getNome();
        descricao = getDescricao();
        statement.setString(1, getNome());
        statement.setString(2, getDescricao());
        boolean resultado = statement.execute();
        System.out.println(resultado);
        ResultSet generatedKeys = statement.getGeneratedKeys();

        while (generatedKeys.next()) {
            long id = generatedKeys.getLong("id");
            System.out.println("id gerado: " + id);
        }

        generatedKeys.close();
    }
}

2 respostas
solução!

Bom dia!

Não sei até que ponto você chegou nos cursos, o ou seu nível de conhecimento no Java. Como você pediu uma opinião, aqui vai a minha: notei um grande uso de variáveis tipo static. A ideia do static é ter valores imutáveis e acessíveis em qualquer ponto do código, sem necessidade de getters e setters. Como suas variáveis são lidas da console, não devem ser static. Assim, mudei o seu main(), que apenas lê as entradas da console e repassa a responsabilidade para a sua classe. Após, o método adiciona conecta na base, tem o seu PreparedStatement, faz o que precisa, e no finally, é fechado o statement e a conexão. A abertura e fechamento de conexão estão em funções separadas.

Minha sugestão ficou assim:

public class TestaInsercaoModificado {

private String nome = null;
private String descricao = null;
private String entrada = null;
Connection connection = null;

public String getNome() {
    return this.nome;
}

public void setNome(String nome) {
    this.nome = nome;
}

public String getDescricao() {
    return this.descricao;
}

public void setDescricao(String descricao) {
    this.descricao = descricao;
}

public String getEntrada() {
    return this.entrada;
}

public void setEntrada(String entrada) {
    this.entrada = entrada;
}

public static void main(String[] args) throws SQLException {
    Scanner ler = new Scanner(System.in);;

    TestaInsercaoModificado tim = new TestaInsercaoModificado();

    System.out.println("Informe o Nome: ");
    tim.setNome(ler.next());

    System.out.println("Informe a Descrição: ");
    tim.setDescricao(ler.next());

    tim.adiciona();

    ler.close();
}

private void adiciona() throws SQLException {
    PreparedStatement statement = null;
    try {
        conectar();

        String sql = "insert into produto (nome, descricao) values (?, ?)";
        statement = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);

        if (getNome().equals("Teste") || getNome().equals("teste")) {

            throw new IllegalArgumentException("Problema ocorrido na inserção...");
        }

        statement.setString(1, getNome());
        statement.setString(2, getDescricao());
        boolean resultado = statement.execute();
        connection.commit();

        System.out.println(resultado);
        ResultSet generatedKeys = statement.getGeneratedKeys();

        while (generatedKeys.next()) {
            long id = generatedKeys.getLong("id");
            System.out.println("id gerado: " + id);
        }
        generatedKeys.close();
    } catch (Exception e) {

        e.printStackTrace();
        connection.rollback();

    } finally {
        statement.close();
        desconectar();
    }

}

private void conectar() {
    try {
        connection = Database.getConnection();
        connection.setAutoCommit(false);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

private void desconectar() {
    try {
        connection.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

}

Em caso de dúvidas, à disposição. Bons estudos!

Muito obrigado Thiago Trevisan! Usei as variáveis estáticas só por conta do curso, já remontei todo o esquema obedecendo a orientação a objetos em classes separadas e sem usar o static em nada, o uso do static foi só para uma amostra, gostei muito do seu código, vou implementá-lo aqui. Algumas coisas deram erros quando executei o seu código, mas estou corrigindo.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software