Retornar dados do BD usando List/ArrayList – Java – java banco-de-dados postgresql

Pergunta:


Estou com um problema, montei uma tabela dinâmica no PostgreSQL e preciso imprimir as linhas da mesma, realizando um método em Java, cujo início já está pré-estabelecido. Que seria com um List simples tendo como parâmetro as datas de início e fim.

Segue o código pré-estabelecido:

public void printReport(Date initialDate, Date endDate) {
          List<Sale> sales = getSales(initialDate, endDate);
          ...
}

A saída precisa ser por exemplo: Loja01;100;100;50;0;250.
Porém não sei como acessar a coluna e a linha da loja passando por todos os dados.

Eu ja tenho um metodo que imprime da seguinte forma. Exemplo: Loja01 com 3 vendas (100,00 visa; 55,00 visa; 200,00 master) ira imprimir:
Loja01; visa; 155 // na outra linha
Loja01;master;200;
Segue codigo em java:

    public void printReport (Date initialDate, Date endDate){

        List<Sale> sales = getSales (initialDate, endDate);

        for (Sale s:sales){

            Store st = s.getStore(); // Recupera a Loja

            CreditCard cc = s.getCreditCard(); // Recupera o Cartão

            System.out.println(st.getNome() + ";" + cc.getName() + ";" + s.getValor());
        }
}

Imagem dos registros da tabela

Tabelas criados no BD

Autor da pergunta Lucas Esbegue

Resposta :

Primeiro, iniciamos com uma classe que representa uma venda. Essa classe é imutável, veja os motivos nessa outra resposta minha:

public final class Sale {
    private final String storeNome;
    private final int visa;
    private final int master;
    private final int diners;
    private final int amex;

    public Sale(String storeName, int visa, int mster, int diners, int amex) {
        this.storeName = storeName;
        this.visa = visa;
        this.master = master;
        this.diners = diners;
        this.amex = amex;
    }

    public String getStoreNome() {
        return storeNome;
    }

    public int getVisa() {
        return visa;
    }

    public int getMaster() {
        return master;
    }

    public int getDiners() {
        return diners;
    }

    public int getAmex() {
        return amex;
    }

    public int getTotal() {
        return visa + master + diners + amex;
    }

    @Override
    public String toString() {
        return storeNome + ";"
                + visa + ";" + master + ";" + diners + ";" + amex + ";" + getTotal();
    }
}

Feito isso, vou pegar emprestado dessa outra resposta uma classe que representa parâmetro de conexão:

import java.sql.DriverManager;
import java.sql.SQLException;

public class ParametrosDeConexao {

    private final String url;
    private final String usuario;
    private final String senha;

    public BaseDeDados(String url, String usuario, String senha) {
        this.url = url;
        this.usuario = usuario;
        this.senha = senha;
    }

    public Connection conectar() throws SQLException {
        return DriverManager.getConnection(url, usuario, senha);
    }
}

Você vai ter que criar uma instância desta classe e mantê-la em algum lugar (pode ser uma variável estática) para poder conectar no banco de dados. A definição da URL, do usuário e da senha dependerá de qual será o seu banco de dados.

Por fim, podemos fazer a classe que acessa o banco de dados:

public class SaleDAO {

    private static final String SALES_BY_DATES_SQL = ""
            + "SELECT store_nome, visa, master, diners, amex "
            + "FROM Sale "
            + "WHERE date >= ? AND date <= ?";

    private final ParametrosDeConexao params;

    public SaleDAO(ParametrosDeConexao params) {
        this.params = params;
    }

    public List<Sale> getSales(Date startDate, Date endDate) {
        try (
            Connection c = params.conectar();
            PreparedStatement ps = c.prepareStatement(SALES_BY_DATES_SQL);
        )
        {
            ps.setDate(1, startDate);
            ps.setDate(2, endDate);
            try (ResultSet rs = ps.executeQuery()) {
                List<Sale> sales = new ArrayList<>();
                while (rs.hasNext()) {
                    Sale s = new Sale(
                            rs.getString("store_nome"),
                            rs.getInt("visa"),
                            rs.getInt("master"),
                            rs.getInt("diners"),
                            rs.getInt("amex"));
                    sales.add(s);
                }
                return sales;
            }
        }
    }
}

O código acima se preocupa em fechar os recursos adequadamente com a ajuda do compilador.

O código acima presume que o Date contenha também a informação das horas. Portanto se você colocar que o endDate for no dia 10/10/2018 00:00:00, ele não pegará a venda feita às 09:00 do dia 10/10/2018. Se não deseja esse comportamento, deixe um comentário aqui nessa resposta. Uma alternativa para isso seria trabalhar com a classe LocalDate ou LocalDateTime.

Observe que omiti o campo total na SQL e na classe Sale. O motivo é que ele sempre é a soma de visa, master, diners e amex, e portanto não precisaria ser lido do banco de dados e nem armazenado em memória. Se for realmente esse o caso, você poderia até removê-lo da tabela.

    public List<Sale> getSales (Date startDate, Date endDate  ){

        Conection con = //de alguma forma vc pega conexao com o banco

        Statement stmt = con.createStatement();

         List<Sale> sales = new ArrayList<>();

        //aqui você recebe um objeto ResultSet com todos os elementos
        //da tabela ales:

        ResultSet rs = stmt.executeQuery("SELECT * FROM sales s WHERE  s.date BETWEEN ? AND ? ");

           stmt.setDate(1, new java.sql.Date( startDate.getTime() )) ;
           stmt.setDate(2, new java.sql.Date(endDate.getTime() ));

        //para percorrer o resultset, faca:

        while(rs.next()) {

           Sale sale = new Sale();

          //pega o valor da coluna nome, de cada linha:
          sale.setStoreName ( rs.getString("store_nome") ) ;
          sale.setVisa( rs.getString("visa") );
          sale.setMaster( rs.getString("master") ) ;
          sale.setDiners ( rs.getString("diners") );
          sale.setAmex ( rs.getString("amex") );
          sale.setTotal ( rs.getDouble("total") );

          sales.add(sale);

    }

   return  sales;

 }// end getSales

CLASS

public class  Sale {

         //por questões didáticas coloquei como String a maioria.

          private String storeName;
          private String visa ;
          private String master ;
          private String diners;
          private String amex ;
          private Double total;


     //getts e setts

}

MÉTODO:

public void printReport(Date initialDate, Date endDate) {
          List<Sale> sales = getSales(initialDate, endDate);//chamando getSales
          ...
}

Para imprimir os dados separados por ;, considerando a busca dos dados do banco de dados feito pelo colega ai em cima
Depois que voce buscou os dados do seu banco de dados ou outro, E tem os dados em uma coleção no java(ArrayList), é só iterar o array assim:

      public void printReport(Date initialDate, Date endDate) {
        List<Sale> sales = getSales(initialDate, endDate);//chamando getSales
        StringBuilder sb = new StringBuilder();
        for(Sales sale: sales){
        sb.append(sale.getStoreName() + ";" + sale.getVisa() + ";"+sale.getMaster() + ";" + sale.getDiners() + ";" + sale.getAmex() + ";" + sale.getTotal());


    }
}
System.out.println(sb.toString());

pode ficar mais fácil ainda se voce sobrescrever o metodo toString da classe Sales

 @override
 public String toString(){
  return storeName+";"+visa+";"+master+";"+dinners+";"+amex+";"+total;
 }

Então no for voce faria:

for(Sales sale: sales){
   sb.append(sale.toString());


  }

Edit: Considerar o objeto Store como atributo da classe Sale (Trechos de código de outras respostas nessa pergunta)

Classe Store.

public class Store{
    private int id;
    private String name;
    //gets and sets
}

Classe Sale

public class  Sale {

     //por questões didáticas coloquei como String a maioria.

      private Store store;
      private String visa ;
      private String master ;
      private String diners;
      private String amex ;
      private Double total;


 //getts e setts
 } 

Um exemplo do Select que traria os dados do BD

private static final String SALES_BY_DATES_SQL = ""
        + "SELECT store.name store_name, store.id store_id, visa, master, diners, amex "
        + "FROM Sale, Store "
        + "WHERE date >= ? AND date <= ?"
        + " and sale.store_id = store.id";

Método que recupera dados do BD

public List<Sale> getSales(Date startDate, Date endDate) {
    try (
        Connection c = params.conectar();
        PreparedStatement ps = c.prepareStatement(SALES_BY_DATES_SQL);
    )
    {
        ps.setDate(1, startDate);
        ps.setDate(2, endDate);
        try (ResultSet rs = ps.executeQuery()) {
            List<Sale> sales = new ArrayList<>();
            while (rs.hasNext()) {
                Sale s = new Sale(
                        //carregando o objeto store.
                        Store store = new Store();
                        store.setId(rs.getInt("store_id"));
                        store.setName(rs.getString("store_name"));
                        sale.setStore(store);

                        rs.getInt("visa"),
                        rs.getInt("master"),
                        rs.getInt("diners"),
                        rs.getInt("amex"));
                sales.add(s);
            }
            return sales;
        }
    }
}

Depois pra criar o layout:

for(Sales sale: sales){
        sb.append(sale.getStore().getName() + ";" + sale.getVisa() + ";"+sale.getMaster() + ";" + sale.getDiners() + ";" + sale.getAmex() + ";" + sale.getTotal());


}

ou:

 @override
 public String toString(){
  return getStore().getName()+";"+visa+";"+master+";"+dinners+";"+amex+";"+total;
 }

Edit: Considerando que os dados já estão vindo certos do banco de dados:

método que formata a impressão:

public StringBuilder formatarLayout(ArrayList<Sales> sales){
StirngBuilder sb = new StringBuilder();
    for(Sales sale: sales){
        sb.append(sale.getStore().getName() + ";" + sale.getVisa() + ";"+sale.getMaster() + ";" + sale.getDiners() + ";" + sale.getAmex() + ";" + sale.getTotal());


    }

    return sb;

}

método printReport

public void printReport(Date initialDate, Date endDate) {
          List<Sale> sales = getSales(initialDate, endDate);
          //isso ja retorna seus dados formatados
          String  layout = formatarLayout(sales).toString();
          // agora pode fazer o que quiser com eles
}

Fonte

Related Posts:

Qual a diferença entre AppCompatActivity e Activity? – android android-activity
Pergunta: Qual a diferença da AppCompatActivity para Activity ? A partir de qual versão a AppCompatActivity foi adicionada ao Android? Autor da pergunta Luhhh A diferença reside ...
Como abreviar palavras em PHP? – php string
Pergunta: Possuo informações comuns como nome de pessoas e endereços, e preciso que elas contenham no máximo 30 caracteres sem cortar palavras. Exemplo: 'Avenida Natalino João Brescansin' ...
Qual é a finalidade de um parêntese vazio numa declaração Lambda? – c# expressões-lambda característica-linguagem
Pergunta: Criei um exemplo de uma declaração Lambda sem argumentos, entretanto, estou com duvidas referente a omissão do parêntese vazio () na declaração. Veja o exemplo: class ...
Boas práticas para URI em API RESTful – api rest restful
Pergunta: Estou com dúvida em relação às URIs de alguns recursos da api que estou desenvolvendo. Tenho os recursos projetos e atividades com relação 1-N, ...
Dúvidas sobre a integração do MySQL com Java – java mysql netbeans
Pergunta: Estou criando um sistema no NetBeans, utilizando a linguagem Java e o banco de dados MySQL. Escrevi o seguinte código para realizar a conexão ...
Qual é a finalidade da pasta Model do framework Inphinit? – php inphinit
Pergunta: No Inphinit micro-framework existe a pasta Model que fica dentro da pasta application, e nela é onde ficam as classes, mas eu estou muito ...
Uso do ‘@’ em variáveis – javascript typescript coffeescript
Pergunta: Vejo em algumas linguagens que compilam para javascript, como TypeScript e CoffeeScript, o uso do @ em variáveis, como também, casos em que o ...
Qual tamanho máximo um arquivo JSON pode ter? – json arquivo
Pergunta: Vou dar um exemplo para conseguir explicar minha duvida: Preciso recuperar informação de imagens vindas de uma API, esse banco de imagens me retorna JSON's ...
O que é Teste de Regressão? – terminologia engenharia-de-software testes
Pergunta: Na matéria de Teste de Software o professor abordou um termo chamado Teste de Regressão, isto dentro da disciplina de teste de software. Sendo ...
O que é um construtor da linguagem? – php característica-linguagem
Pergunta: Em PHP, já li e ouvi várias vezes a respeito dos Construtores da Linguagem. Os casos que sempre ouvi falar deles foi em casos ...
Função intrínseca para converter numérico para string – cobol
Pergunta: Estou a tentar saber se existe alguma função intrínseca do COBOL para converter um data numérico para string sem precisar usar a cláusula REDEFINES: ( ...
Porque usar implements? – java android
Pergunta: Qual a diferença entre usar btn.setOnClickListener(new OnClickListener() { e public class MainActivity extends Activity implements OnClickListener{ Estive fazendo um curso de Android e meu professor falou que ...
O que é XHTML e quando deve ser usado? – html xml xhtml
Pergunta: O que eu sei é que o XHTML precisa ser XML válido. Isso implica, por exemplo, que todas as tags precisam ser fechadas. Por ...
Uma placa aceleradora de vídeo pode melhorar o desempenho não-gráfico? [fechada] – desempenho
Pergunta: Para desenvolver em Ruby on Rails, eu utilizo aqui uma máquina virtual do VirtualBox com Ubuntu Server 14.04 sem interface gráfica instalada. Recentemente descobri uma ...
Concat() VS Union() – c# .net
Pergunta: Qual a diferença entre Concat() e Union() ? Quando usar Concat() e quando usar Union() ? Somente pode ser usado em list ? ...

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *