Run select from the java DAO class

Asked

Viewed 370 times

0

I’m having trouble using a select of a dao class in a main class. You can help me. Follows code.

package Model;

public class MTotalProduto {

    private String codigoBarra;
    private double totalProduto;
    private int produto_id;

    public MTotalProduto() {
    }

    public MTotalProduto(String codigoBarra, double totalProduto, int produto_id) {
        this.codigoBarra = codigoBarra;
        this.totalProduto = totalProduto;
        this.produto_id = produto_id;
    }

    public String getCodigoBarra() {
        return codigoBarra;
    }

    public void setCodigoBarra(String codigoBarra) {
        this.codigoBarra = codigoBarra;
    }

    public double getTotalProduto() {
        return totalProduto;
    }

    public void setTotalProduto(double totalProduto) {
        this.totalProduto = totalProduto;
    }

    public int getProduto_id() {
        return produto_id;
    }

    public void setProduto_id(int produto_id) {
        this.produto_id = produto_id;
    }

    @Override
    public String toString() {
        return "MTotalProduto{" + "codigoBarra=" + codigoBarra + ", totalProduto=" + totalProduto + ", produto_id=" + produto_id + '}';
    }

}
package DAO;

import Model.MTotalProduto;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class DTotalProduto {

    private Connection con;

    public DTotalProduto(Connection con) {

        setCon(con);

    }

    public Connection getCon() {

        return con;

    }

    public void setCon(Connection con) {

        this.con = con;
    }

    public String salvar(MTotalProduto tot) {

        String sql = "insert into estoque.total_produto values(?,?,?)";

        try {

            PreparedStatement ps = getCon().prepareStatement(sql);
            ps.setString(1, tot.getCodigoBarra());
            ps.setDouble(2, tot.getTotalProduto());
            ps.setInt(3, tot.getProduto_id());

            if (ps.executeUpdate() > 0) {

                return "Total Salvo com sucesso!";

            } else {

                return "Erro ao Salvar Total de Produtos!";

            }

        } catch (SQLException e) {

            return e.getMessage();

        }

    }

    public String totProduto(MTotalProduto mt) {

        String sql = "SELECT total FROM estoque.total_produto "
                + "where produto_id=?";

        try {

            PreparedStatement ps = getCon().prepareStatement(sql);
            ps.setInt(1, mt.getProduto_id());
            ResultSet rs = ps.executeQuery();

            if (rs.next()) {

                    MTotalProduto mtp = new MTotalProduto();
                    mtp.setTotalProduto(rs.getDouble("total"));
                    mtp.setProduto_id(rs.getInt("produto_id"));

            } else {

                return "Erro ao Carregar Total de Produtos!";

            }

        } catch (SQLException e) {

            return "Exeção ao carregar Total de Produtos!";

        }

        return "Total não carregado";

    }

}
package Principal;

import DAO.DConexao;
import DAO.DTotalProduto;
import Model.MTotalProduto;
import java.sql.Connection;

public class TotalProdutoMain {

    public static void main(String[] args) {

        Connection con = DConexao.abrirConexao();
        DTotalProduto dtp = new DTotalProduto(con);
        MTotalProduto tp = new MTotalProduto();


    }

}

The intention is to set a produto_id and show the total value.

Thanks for your help.

2 answers

4

First, package names should have all lowercase letters and identifier names should follow the pattern camelCase. See more here on the conventions. In addition, class names should be descriptive, and therefore it is good to avoid obscure abbreviations, as in the case of their prefixes M and D. Call your classes the Conexao, of TotalProduto and of TotalProdutoDAO and use produtoId instead of produto_id.

Then immutable classes are much easier to use, reuse, test, and are much less likely to cause unexpected bugs. Therefore, I suggest that the class TotalProduto is immutable. Prefer to make immutable classes when possible and only introduce mutability when there is a good and strong reason for it. Your class TotalProduto gets like this:

package model;

public final class TotalProduto {

    private final String codigoBarra;
    private final double totalProduto;
    private final int produtoId;

    public TotalProduto(String codigoBarra, double totalProduto, int produtoId) {
        this.codigoBarra = codigoBarra;
        this.totalProduto = totalProduto;
        this.produtoId = produtoId;
    }

    public String getCodigoBarra() {
        return codigoBarra;
    }

    public double getTotalProduto() {
        return totalProduto;
    }

    public int getProdutoId() {
        return produtoId;
    }

    @Override
    public String toString() {
        return "TotalProduto{" +
                "codigoBarra=" + codigoBarra +
                ", totalProduto=" + totalProduto +
                ", produtoId=" + produtoId + '}';
    }
}

The return of a method should serve to inform the expected result. In your method totProduto (that should be called totalProduto), the return should inform the total of the product. However, in your methods, you usurped the return to show error or success messages.

Imagine, for example, that I wanted to do a function that sums up two numbers:

 public String somar(int a, int b) {
     int r = a + b;
     return "Somado com sucesso.";
 }

Now, imagine I’m going to use this method to do somar(16, 28). The answer I would like to have is 44, but instead, I have as a result a virtually useless string. To solve this kind of thing, I just need to abolish this practice of returning strings with codes or status messages:

 public int somar(int a, int b) {
     return a + b;
 }

As for the cases where an exception occurs, what you should do is simply throw out these exceptions. The exceptions were invented exactly to signal error conditions. Thus, when returning strings with error messages, you are subverting the exception handling mechanism that already exists and that was invented precisely to free the programmer from having to usurp the return of functions/methods with codes and/or error messages.

Your code should use the Try-with-Resources. I suggest you read all the content of this question to understand why. Also note that this question shows a lot of how you should handle to build your DAO.

Ah, and remember to at all times use the Connection, the PreparedStatement and the ResultSet with the Try-with-Resources.

Your code of TotalProdutoDAO should look like this:

package dao;

import model.TotalProduto;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class TotalProdutoDAO {

    private static final String INSERT_SQL =
            "INSERT INTO estoque.total_produto VALUES (?, ?, ?)";

    private static final String SELECT_SQL =
            "SELECT total FROM estoque.total_produto WHERE produto_id = ?";

    private final Connection con;

    public TotalProdutoDAO(Connection con) {
        this.con = con;
    }

    public void salvar(TotalProduto tot) throws SQLException {
        try (PreparedStatement ps = con.prepareStatement(INSERT_SQL)) {
            ps.setString(1, tot.getCodigoBarra());
            ps.setDouble(2, tot.getTotalProduto());
            ps.setInt(3, tot.getProdutoId());

            if (ps.executeUpdate() == 0) {
                throw new SQLException("Nenhum resultado foi produzido.");
            }
        }
    }

    public double totalProduto(int idProduto) throws SQLException {
        try (PreparedStatement ps = con.prepareStatement(SELECT_SQL)) {
            ps.setInt(1, idProduto);
            try (ResultSet rs = ps.executeQuery()) {
                if (!rs.next()) {
                    throw new SQLException("Nenhum resultado foi produzido.");
                }
                return rs.getDouble("total");
            }
        }
    }
}

Note that the method totalProduto does not work with the object TotalProduto because he only deals with the fields idProduto and total, leaving the codigoBarra sideways. If you’re going to use a class that models a database table, it’s a good idea to either use all of its fields or simply not use it. Any middle way is probably a bad programming practice. Here in the case, this method only brings a double as a result of a int.

If your idea was to bring instances of MTotalProduto, then do this method like this (also modifying the SQL statement):

    private static final String SELECT_SQL =
            "SELECT total, codigo_barra FROM estoque.total_produto WHERE produto_id = ?";

    public TotalProduto buscar(int idProduto) throws SQLException {
        try (PreparedStatement ps = con.prepareStatement(SELECT_SQL)) {
            ps.setInt(1, idProduto);
            try (ResultSet rs = ps.executeQuery()) {
                if (!rs.next()) {
                    throw new SQLException("Nenhum resultado foi produzido.");
                }
                double total = rs.getDouble("total");
                String codigoBarra = rs.getDouble("codigo_barra");
                return new TotalProduto(codigoBarra, total, idProduto);
            }
        }
    }

Her main class is very underdeveloped and there is not enough context in her question to know what she would turn into. Yet here’s an example of something:

package principal;

import dao.Conexao;
import dao.TotalProdutoDAO;
import model.TotalProduto;
import java.sql.Connection;
import java.sql.SQLException;

public class TotalProdutoMain {

    public static void main(String[] args) throws SQLException {
        // Lê o id do produto desejado.
        int produtoId = Integer.parseInt(args[0]);

        // Cria e usa o DAO.
        double total;
        try (Connection con = Conexao.abrirConexao()) {
            TotalProdutoDao dao = new TotalProdutoDAO(con);
            total = dao.totalProduto(produtoId);
        }

        // Mostra o resultado.
        System.out.println(total);        
    }    
}

Note that I had to put the connection management on main. This is not good, but without knowing more about the context where the TotalProdutoDAO will be used and not even know what exists in the code of its class DConexao, is what we can do for now. There is also not enough context to know what would be the best way to treat SQLException, but whatever it is, it definitely wasn’t the way you were doing it.

-1

I managed to solve the problem. Follow the code.

package Model;

public class MTotalProduto {

    private String codigoBarra;
    private double totalProduto;
    private int produtoId;

    public MTotalProduto() {
    }

    public MTotalProduto(String codigoBarra, double totalProduto, int produtoId) {
        this.codigoBarra = codigoBarra;
        this.totalProduto = totalProduto;
        this.produtoId = produtoId;
    }

    public String getCodigoBarra() {
        return codigoBarra;
    }

    public void setCodigoBarra(String codigoBarra) {
        this.codigoBarra = codigoBarra;
    }

    public double getTotalProduto() {
        return totalProduto;
    }

    public void setTotalProduto(double totalProduto) {
        this.totalProduto = totalProduto;
    }

    public int getProdutoId() {
        return produtoId;
    }

    public void setProdutoId(int produtoId) {
        this.produtoId = produtoId;
    }

    @Override
    public String toString() {
        return "MTotalProduto{" + "codigoBarra=" + codigoBarra + ", totalProduto=" + totalProduto + ", produtoId=" + produtoId + '}';
    }

}

package DAO;

import Model.MTotalProduto;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class DTotalProduto {

    private Connection con;

    public DTotalProduto(Connection con) {

        setCon(con);

    }

    public Connection getCon() {

        return con;

    }

    public void setCon(Connection con) {

        this.con = con;
    }

    public String salvar(MTotalProduto tot) {

        String sql = "insert into estoque.total_produto values(?,?,?)";

        try {

            PreparedStatement ps = getCon().prepareStatement(sql);
            ps.setString(1, tot.getCodigoBarra());
            ps.setDouble(2, tot.getTotalProduto());
            ps.setInt(3, tot.getProdutoId());

            if (ps.executeUpdate() > 0) {

                return "Total Salvo com sucesso!";

            } else {

                return "Erro ao Salvar Total de Produtos!";

            }

        } catch (SQLException e) {

            return e.getMessage();

        }

    }

    public void totalProduto(MTotalProduto tp) {

        ResultSet rs = null;

        try {

            PreparedStatement ps = getCon().prepareStatement("SELECT total FROM estoque.total_produto where produto_id = ?");

            ps.setInt(1, tp.getProdutoId());
            rs = ps.executeQuery();

            while (rs.next()) {

                tp.setTotalProduto(rs.getDouble("total"));

            }

        } catch (SQLException e) {

            e.printStackTrace();

        }

    }

}


package Principal;

import DAO.DConexao;
import DAO.DTotalProduto;
import Model.MTotalProduto;
import java.sql.Connection;

public class TotalProdutoMain {

    public static void main(String[] args) {

        Connection con = DConexao.abrirConexao();
        MTotalProduto tp = new MTotalProduto();
        DTotalProduto dtp = new DTotalProduto(con);

       tp.setProdutoId(1);
       dtp.totalProduto(tp);
       tp.setTotalProduto(tp.getTotalProduto() + 1);

        System.out.println(tp);

    }

}

Browser other questions tagged

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