Olá, existe algum modo em que eu possa retornar tudo que houver registrado em uma tabela?
eu estou realizando uma partição do meu programa onde o usuário pode fazer backu de todos os dados de uma tabela, e salvar num arquivo .txt…mas eu nao faço ideia de como selecionar tudo, e nao somente um campo.
pq qdo vc consulta o bacno pelo java, vc deve informar o campo, por exemplo: String nome=retorno_consulta.getString("campo1");
Considerando que retorno_consulta é um ResultSet JDBC é possível identificar os metadados. Usando seu exemplo ficaria algo tipo:
[code]
String nomeColuna, valor;
int tipo,tamanho,numeroColunas;
ResultSetMetaData rsmd = retorno_consulta.getMetaData();
numeroColunas = rsmd.getColumnCount();
while(retorno_consulta.next()) {
for(int col=1;col <= numeroColunas; col++) {
// Detalhes de cada coluna... se quiser usar...
nomeColuna = rsmd.getColumnName(col);
tipo = rsmd.getColumnType(col);
tamanho = rsmd.getPrecision(col);
// Conforme o tipo você trata do jeito que achar melhor, aqui peguei como string mesmo
switch (tipo) {
case Types.NUMERIC:
case Types.DECIMAL:
case Types.BIGINT:
case Types.DOUBLE:
case Types.FLOAT:
case Types.REAL:
case Types.SMALLINT:
case Types.INTEGER:
case Types.TINYINT:
case Types.DATE:
case Types.TIMESTAMP:
case Types.TIME:
case Types.CHAR: // etc....
valor = retorno_consulta.getString(nomeColuna);
}
}
}[/code]
[quote=jamirdeajr]Considerando que retorno_consulta é um ResultSet JDBC é possível identificar os metadados. Usando seu exemplo ficaria algo tipo:
[code]
String nomeColuna, valor;
int tipo,tamanho,numeroColunas;
ResultSetMetaData rsmd = retorno_consulta.getMetaData();
numeroColunas = rsmd.getColumnCount();
while(retorno_consulta.next()) {
for(int col=1;col <= numeroColunas; col++) {
// Detalhes de cada coluna... se quiser usar...
nomeColuna = rsmd.getColumnName(col);
tipo = rsmd.getColumnType(col);
tamanho = rsmd.getPrecision(col);
// Conforme o tipo você trata do jeito que achar melhor, aqui peguei como string mesmo
switch (tipo) {
case Types.NUMERIC:
case Types.DECIMAL:
case Types.BIGINT:
case Types.DOUBLE:
case Types.FLOAT:
case Types.REAL:
case Types.SMALLINT:
case Types.INTEGER:
case Types.TINYINT:
case Types.DATE:
case Types.TIMESTAMP:
case Types.TIME:
case Types.CHAR: // etc....
valor = retorno_consulta.getString(nomeColuna);
}
}
}[/code]
[/quote]
desculpe, mas nao entendi como funciona isso…
tem como me dar um exemplo em cima de uma tabela? como essa demonstrada abaixo:
tabela: pecas_placas_mae
colunas: Nome varchar(50),Descrição varchar(300),imagem_url varchar(50), nota int, id int(primary key)
id: 1 -> Nome: P5Sd2
Descrição: Socket: lga775\n
etc…etc…
Imagem: http://foto.com.br/foto.jpg
nota: 7
id: 2 -> Nome: etc…
Descrição: etc…
Imagem: etc…
nota: etc…
id: 3 -> Nome: etc…
Descrição: etc…
Imagem: etc…
nota: etc…
id: 4 -> Nome: etc…
Descrição: etc…
Imagem: etc…
nota: etc…
Veja se assim serve de exemplo. Vai imprimir o conteúdo da tabela inteira, linha a linha com o nome do campo e valor (similar ao exemplo que você passou)
[code] String nomeColuna;
String valor;
int tipo;
int tamanho;
int numeroColunas;;
String tabela = “pecas_placas_mae”;
//Omitida a parte onde foi feita a conexão JDBC
Statement stmt = conexao.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
retorno_consulta = stmt.executeQuery("SELECT * FROM "+tabela);
// Pega os metadados da tabela (detalhes da estrutura)
ResultSetMetaData rsmd = retorno_consulta.getMetaData();
numeroColunas = rsmd.getColumnCount();
// Varre todos os registros
while(retorno_consulta.next()) {
System.out.println("----------------------------------");
//Vai de coluna em coluna
for(int col=1;col <= numeroColunas; col++) {
nomeColuna = rsmd.getColumnName(col);
valor = retorno_consulta.getString(nomeColuna);
System.out.println(nomeColuna + ":" + valor);
}
System.out.println("----------------------------------");
}[/code]
esse getColumnName pega o valor da coluna?
a isso pega o nome da coluna, desculpa…entao se eu tiver mil registors na tablela, e 3 colunas, faria 3 fors, 1 pega o id, o outro pega a descriçao, e o terceiro pega por exemplo a url de uma foto
certo?
ou melhor, esse codigo pega tudo que estiver em uma coiluna? entao por exmeplo se eu tiver uma coluna id e nos campos dessa coluna eu tiver os numeros 1,2,3,4,5,6,7,8,9,10
esse coidog ira me retornar esses numeros?
getColumnName pega o nome da coluna Ex. ‘imagem_url’,
getString pega o valor Ex. ‘http://foto.com.br/foto.jpg’ ,
O exemplo que passei irá imprimir algo assim:
[code]----------------------------------
id: 1
Nome: P5Sd2
Descrição: Socket: lga775
Imagem_url: http://foto.com.br/foto.jpg
nota: 7
id: 2
Nome: etc…
Descrição: etc…
Imagem_url: etc…
nota: etc…
id: 3
Nome: etc…
Descrição: etc…
Imagem_url: etc…
nota: etc…
id: 4
Nome: etc…
Descrição: etc…
Imagem_url: etc…
nota: etc…
----------------------------------[/code]
Temos dois loops, um para os registros (while) e dentro dele outro para as colunas (for…) . Não é preciso mais nenhum loop.
entendi…mas e se eu quisesse armazenar tudo isso em por exemplo um array string, como poderia fazer?
desculpe por usar seu tempo, é que estou meio perdido em jdbc, rsrsrs
pq na vdd, eu devo enviar tudo que eu pegar na tabela e enviar para um arquivo txt, que ja fiz todo o FIleChooser onde o usuario escolhe o diretorio, e etc…
ai tudo que eu pegar nessa consulta, eu iria escrever no .txt, por isso tenho que pegar tudo…e tenho uma classe que faz todas as consultas no banco, outra que precisa receber esses valores atraves de um metodo da classe que consulta o bd retornando uma string array por exemplo
pensei, e se no for, eu pusesse ifs:
if(nomeColuna.equals("nome"))
{
nome[col]=retorno_consulta.getString(nomeColuna);
}
if(nomeColuna.equals("descricao")
{
descrição[col]=retorno_consulta.getString(nomeColuna);
}
if(nomeColuna.equals("imagem")
{
imagem[col]=retorno.consulta.getString(nomeColuna);
}
Não teria problemas em armazenar num array de Strings, mas não seria muito prático, já que pelo que entendi você quer gerar um arquivo de backup, certo?
O Array de Strings necessitaria de tudo armazenado na memória.
O que eu faria…
Abriria um arquivo texto e gravaria uma linha por registro, com os campos separados por vírgula. Ou até mesmo já formataria pra que seja um script SQL tipo assim (ficaria um backup pronto pra restaurar):
INSERT INTO nome_da_tabela VALUES (1,'P5Sd2','lga775','http://foto.com.br/foto.jpg',7 );
Para isso seria necessário colocar as aspas simples nos campos tipo CHAR, mas não é complicado.
entao, da uma olhada nesse script acima ve se isso funcionaria
e a array ficaria na memória somente no momento em que eu verifico, pq eu poderia criar ele ja dentro do try{
e ele sumiria após sua utilização
Não… porque você precisa indexar pelas linhas e não as colunas (campos), certo?
Teria que colocar um contador e usar ele para cada coluna, e dimensionar o array com o total de número de linhas da tabela antes do loop.
tipo assim:
[code]int linhas = 0;
while(retorno_consulta.next()) {
if(nomeColuna.equals("nome"))
nome[linhas]=retorno_consulta.getString(nomeColuna);
... etc
linhas++;
}[/code]
Espera mais uns minutos que já posto um exemplo gravando em arquivo TXT…
de uma olhada, fiz isso, porém, como eu poderia retornar esses 5 array?
public void consultaTabelaInteira(String tabela)
{
String backup;
Statement consulta;
ResultSet retorno;
ResultSetMetaData rsmd;
int colunas;
String comando="SELECT * FROM "+tabela;
Conecta_BD.carregarDriver();
Connection conn=Conecta_BD.carregarServidor();
try
{
consulta=conn.createStatement();
retorno=consulta.executeQuery(comando);
rsmd=retorno.getMetaData();
colunas=rsmd.getColumnCount();
String nome_coluna;
String[] nome=new String[colunas];
String[] descrição=new String[colunas];
String[] imagem=new String[colunas];
int[] id=new int[colunas];
int[] nota=new int[colunas];
while(retorno.next())
{
for(int col=1;col<=colunas;col++)
{
nome_coluna=rsmd.getColumnName(col);
if(nome_coluna.equals("id"))
{
id[col]=retorno.getInt("id");
}
if(nome_coluna.equals("nome"))
{
nome[col]=retorno.getString("nome");
}
if(nome_coluna.equals("descricao"))
{
descrição[col]=retorno.getString("descricao");
}
if(nome_coluna.equals("imagem"))
{
imagem[col]=retorno.getString("imagem");
}
if(nome_coluna.equals("nota"))
{
nota[col]=retorno.getInt("nota");
}
}
}
}
catch(Exception e)
{
}
}
Exemplo gravando um script SQL a partir de uma tabela…
[code]
String nomeColuna;
String valor;
int tipo;
int tamanho;
int numeroColunas;;
String tabela = “pecas_placas_mae”;
retorno_consulta = stmt.executeQuery("SELECT * FROM "+tabela);
// Pega os metadados da tabela (detalhes da estrutura)
ResultSetMetaData rsmd = retorno_consulta.getMetaData();
numeroColunas = rsmd.getColumnCount();
String nomeArquivo = “teste.sql”;
File arquivoSaida = new File(nomeArquivo+".sql");
BufferedWriter saida = new BufferedWriter(new FileWriter(arquivoSaida));
StringBuffer linha = new StringBuffer("");
// Varre todos os registros
while(retorno_consulta.next()) {
linha.delete(0, linha.length());
linha.append("INSERT INTO "+tabela+" VALUES(");
//Vai de coluna em coluna
for(int col=1;col <= numeroColunas; col++) {
nomeColuna = rsmd.getColumnName(col);
tipo = rsmd.getColumnType(col);
valor = retorno_consulta.getString(nomeColuna);
// A partir da 2a coluna coloca vírgula
if(col > 1)
linha.append(",");
// Se for string inclui aspas simples
// Simplificado, somente tratando Numerico ou string.. se necessário trate outros tipos
if(tipo == Types.CHAR || Types.VARCHAR) {
linha.append("'");
linha.append(valor);
linha.append("'");
} else {
linha.append(valor);
}
}
linha.append(")");
saida.write(linha.toString());
saida.newLine();
}
saida.close();[/code]
[quote=guilherme.dio]de uma olhada, fiz isso, porém, como eu poderia retornar esses 5 array?
[code]
public void consultaTabelaInteira(String tabela)
{
String backup;
Statement consulta;
ResultSet retorno;
ResultSetMetaData rsmd;
int colunas;
String comando="SELECT * FROM "+tabela;
Conecta_BD.carregarDriver();
Connection conn=Conecta_BD.carregarServidor();
try
{
consulta=conn.createStatement();
retorno=consulta.executeQuery(comando);
rsmd=retorno.getMetaData();
colunas=rsmd.getColumnCount();
String nome_coluna;
String[] nome=new String[colunas];
String[] descrição=new String[colunas];
String[] imagem=new String[colunas];
int[] id=new int[colunas];
int[] nota=new int[colunas];
while(retorno.next())
{
for(int col=1;col<=colunas;col++)
{
nome_coluna=rsmd.getColumnName(col);
if(nome_coluna.equals("id"))
{
id[col]=retorno.getInt("id");
}
if(nome_coluna.equals("nome"))
{
nome[col]=retorno.getString("nome");
}
if(nome_coluna.equals("descricao"))
{
descrição[col]=retorno.getString("descricao");
}
if(nome_coluna.equals("imagem"))
{
imagem[col]=retorno.getString("imagem");
}
if(nome_coluna.equals("nota"))
{
nota[col]=retorno.getInt("nota");
}
}
}
}
catch(Exception e)
{
}
}
[/code][/quote]
Pois é, como te disse, [col] não pode ser usado pois este varia de 1 a 5 (o numero de colunas da tabela) e não tem nada a ver com o número de linhas da tabela (Exemplo, 100).
Por isso falei que teria que colocar um contador de linhas. Só que array precisa ser dimensionado e aí você teria que antes trazer o SELECT COUNT(*) FROM TABELA, dimensionar o array e só então partir para o loop.
Isso poderia consumir muita memória já que teria que armazenar linhas x colunas da tabela no array…
Veja que não existe por exemplo para cada linha da tabela uma imagem[1],imagem[2],… imagem[5]. Cada linha tem somente uma imagem, um nome , um id. O Array tem que ser baseado nas linhas da tabela, ou seja existirão para uma tabela com 100 nomes cadastrados, 100 imagens, 100 ids, etc…
mas o retorno.next() já nao pula para a proxima linha?
entao qdo ele pula pra proxima, o for faz com que eu armazene o nome,descrição,imagem,nota,id
e qdo vou para a proxima linha pelo retorno.next() ele armazena da outra linha
no caso eu só teria que arruma o for para que nao sobreescreva os dados do array
while(retorno.next())
{
if(col>5){col=0;}
nome_coluna=rsmd.getColumnName(col);
if(nome_coluna.equals("id"))
{
id[col]=retorno.getInt("id");
}
if(nome_coluna.equals("nome"))
{
nome[col]=retorno.getString("nome");
}
if(nome_coluna.equals("descricao"))
{
descrição[col]=retorno.getString("descricao");
}
if(nome_coluna.equals("imagem"))
{
imagem[col]=retorno.getString("imagem");
}
if(nome_coluna.equals("nota"))
{
nota[col]=retorno.getInt("nota");
}
col++;
}
a ja vi que esse meu codigo realmente nao serviria mesmo
Entendi, entao só uma coisa, pode me dizer como pular linha no arquivo txt?
e o que significa toString,delete(o,linha.lenght);
[quote=guilherme.dio]Entendi, entao só uma coisa, pode me dizer como pular linha no arquivo txt?
e o que significa toString,delete(o,linha.lenght);[/quote]
-
Em um BufferedWriter o método newLine() grava no arquivo o caracter de pular linha de acordo com o sistema operacional (você poderia usar um também write("\n") se for Windows).
-
toString() é o método que é usado para retornar a String que representa um Objeto. Todas as classes tem esse método, usamos porque precisávamos passar uma String para o método write. Sempre que você manda imprimir um Objeto ele está chamando esse método toString, embora você nem fique sabendo disso.
-
delete(0,linha.lenght()) é o método da Classe StringBuffer que apaga uma faixa de caracteres, no caso estamos apagando do Primeiro até o Último, ou seja limpando inteira.
Agora, porquê usamos o StringBuffer em vez de String? Isso vem da característica da String em Java ser imutável, quando você muda o conteúdo em vez da JVM substituir, ela manda para o lixo uma e cria uma nova. Por isso não é boa prática atribuir Strings dentro de loops, rapidamente o lixo vai encher e dar trabalho pro ‘coletor de lixo’. A recomendação é usar StringBuffer que sabe reaproveitar espaço.