Web Service - Como fazer um select no banco de dados para mostrar uma coleção de objetos?

Olá pessoal do GUJ,

Estou há tempos tentando encontrar a solução para este tópico que iniciei agora, como fazer um select no banco de dados para mostrar uma coleção ou array.
Já procurei em todo o GUJ, mas não encontro a solução para este meu problema.

Para fim de teste fiz um WebService que faz CRUD. Com ele eu consigo fazer o INSERT para p/ o Banco de Dados, mas os SELECTs não funcionam. Por exemplo o meu método q eu qro mostra tudo o que tem no banco de dados getListaTodosProdutos(); ->deêm uma olhada neste método por favor.
Abaixo está o exemplo:
Esta é a minha classe Produto.

package org.ws;

import java.io.Serializable;

/**
 *
 * @author AndrePush
 */
public class Produto implements Serializable {

    private static final long serialVersionUID = 1L;
    private Integer codigo;
    private String descricao;
    private String marca;
    private int quantidade;
    private int valor;

    public Produto() {
    }

    public Produto(Integer codigo) {
        this.codigo = codigo;
    }

    public Produto(Integer codigo, String descricao, String marca, int quantidade, int valor) {
        this.codigo = codigo;
        this.descricao = descricao;
        this.marca = marca;
        this.quantidade = quantidade;
        this.valor = valor;
    }

    /**
     * @return the codigo
     */
    public int getCodigo() {
        return codigo;
    }

    /**
     * @param codigo the codigo to set
     */
    public void setCodigo(int codigo) {
        this.codigo = codigo;
    }

    /**
     * @return the descricao
     */
    public String getDescricao() {
        return descricao;
    }

    /**
     * @param descricao the descricao to set
     */
    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    /**
     * @return the marca
     */
    public String getMarca() {
        return marca;
    }

    /**
     * @param marca the marca to set
     */
    public void setMarca(String marca) {
        this.marca = marca;
    }

    /**
     * @return the quantidade
     */
    public int getQuantidade() {
        return quantidade;
    }

    /**
     * @param quantidade the quantidade to set
     */
    public void setQuantidade(int quantidade) {
        this.quantidade = quantidade;
    }

    /**
     * @return the valor
     */
    public int getValor() {
        return valor;
    }

    /**
     * @param valor the valor to set
     */
    public void setValor(int valor) {
        this.valor = valor;
    }

    @Override
    public String toString() {
        return "DataBase[codigo= " + codigo + ", descricao="+descricao+"," +
                "marca="+marca+", quantidade="+quantidade+", valor=" + valor +"]";
    }
}

Logo abaixo minha classe que implementa o SEI ou interface e nesta eu tbm coloquei a comunicação com o banco de dados.


/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.ws;

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

import java.util.ArrayList;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;

import java.util.List;

/**
 *
 * @author AndrePush
 */
@WebService()
public class AtacadoInformaticaWs {

    private static final String URL_BASEDADOS =
            "jdbc:postgresql://localhost:5432/COMERCIO";
    private static final String USUARIO = "postgres";
    private static final String SENHA = "pushandre26";
    private Connection con;
    private Statement stmt;
    private ResultSet rs;
    String sql;
    //Instancia do objeto produto
    Produto produto;

    @WebMethod(operationName = "compraProduto")
    public String compraProduto(@WebParam(name = "descricao") String descricao) {

        try {
            Class.forName("org.postgresql.Driver");
            con = DriverManager.getConnection(
                    URL_BASEDADOS, USUARIO, SENHA);

            stmt = con.createStatement();


            sql = ("SELECT descricao,marca,quantidade,valor FROM PRODUTO WHERE"
                    + " descricao " + produto.getDescricao());
            stmt.execute(sql);
            // Se existe o produto compra-lo
            while (rs.next()) {
                produto.setDescricao(rs.getString(1));
                produto.setMarca(rs.getString(2));
                produto.setQuantidade(rs.getInt(3));
                produto.setValor(rs.getInt(4));
            }
            rs = stmt.executeQuery(sql);
        } catch (Exception e) {
            e.getMessage();
        }
        try {

            con.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return compraProduto(compraProduto(descricao));

    }
    //Listar todos os objetos do banco de dados

    @WebMethod(operationName = "getListaProdutoGeral")
    public ArrayList<String> getListaProdutoGeral() {
        //TODO write your implementation code here:
        //  String dados="";
        try {
            Class.forName("org.postgresql.Driver");

            con = DriverManager.getConnection(URL_BASEDADOS, USUARIO, SENHA);

            stmt = con.createStatement();

            sql = ("SELECT *FROM PRODUTO");
            //Consultar http://www.guj.com.br/posts/list/113128.java
            rs = stmt.executeQuery(sql);

            while (rs.next()) {

                produto.setCodigo(rs.getInt("codigo"));
                produto.setDescricao(rs.getString("descricao"));
                produto.setMarca(rs.getString("Marca"));
                produto.setQuantidade(rs.getInt("quantidade"));
                produto.setValor(rs.getInt("valor"));
            }
            
        } catch (Exception e) {
            e.getMessage();
        }
        return getListaProdutoGeral();

    }

    /**
     * Operação de serviço web
     */
    @WebMethod(operationName = "cadastrarProduto")
    public String cadastrarProduto(
            //PRODUTO
            @WebParam(name = "codigo") int codigo,
            @WebParam(name = "descricao") String descricao,
            @WebParam(name = "marca") String marca,
            @WebParam(name = "quantidade") int quantidade,
            @WebParam(name = "valor") int valor) {
        //TODO write your implementation code here:
        try {

            Class.forName("org.postgresql.Driver");
            con = DriverManager.getConnection(
                    URL_BASEDADOS, USUARIO, SENHA);

            stmt = con.createStatement();

            sql = ("INSERT INTO PRODUTO(codigo,descricao,marca,"
                    + "quantidade,valor)VALUES('" + codigo + "','" + descricao
                    + "','" + marca + "','" + quantidade + "','" + valor + "')");
            stmt.execute(sql);
            while (rs.next()) {
                //Produto
                produto.setCodigo(rs.getInt(1));
                produto.setDescricao(rs.getString(7));
                produto.setMarca(rs.getString(3));
                produto.setQuantidade(rs.getInt(4));
                produto.setValor(rs.getInt(5));
            }
            //rs = stmt.executeQuery(sql);
            stmt.executeUpdate(sql);
            con.commit();
            stmt.close();
        } catch (Exception e) {
            return e.getMessage();

        }
        return cadastrarProduto(codigo, descricao, marca, quantidade, valor);
    }

 
}

Como eu já disse eu consigo fazer o INSERT mas no SELECT não funciona quanto eu quero mostrar todos os produtos que estão no banco de dados.A aplicação parece que entra em um loop eterno ou não consegue achar o banco de dados, dai eu tenho que abortar a pesquisa no BD.
Por favor preciso de ajuda, tenho que entregar este projeto no serviço.

aguardo respostas.

Olá Amigo, antes de tentar expor uma funcionalidade como serviço, que tal prestar atenção no design da sua aplicação ? Primeiro você colocou chamada à base de dados diretamente no “controller” e isso é um anti-pattern. Dê uma olhadinha no Pattern DAO. Não vou citar no momento Repository do Eric Evans, pois pode ser muito complexo para você entender nesse estágio.

Procure uma literatura sobre padrões de desenvolvimento, pois seu design está bastante problemático, e procure usar JPA ao invés de JDBC direto. Isso dói os olhos de ver :stuck_out_tongue:

Com relação ao WebService, para você melhorar isso, dê uma espiada nas annotations do JAXB, que irão fazer de forma correta o parse de XML para POJOs.

[]'s

Felipe

Você notou que seu método getListaProdutoGeral(); tem, como retorno, uma chamada a ele próprio?? Em outras palavras, você notou que seu método sempre fica chamando a ele próprio, ao invés de retornar a lista, propriamente dita??

[]´s

Kenobi obrigado pela atenção. Bom, eu conheço o Pattern DAO, mas na correria com o projeto eu fiz tudo no controler mesmo. :roll:
Qnto ao JPA, JAXB vou dar uma olhada. Estou reformulando o código quanto funcionar certinho eu posto ak novamente.

asaudate verdade, caraca meu!nubb… :lol:

vou refazer essa lista!

vlws…

Kenobi e asaudate eu não fiz grandes adaptações no código mas consegui retornar tudo do banco.
Assim eu tenho o metodo getListaProdutoGeral(), nele eu não estava carregando a lista :lol: segundo asaudate. Contudo ficou assim:

public ListcompraProduto(@WebParam(name = “descricao”)
String descricao){

  [b]  ArrayList<Produto>pd=new ArrayList<Produto>();[/b] //carrego a lista

      try {
       ...carrega driver...
       ....conecta no banco...

        
        stmt = con.createStatement();

         sql = ("SELECT quantidade,valor FROM PRODUTO WHERE"
                 + " descricao= " + produto+ "')");

          rs = stmt.executeQuery(sql);
         // Se existe o produto compra-lo
         while (rs.next()) {
            [b] Produto prod = new Produto();[/b]
             prod.setCodigo(rs.getInt("codigo"));
             prod.setDescricao(rs.getString("descricao"));
             prod.setMarca(rs.getString("marca"));
             prod.setQuantidade(rs.getInt("quantidade"));
             prod.setValor(rs.getInt("valor"));
            [b] pd.add(prod);[/b] //adiciono o obj nela
         }
      stmt.execute(sql);
   return pd; //simples eu q estava batendo kbeça!!

agora pessoal como que eu faço para retornar apenas uma linha do banco?
Por exemplo: SELECT quantidade, valor FROM Produto WHERE Produto;
Eu já fiz isso com o mesmo código de listar todos os produtos só que retorna vazio, alguém pode me explicar como que eu faço?
Obs.: Fiz uma só tabela para explicar.

vlws…
aguardo respostas.

do mesmo jeito que vc retorna uma lista com varios itens… retorne uma lista com apenas 1 objeto

Como foi dito antes… pq não dar uma melhorada no codigo, recomendo usar o Hibernate, implemente um DAO… vai facilitar sua vida uns 150%.

Ok, eu consegui ak, tranquilo agora.
Sim cara, assim que eu apresentar o projeto e o gerente de projetos gostar eu implemento PADRÕES.
Eu fiz assim:

sql = ("SELECT quantidade,valor FROM PRODUTO WHERE"
                     + " descricao= '" + descricao+ "'");

              rs = stmt.executeQuery(sql);
             // Se existe o produto compra-lo
             while (rs.next()) {
                 Produto prod = new Produto();
                 prod.setQuantidade(rs.getInt("quantidade"));
                 prod.setValor(rs.getInt("valor"));
                 pd.add(prod);
             }
return pd;

Agora só falta somar estas colunas e termino. :wink:
auguma opnião pessoal ?

Qnto eu conseguir somar as colunas volto ak para fecharem este fórum.

vlw pessoal.

Olá pessoal, avancei no projeto já implentei o padrão DAO no projeto, agora está um pouco mais “bonitinho”.
Estou com o seguinte problema estou implementando um sistema de compra com Web Services (SOAP-implementação JAX-WS).
Fiz 3 tabelas (PRODUTO,ESTOQUE,COMPRA) no banco de dados POSTGRE utilizando JDBC só para testar.
Mas me deparei com um problema de calcular o valor total da compra pois tenho o seguinte model.

Class ProdutoM:codigo,descricao,valor,marca
Class EstoqueM:codigo,quantidade
Class CompraM:codigo,total

Eu preciso através do select SQL guardar no total a multiplicação de valor pela quantidade, como é possível?
Outra coisa o cliente tem acesso só ás variáveis do parâmetro do método?
Sabemos que no WS temos interfaces de acesso para o desacoplamento e práticas da POO. Com gostaria que vc’s dessem essa força para mim.

vlws…