Pegar dados de todas as tabelas

6 respostas
crpablo

Fala galera...

Meu problema é o seguinte:

Preciso pegar todos os dados de todas tabelas que tenho em meu BD para passar isso como objeto e depois serializar isso em XML com XStream. Depois de serializar, isso será novamente lido e persistido em outro BD com EJB3.

Estou "pegando" os dados das tabelas com JDBC, porém desta forma eu teria que saber quantas colunas cada tabela tem para poder dar um rs.getString().

Segue um trecho do cód.
public static void main(String[] args) throws Exception {

		PreparedStatement p = null;
		Connection conn = getConnection();

		for (int i = 0; i < nomeTabela.length; i++) {

			System.out.println("Tabela: " + nomeTabela[i]);

			p = conn.prepareStatement("select * from " + nomeTabela[i]);
			ResultSet rs = p.executeQuery();

			while (rs.next()) {
				System.out.println(rs.getString(1));
				System.out.println(rs.getString(2));
				System.out.println(rs.getString(3));
				System.out.println(rs.getString(4));
			}
			p.close();
			conn.close();
		}
}

A idéia é passar isso para um List pra depois serializar todos os dados.

Alguém pode dar uma "luz" ae.... uma idéia ou alguma forma mais prática de fazer isso?

Abraço

6 Respostas

Emerson_Macedo

Cara, se realmente você precisa fazer essa doidera toda começe pela classe DatabaseMetaData.

Muitos SGBDs oferecem a possibilidade de retornar os dados em XML. Dê uma olhada na documentação do fornecedor do seu SGBD

Adolfo_Rodrigues

Você precisa mesmo disso? Você está querendo migrar dados?
Quanto ao seu problema com o rs.“getString(x)”, tente fazer alguma coisa do tipo:

ResultSet rs = p.executeQuery();
for (int i = 0; rs.isAfterLast(); i++) {
    rs.next();
    System.out.println(rs.getString(i));
}
crpablo

emerleite:
Cara, se realmente você precisa fazer essa doidera toda começe pela classe DatabaseMetaData.

Muitos SGBDs oferecem a possibilidade de retornar os dados em XML. Dê uma olhada na documentação do fornecedor do seu SGBD

Cara, já tinha visto isso antes mas não tem nada na doc do Derby.

Valeu.

crpablo

Adolfo Rodrigues:
crpablo:

Preciso pegar todos os dados de todas tabelas que tenho em meu BD para passar isso como objeto e depois serializar isso em XML com XStream. Depois de serializar, isso será novamente lido e persistido em outro BD com EJB3.

Você precisa mesmo disso? Você está querendo migrar dados?
Quanto ao seu problema com o rs.“getString(x)”, tente fazer alguma coisa do tipo:

ResultSet rs = p.executeQuery(); for (int i = 0; rs.isAfterLast(); i++) { rs.next(); System.out.println(rs.getString(i)); }

Fala Adolfo…

Fiz da forma que vc falou mas gerou essa exception:

Exception in thread "main" java.sql.SQLException: The 'isAfterLast' method is only allowed on scroll cursors. at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source) at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Unknown Source) at org.apache.derby.impl.jdbc.Util.newEmbedSQLException(Unknown Source) at org.apache.derby.impl.jdbc.EmbedResultSet.checkScrollCursor(Unknown Source) at org.apache.derby.impl.jdbc.EmbedResultSet.checkRowPosition(Unknown Source) at org.apache.derby.impl.jdbc.EmbedResultSet.isAfterLast(Unknown Source) at ExportaBD.main(ExportaBD.java:53)

Abraço cara…

Adolfo_Rodrigues

Eu não conheço muito bem a API do ResultSet, então devo ter te passado algum código furado. Abra a API e veja algum método para fazer o que deseja. O que eu quis dizer quando sugeri o código é que você pode dar o rs.getString(i) passando um índice (no caso é o i).
Aí vai mais um chute (e feio, pois não tenho como consultar a API, testar e melhorar agora):

int i = 0; while (rs.next()) { System.out.println(rs.getString(i)); i++; }

PS - A solução é bem ruim. Escreva a sua real necessidade (migração de dados simplesmente?) que o pessoal aqui pode te dar idéias melhores.

crpablo
Adolfo Rodrigues:
Eu não conheço muito bem a API do ResultSet, então devo ter te passado algum código furado. Abra a API e veja algum método para fazer o que deseja. O que eu quis dizer quando sugeri o código é que você pode dar o rs.getString(i) passando um índice (no caso é o i). Aí vai mais um chute (e feio, pois não tenho como consultar a API, testar e melhorar agora):
int i = 0;
while (rs.next()) {  
    System.out.println(rs.getString(i));
    i++;
}

PS - A solução é bem ruim. Escreva a sua real necessidade (migração de dados simplesmente?) que o pessoal aqui pode te dar idéias melhores.

Blz Adolfo...

Cara eu dei uma pesquisada em algumas API's e cheguei a esse cód.:

package persistencia;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;


public class TabelasBD {

	public DatabaseMetaData getDatabaseMetaData() {

		DatabaseMetaData dbmd = null;

		try {
			dbmd = getConnection().getMetaData();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return dbmd;
	}

	// Retorna uma lista com todas as tabelas do schema TESTE
	@SuppressWarnings("unchecked")
	public List getNomeTabelas() {

		ResultSet rsPegaTabelas = null;
		List listaTabelas = new ArrayList();

		try {
			rsPegaTabelas = getDatabaseMetaData().getTables(null, "TESTE",
					"%", null);

			while (rsPegaTabelas.next()) {
				listaTabelas.add(rsPegaTabelas.getObject(3));
			}

		} catch (SQLException e) {
			e.printStackTrace();
		}
		return listaTabelas;
	}

	// Retorna uma lista com os dados das tabelas
	@SuppressWarnings("unchecked")
	public List getDadosTabelas() {

		PreparedStatement ps = null;
		ResultSet rsPegaDados = null;
		List listaDados = new ArrayList();

		List listaTabelas = getNomeTabelas();
		String nomeTabela = "";

		for (int i = 0; i < listaTabelas.size(); i++) {

			nomeTabela = (String) listaTabelas.get(i);
			System.out.println("Tabela: " + nomeTabela);

			try {
				ps = getConnection().prepareStatement(
						"SELECT * FROM " + nomeTabela);

				rsPegaDados = ps.executeQuery();

				int qntColunas = getQuantidadeColunas(nomeTabela);
				System.out.println(" Colunas atual: " + qntColunas);

				while (rsPegaDados.next()) {
					for (int j = 0; j < qntColunas; j++) {
						listaDados.add(rsPegaDados.getString(j + 1));
						System.out.println("Coluna " + (j + 1) + " "
								+ rsPegaDados.getString(j + 1));
					}
				}
				ps.close();
				getConnection().close();

			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return listaDados;
	}

	// Retorna uma lista com o nome de todas as colunas da tabela
	@SuppressWarnings("unchecked")
	public List getNomeColunas(String nomeTabela) {

		List nomeColunas = new ArrayList();
		Statement stmt;
		ResultSet rsNomeColunas = null;
		ResultSetMetaData rsmd = null;
		int qtdColunas;

		try {
			stmt = getConnection().createStatement();
			rsNomeColunas = stmt.executeQuery("SELECT * FROM " + nomeTabela);
			rsmd = rsNomeColunas.getMetaData();

			qtdColunas = rsmd.getColumnCount();

			for (int i = 0; i < qtdColunas; i++) {
				nomeColunas.add(rsmd.getColumnName(i + 1));
				System.out.println("Nome Coluna: " + rsmd.getColumnName(i + 1));
			}

		} catch (SQLException e) {
			e.printStackTrace();
		}
		System.out.print("\n");
		return nomeColunas;
	}

	// Retorna a quantidade de colunas na tabela
	public int getQuantidadeColunas(String nomeTabela) {

		Statement stmt = null;
		ResultSet rsQtdColunas = null;
		ResultSetMetaData rsmd = null;
		int quantidadeColunas = 0;

		try {
			stmt = getConnection().createStatement();
			rsQtdColunas = stmt.executeQuery("SELECT * FROM " + nomeTabela);
			rsmd = rsQtdColunas.getMetaData();
			quantidadeColunas = rsmd.getColumnCount();
			System.out.println("Quantidade Colunas: " + quantidadeColunas);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		System.out.print("\n");
		return quantidadeColunas;
	}

	// Cria e retorna uma nova conexão com o BD
	private Connection getConnection() {

		Connection conn = null;

		try {
			Class.forName("org.apache.derby.jdbc.EmbeddedDriver").newInstance();
			conn = DriverManager
					.getConnection("jdbc:derby:H:/Projetos/XXX;user=XXX;password=XXX");
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}

		return conn;
	}

	public static void main(String[] args) throws Exception {

		TabelasBD exp = new TabelasBD();
		
		exp.getDadosTabelas();

		System.out.println("FIM!!!");
	}
}

A principio isso tá resolvendo meus problemas...

Eu to pegando a quantidade de colunas através do DatabaseMetaData e passando isso para o método pegaDados(), assim tem um for que percorre todas colunas da tabela atual... Funcionou beleza...

Abraço cara, valeu pelos toques...

Criado 20 de dezembro de 2007
Ultima resposta 21 de dez. de 2007
Respostas 6
Participantes 3