Add SQLITE data in Java

Asked

Viewed 429 times

0

Guys, I’m having a problem I’m having trouble solving in Java. The intention is to connect to a database SQLite. But I’m having trouble inserting it. 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);      
         }      
     } 

}

Graphical 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 on SAVE, IE, the parameters will be passed in the Actionlistener of the save button in IG.

It’s not working, someone knows 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 conexao.ConexaoBD.getConnection(Conexaobd.java:25) at entidades.Product.Insert(Product.java:50) at entities. Product.(Product.java:23) at entidades.Product.Insert(Product.java:53) at entities. Product.(Product.java:23) at entidades.Product.Insert(Product.java:53) at entities. Product. (Product.java:23)

After that it loops with this

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

at entities. Product. (Product.java:23)

and after a while to

  • He comes to fall into one of these System.exit(1) or he can create the connection?

  • No, it connects normally, but I just can’t get it into the bank

  • What is the mistake that?

  • I put it up there.

1 answer

1


There are some problems in your code that I’ve observed, I’ll explain each of them.

1° There is a way to do all this work with only 1 select, it is enough that your Primary key has the attribute AUTOINCREMENT. 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 one would concatenate in this way:

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

3° Reuse Statements causes some strange behaviors, in addition to what the documentation points out: (Statement)

By default, only one Resultset Object per 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 a statment’s Current Resultset Object if an open one exists.

4° Using Statement to insert data opens a gap for possible SQL Injection as it is possible to observe what data is entered and its types, in which case it would be better to use Preparedstatment 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 Preparedstatment your code is also cleaner and easier to maintain.

Still on your code, no longer on the SQL part, you can improve it by using this in your constructor this way:

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 can also be nice to separate Classes for connections, inserts, 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 mixing the concepts of Entity with operations in the data.

SqlInsert operacao = new SqlInsert();
operacao.inserirProduto(String descricao, int estoque_minimo, int estoque_maximo);
  • It worked out what I wanted, thanks!

  • You could mark the answer as "accept" by ticking the OK below the up and down arrows?

Browser other questions tagged

You are not signed in. Login or sign up in order to post.