Add SQLITE data in Java

0

Personal I have a problem that I can not solve in Java. The intention is to make the connection in a SQLite database. But I can not do the insertion. Take a look at the code, please.

package conexao;

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

public class ConexaoBD {
    private Connection conecta;
    public Connection getConnection(){
        //avisando que o banco q vou utilizar é sqlite
        try {
            DriverManager.registerDriver(new org.sqlite.JDBC());
        } catch (SQLException e) {
            System.err.println("Problemas na hora de registrar driver");
            System.err.println("Saindo...");
            System.exit(1);
        }

    //Conectando no BD
    try {
        conecta =  DriverManager.getConnection("jdbc:sqlite:estoque.sqlite");


    } catch (SQLException e) {
        System.out.println("Impossivel se conectar no BD");
        System.exit(1);
    }
    return conecta;
}
}

Second class:

package entidades;

import java.sql.Statement;

import org.sqlite.SQLiteConnection;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import conexao.ConexaoBD;

public class Produto {
    private String descricao;
    private int estoque_minimo;
    private int estoque_maximo;


    public Produto(String descricao, int estoque_minimo, int estoque_maximo) {
        super();
        setDescricao(descricao);
        setEstoque_minimo(estoque_minimo);
        setEstoque_maximo(estoque_maximo);
        Inserir();
    }

    public String getDescricao() {
        return descricao;
    }
    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }
    public int getEstoque_minimo() {
        return estoque_minimo;
    }
    public void setEstoque_minimo(int estoque_minimo) {
        this.estoque_minimo = estoque_minimo;
    }
    public int getEstoque_maximo() {
        return estoque_maximo;
    }
    public void setEstoque_maximo(int estoque_maximo) {
        this.estoque_maximo = estoque_maximo;
    }

     public void Inserir(){  
         ConexaoBD banco = new ConexaoBD();
         Connection conecta = banco.getConnection();

         //cria objeto  
         Produto p = new Produto(getDescricao(), getEstoque_minimo(), getEstoque_maximo());           
         try {      

             Statement stmt = conecta.createStatement();
             //pegando o id maximo e somar mais um para adicionar o proximo produto
             ResultSet result = stmt.executeQuery("SELECT MAX(id) FROM produto");
              result.next();
              int idProx = result.getInt("MAX(id)");
              idProx++;
            // System.out.println(idProx);

             //Insere o produto
             String sql = "INSERT INTO produto(id,descricao,estoque_minimo, estoque_maximo) VALUES('idProx','p.getDescricao()','p.getEstoque_minimo()','p.getEstoque_maximo()');"; 
             stmt.executeUpdate(sql);


         } catch (SQLException u) {      
             throw new RuntimeException(u);      
         }      
     } 

}

Graphic Interface

package interface_grafica;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.FlowLayout;
import java.awt.event.WindowListener;
import java.sql.Date;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.xml.crypto.Data;
import entidades.Produto;

public class Janela extends JFrame{
/*
 JFRAME PRINCIAL
 */
private JMenuBar menuBar;
private JLabel status;
private JMenu menuProduto;
private JMenuItem addProduto, listarProduto;

/*
 * Adicao de produto
 */
private JLabel labelDescricao, labelEstoqueMin, labelEstoqueMax;
private JTextField tDescricao, tEstoqueMin, tEstoqueMax;
private JButton btnSalvar;
private JPanel telaDeAdicao;


private void addPainelProduto() {
    labelDescricao = new JLabel("Descrição");
    labelEstoqueMin = new JLabel("Estoque mínimo");
    labelEstoqueMax = new JLabel("Estoque Máximo");
    tDescricao = new JTextField(20);
    tEstoqueMin = new JTextField(10);
    tEstoqueMax = new JTextField(10);
    btnSalvar = new JButton("Salvar");

    btnSalvar.addActionListener((e)->{
        Produto produto = new Produto(tDescricao.getText(), Integer.parseInt(tEstoqueMin.getText()),
                            Integer.parseInt(tEstoqueMax.getText()));

        status.setText(produto.toString());


    });

    telaDeAdicao = new JPanel(new FlowLayout());
    telaDeAdicao.add(labelDescricao);
    telaDeAdicao.add(tDescricao);
    telaDeAdicao.add(labelEstoqueMin);
    telaDeAdicao.add(tEstoqueMin);
    telaDeAdicao.add(labelEstoqueMax);
    telaDeAdicao.add(tEstoqueMax);
    telaDeAdicao.add(btnSalvar);
}




private void constroiBarradeStatus() {
    status = new JLabel("Status");
    add(status, BorderLayout.SOUTH);
}


private void constroiMenu() {

    menuBar = new JMenuBar();

    menuProduto = new JMenu("Produto");
    addProduto = new JMenuItem("Adicionar");
    listarProduto = new JMenuItem("Listar");

    addProduto.addActionListener((e)->{
        status.setText("Adicionando Produtos");
        add(telaDeAdicao);

    });

    listarProduto.addActionListener((e)->{

        status.setText("Listando Produtos");
        //nao implementado ainda
    });


    menuProduto.add(listarProduto);
    menuProduto.add(addProduto);
    menuBar.add(menuProduto);
    setJMenuBar(menuBar);

}

}

For the product to be added I put in a graphical interface the fields that are passed by parameter after the user type and click SAVE, that is, the parameters will be passed in the ActionListener of the save button in the IG.

It's not working, does anyone know what it is?

ERROR:

  

Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError       at org.sqlite.core.CoreStatement. (CoreStatement.java:39)       at org.sqlite.jdbc3.JDBC3Statement. (JDBC3Statement.java:21)       at org.sqlite.jdbc4.JDBC4Statement. (JDBC4Statement.java:11)       at org.sqlite.jdbc4.JDBC4Connection.createStatement (JDBC4Connection.java:41)       at org.sqlite.jdbc3.JDBC3Connection.createStatement (JDBC3Connection.java:193)       at org.sqlite.SQLiteConfig.apply (SQLiteConfig.java:123)       at org.sqlite.core.CoreConnection. (CoreConnection.java:85)       at org.sqlite.jdbc3.JDBC3Connection. (JDBC3Connection.java:26)       at org.sqlite.jdbc4.JDBC4Connection. (JDBC4Connection.java:24)       at org.sqlite.SQLiteConnection (SQLiteConnection.java:45)       at org.sqlite.JDBC.createConnection (JDBC.java:114)       at org.sqlite.JDBC.connect (JDBC.java:88)       at java.sql.DriverManager.getConnection (Unknown Source)       at java.sql.DriverManager.getConnection (Unknown Source)       at connection.ConnectionBD.getConnection (ConnectionBD.java:25)       at entities.Product.Insert (Product.java:50)       to entities.Product. (Product.java:23)       at entities.Product.Inserir (Product.java:53)       to entities.Product. (Product.java:23)       at entities.Product.Inserir (Product.java:53)       to entities.Product (Product.java:23)

After that loop

  

at entities.Product.Insert (Product.java:53)

     

at entities.Product (Product.java:23)

and after a while to

    
asked by anonymous 28.07.2017 / 21:08

1 answer

1

There are some problems in your code that I've noticed, I'll explain each one of them.

1 ° There is a way to do all this work with only 1 select, just that your primary key has the AUTOINCREMENT attribute. So there will be no need to select the maximum first;

2 ° The methods are like a string, so they are not returning anything. idProx is also in the same situation, if you want to continue with this methodology the right would be concatenate this way:

String sql = "INSERT INTO produto(id,descricao,estoque_minimo, estoque_maximo) VALUES('" + idProx + "','" + p.getDescricao() + "','" + p.getEstoque_minimo() + "','" + p.getEstoque_maximo() + "');";

3 ° Reusing Statements causes some strange behavior, in addition to what the documentation points to: (

  

By default, only one ResultSet object by Statement object can be open at the same time. Therefore, if the reading of one ResultSet object is interleaved with the reading of another, each must have been generated by different Statement objects. All execution methods in the Statement interface implicitly close to the current status ResultSet object if an open one exists.

4 ° Using Statement to insert data opens gap for possible SQL injection because it is possible to observe what data are entered and their types, in this case it would be better to use the PreparedStatment in this way:

public void inserir(){
    // Estou supondo que você seguiu a orientação de usar AUTOINCREMENT
    Connection con = getConnection();
    PreparedStatement p = con.prepareStatement("insert into produto (descricao, estoque_minimo, estoque_maximo) values (?,?,?)");
    p.setString(1, p.getDescricao());
    p.setInt(2, p.getEstoqueMinimo());
    p.setInt(3, p.getEstoqueMaximo());
    p.executeUpdate();

    // Não esqueça de fechar ResultSets, Statments e Conexões pois elas 
    // Acumulam
    p.close();
    con.close();
}

Using the PreparedStatment your code also gets cleaner and easier to maintain.

Still about your code, no longer in the SQL part, you can better it by using this in your constructor like this:

public Produto(String descricao, int estoque_minimo, int estoque_maximo){
    super(); // Não entendi essa chamada, é mesmo necessária?
    // Atribui o valor recebido no construtor ao atributo da classe com mesmo nome
    this.descrição = descricao; 
    this.estoque_minimo = estoque_minimo;
    this.estoque_maximo = estoque_maximo;
    Inserir();
}
It may also be legal to separate classes for connections, insertions, updates, and deletions in the database, so you find the methods more easily because the Model classes would be well defined. In the current model you are merging Entity concepts with operations on the data.

SqlInsert operacao = new SqlInsert();
operacao.inserirProduto(String descricao, int estoque_minimo, int estoque_maximo);
    
29.07.2017 / 17:39