Galera, sou iniciante e estou levando laço pra retornar um resultset para um webclient (eclipse), estou usando os assistentes do eclipse para gerar o cliente.
A idéia é pegar um resultset e retornar um array pro cliente, estou usando o seguinte código:
publicString[][]getObtemDados()throwsInstantiationException,IllegalAccessException,ClassNotFoundException,SQLException{Connectionconn=null;Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();conn=DriverManager.getConnection("jdbc:odbc:DBCLOUD","sa","123");Statementstm=conn.createStatement();StringSQL="select * from usuarios u ";ResultSetrs=stm.executeQuery(SQL);ResultSetMetaDatarsmd=rs.getMetaData();intcols=rsmd.getColumnCount();ArrayList<String[]>linhas=newArrayList<String[]>();//listade"linhas"while(rs.next()){for(inti=0;i<cols;i++){String[]registro=newString[cols];{registro[i]=rs.getString(i+1);}linhas.add(registro);}}returnlinhas.toArray(newString[linhas.size()][]);}
Recebo o seguinte retorno: [[Ljava.lang.String;@e85825
Eu não deveria receber os campos listados na ordem e tal ? como se fossem uma tabela ? Ou no JSP devo fazer isso no braço ?
Me retornou o seguinte:
[[Ljava.lang.String;@1aa0e3b, [Ljava.lang.String;@18c4a7f, [Ljava.lang.String;@16ee3ec, [Ljava.lang.String;@135da43, [Ljava.lang.String;@8c7be5, [Ljava.lang.String;@11a0d35, [Ljava.lang.String;@1594a88, [Ljava.lang.String;@12c4c57]
Imagino que o retorno esteja correto uma vez que tenho 2 registros com 4 colunas, creio que ele está me listados os dados da tabela nesse formato ai de cima.
Como resolver essa parada ?
valeu !
B
Bruno_Laturner
Que tal pegar os dados dentro dos registros com getNomeDoTipo(numeroDaColunaDaTabela) ou getNomeDoTipo(nomeDaColunaDaTabela)
B
Bruno_Laturner
Ah, desculpe, você está trabalhando com ResultSetMetadata, não ResultSets.
Você tem certeza que quer retornar uma matriz de Strings? Por que não uma Lista de Objetos que representam os dados da tabela?
mario.fts
Bruno Laturner:
Ok, perguntas:
Você tem certeza que quer retornar uma matriz de Strings? Por que não uma Lista de Objetos que representam os dados da tabela?
Essa era a próxima pergunta que eu ia fazer… uhauhauhauahuah
R
raschefelipe
Bruno Laturner e mario.fts,
Na realidade não sei como fazer e qual a diferença, entendi que essa era a maneira correta.
Tentei de outras formas, mas qd passava como retorno um resultset o eclipse “gritava” dizendo que nao era compativel e tal. Imagino que é pelo fato de eu estar trabalhando com web service.
Vocês poderiam por gentileza me indicar a forma correta de fazer isso ?
Eu instanciando essa classe a partir de uma classe de teste, e a partir dele eu criava o JSP com a ajuda do assistente do eclipse.
B
Bruno_Laturner
Há várias maneiras de resolver isso. A mais comum é criar uma classe-espelho da tabela do banco, isto é, cada atributo mapeia para uma coluna. Os tipos de cada coluna também são mapeados para os tipos dos atributos.
Instancie a classe, coloque os dados obtidos de cada rs.get* nos seus atributos respectivos, e adicione o objeto à lista. retorne uma List.
R
raschefelipe
Bruno, obrigado pelo apoio.
tentei assim, o eclipse nao indicou erro mas nao consegui pegar o retorno…
ArrayList<Usuario>usu=aut.getObtemDados();System.out.println(usu[0]);//aqui dá pauSystem.out.println(usu[1]);//aqui dá pau
publicArrayList<Usuario>getObtemDados()throwsInstantiationException,IllegalAccessException,ClassNotFoundException,SQLException{Connectionconn=null;Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();conn=DriverManager.getConnection("jdbc:odbc:DBCLOUD","sa","123");Statementstm=conn.createStatement();StringSQL="select * from usuarios u ";ResultSetrs=stm.executeQuery(SQL);ArrayList<Usuario>lista=null;while(rs.next()){//String[] registro = new String[cols]; Stringnome=rs.getString("nome");Stringsenha=rs.getString("senha");Usuariousuario=newUsuario(nome,senha);lista.add(usuario);}returnlista;}
List<Usuario> usu = aut.getObtemDados();
System.out.println(usu.get(0)); // usu é uma classe, não um array
System.out.println(usu.get(1)); // olhe o toString funcionando
// ou
System.out.println(usu); // para imprimir todos, usa o toString também.
publicList<Usuario>getObtemDados()throwsInstantiationException,IllegalAccessException,ClassNotFoundException,SQLException{// novoConnectionconn=null;Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();conn=DriverManager.getConnection("jdbc:odbc:DBCLOUD","sa","123");Statementstm=conn.createStatement();StringSQL="select * from usuarios u ";ResultSetrs=stm.executeQuery(SQL);List<Usuario>lista=newArrayList<Usuario>();// use as interfaces e não as classes concretas.while(rs.next()){Stringnome=rs.getString("nome");Stringsenha=rs.getString("senha");Usuariousuario=newUsuario(nome,senha);lista.add(usuario);}returnlista;}
R
raschefelipe
Bruno, obrigado !
Matou a pau…nao ficou exatamente igual, mas funcionou perfeitamente:
Código que retorna o array
publicArrayList<Usuario>getObtemDados()throwsInstantiationException,IllegalAccessException,ClassNotFoundException,SQLException{// novo Connectionconn=null;Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();conn=DriverManager.getConnection("jdbc:odbc:DBCLOUD","sa","123");Statementstm=conn.createStatement();StringSQL="select * from usuarios u ";ResultSetrs=stm.executeQuery(SQL);ArrayList<Usuario>lista=newArrayList<Usuario>();// use as interfaces e não as classes concretas. while(rs.next()){Stringnome=rs.getString("nome");Stringsenha=rs.getString("senha");Usuariousuario=newUsuario(nome,senha);lista.add(usuario);}returnlista;}
saberia me dizer como eu poderia deixar esse método mais genérico ? do tipo…idenpendente do número de colunas ele me retorna o objeto “Usuario” no return ?
tentei mas deu erro pra caramba… teria de ser em cima desse método:
publicArrayList<Usuario>getObtemDados()throwsInstantiationException,IllegalAccessException,ClassNotFoundException,SQLException{Connectionconn=null;Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();conn=DriverManager.getConnection("jdbc:odbc:DBCLOUD","sa","123");Statementstm=conn.createStatement();StringSQL="select * from usuarios u ";ResultSetrs=stm.executeQuery(SQL);ArrayList<Usuario>lista=newArrayList<Usuario>();while(rs.next()){Stringnome=rs.getString("nome");Stringsenha=rs.getString("senha");Usuariousuario=newUsuario(nome,senha);lista.add(usuario);}returnlista;}
mario.fts
Dúvida:
vc não sabe antecipadamente o número de colunas?
R
raschefelipe
Exato,
Estou forçando a barra, mas a idéia é que eu possa utilizar independente do numero do colunas q tenha o select passado como parametro.
Sacou ?
B
Bruno_Laturner
raschefelipe:
Bruno,
saberia me dizer como eu poderia deixar esse método mais genérico ? do tipo…idenpendente do número de colunas ele me retorna o objeto “Usuario” no return ?
Olha, se for preguiça de mapear uma tabela p/ um classe, use uma IDE que tenha um gerador de entidades, ela vai ir até o banco e criar as classes, o acesso aos dados. Netbeans tem um.
Fora isso, vá até o banco, veja quais são as colunas da tabela lá, e para as colunas que você quiser buscar, coloque o nome delas no lugar do * no select.
Digo isso por que não há muita utilidade p/ buscas genéricas sem dados definidos. Só dá pra trabalhar com o conhecido.
mario.fts
é… neste caso vc vai ter que usar strings mesmo… não da pra fazer com objetos.
R
raschefelipe
Galera,
Obrigado !
Entendi a idéia, vou criar no braço para ter mais controle.