Xml,java e bd-como fazer

OI pessoal.
É o seguinte Eu tou a fazer um projecto de fim-d-curso em que tenho duas bases de dados em que preciso passar dados de uma para a outra.Pediram-m que usa-s um documento xml para mapear os campos e assim ser mais facil interligar os dados, o meu problema é k nao sei como fazer isso…Nao sei como fazer o xml nem como usa-lo no java e colocar a passar os dados…Eu fiz um doc xml mas penso k nao esta bem, ora vejam:

<?xml version="1.0" encoding="UTF-8"?> ststamp familia stock pv1 fornec peso imagem design lang1 url no nome fax telefone nascimento email pass???? produtcs_id produtcs_model produtcs_quantity produtcs_price manufacturers_id(???) produtcs_weigth produtcs_image produtcs_description language_id products_url customers_id customers_firstname+customers_lastname(??) customers_fax customers_telephone customers_dob customers_email_adress customers_password </destino

em que o campo 1 da tabela da bd de origem corresponde ao campo 1 da tabela da bd de destino e assim sucessivamente…
ja pesquisei sobre xml mas nao encontro nada k me ilucide…
Alguém me pode ajudar?é um pouco urgente e muito importante…
obrigada.
Bjs

Oi tituga,

Para ajudar acho que vc deveria ler algum tutorial sobre construção de arquivos xml, tem vários na internet, este é um deles [url]http://www.zvon.org/xxl/XMLTutorial/General_por/contents.html[/url]. O arquivo xml tem que estar bem formado (construido respeitando as regras), caso contrário, ficará difícil de ler o conteúdo deste arquivo.

Quando o arquivo estiver sem erros, você poderá utilizar alguns componentes free feitos em java para ajudar na leitura do xml. Este [url]http://xstream.codehaus.org/[/url] é um componente facil de utilizar, existem outros além deste.

 Para montar o xml você (acho que deveria ter escrito tu, descupe meu português rsrssr) tem que ter o fluxo bem claro para atingir o objetivo. Ao ler o xml que você enviou fiquei com várias dúvidas:

 a) Qual o nome dos dois banco de dados?
 b) Qual a url para se obter a conexão com os bancos de dados?
 c) Percebi que o nomes e a estruturas das tabelas de origem são diferentes das tabelas de destino, é assim mesmo?
 d) Tem que ficar tudo em um único arquivo xml? (não que tenha que estar separados mas seria bom saber desta possibilidade)
 c) Entendi que o código java irá ler o arquivo xml e irá montar um instrução sql a partir das colunas descritas nas tags origem e executar uma outra instrução sql montada a partir das colunas descritas nas tags destino, é isto mesmo?

 Já  ia me esquecendo uma das formas de saber se o seu arquivo xml está "bem formado" é abri-lo em no navegador. Se o navegador abrir e mostrar o conteúdo sem nenhuma mensagem de erro é porque está tudo bem. Existem alguns editores de xml free na internet.

 Bom, acho que pra começar é isso.

System.out.println( “Um java abraço!” );

Ola
Acho k nao expliquei correctamente o objetivo…
o xml é apenas para o mapeamento de dados, a ligação e respectivas instruções sql serao feitas em java, no meu programa (ide eclipse).
portanto a url de conexao esta no programa, mas preciso dela no xml???
as duas bases de dados sao: uma é do oscommer e a outra de um programa de gestão, dai os nomes das tabelas de origem e destino serem diferentes.
acho k é isso…
qq coisa perguntem…e desculpem se nao me conseguir explicar, é k isto é um pouco novo pra mim :oops:
bjs

Oi tituga,

Humm.........se a url vai ficar no código java então realmente não precisa ficar no xml.

Outras dúvidas sobre o que você enviou são as seguintes:

a) Como é que se determina a tabela destino?
    .Por exemplo: Qual é o destino do conteúdo da tabela "st"? Pelo nome não dá porque os nomes das tabelas destino são bem diferentes (produtcs, produtcs_description, customers).

b) Notei que você colocou alguns pontos de interrogação na frente de algumas "colunas" você poderia comentar sobre isso?

[quote]pass???
manufacturers_id(???)
customers_firstname+customers_lastname(??)[/quote]

c) Tem alguma tabela de origem cujo conteúdo será atualizado em mais de uma tabela destino?

[]'s

oi fantomas.
Resondendo as tuas perguntas:

a) a tabela destino é sempre do lado do programa de gestao pro oscommerce. se tavas a falar de codigo nao sei :oops: isso era o k precisava saber :oops:
tava a pensar colocar tipo o campo1 de origem corresponde ao campo1 de destino, mas tb nao sei, se puderes ajudar… :oops:

b)sao algumas duvidas minhas em relação aos campos a usar…

c)nao um conteudo vai apenas para um tabela de destino, apenas tenho é um campo de uma tabela de origem k corresponde a dois campos de uma tabela de destino.

foi-me pedido k usa-s xerces…como faço??? :oops:

bjs

ve se este novo codigo xml esta mais correcto:

<?xml version="1.0" encoding="UTF-8"?>
<tabela2 id="tabela-2" nome="st">
     <coluna id="coluna-1" nome="ststamp"/>
     <coluna id="coluna-2" nome="familia"/>  
         <coluna id="coluna-3" nome="stock"/>  
         <coluna id="coluna-4" nome="pv1"/>  
         <coluna id="coluna-5" nome="fornec"/>  
         <coluna id="coluna-6" nome="peso"/>  
         <coluna id="coluna-7" nome="imagem"/>  
     <coluna id="coluna-8" nome="design"/>
     <coluna id="coluna-9" nome="lang1"/>
     <coluna id="coluna-10" nome="url"/>
</tabela2>
<tabela2 nome="produtcs" origem="tabela-2">
     <coluna nome="produtcs_id"           valor="coluna-1"/>
     <coluna nome="produtcs_model"        valor="coluna-2"/>
     <coluna nome="produtcs_quantity"     valor="coluna-3"/>
     <coluna nome="produtcs_price"        valor="coluna-4"/>
     <coluna nome="manufacturers_id"      valor="coluna-5"/>
     <coluna nome="produtcs_weigth"       valor="coluna-6"/>
     <coluna nome="produtcs_image"        valor="coluna-7"/>
</tabela2>

<tabela3 nome="produtcs_description" origem="tabela-2">
     <coluna nome="produtcs_id"           valor="coluna-1"/>
     <coluna nome="produtcs_description"  valor="coluna-8"/>
     <coluna nome="language_id"           valor="coluna-9"/>
     <coluna nome="produtcs_url"          valor="coluna-10"/>  
</tabela3>

</destino

bjs

Oi tituga,

No último xml que vc enviou tem uma tag com problemas, ela está na segunda linha debaixo para cima:
Está faltando o caracter ">", com este ajuste ficaria deste jeito -> </destino>

[]'s

sim tem razão, nao tinha reparado…
e de resto, a sintaxe esta bem?
pode-m ajudar com o xerces?

Oi totuga,

Então....eu nunca utilizei o xerces. Há um tempo que dei uma lida sobre este componente e se não me falha a memória ele não é muito simples de utilizar comparando com alguns outros que existem disponíveis. Me parece que ele é uma boa opção quando você precisa ler um xml gigantesco.

Eu conheço um pouquinho do componente DOM4J [url]http://www.dom4j.org/download.html[/url], acredito que seja bem mais fácil de utilizar e a documentação parece ser mais detalhada.

Mas...voltando ao seu problema é o seguinte: 

a) Fiz alguns ajustes no xml que você enviou (APENAS COMO SUGESTÃO) e ficou como segue abaixo:
<?xml version="1.0" encoding="UTF-8"?>
<tabela destino="produtcs" origem="st">
	<coluna destino="produtcs_id" origem="ststamp" />
	<coluna destino="produtcs_model" origem="familia" />
	<coluna destino="produtcs_quantity" origem="stock" />
	<coluna destino="produtcs_price" origem="pv1" />
	<coluna destino="manufacturers_id" origem="fornec" />
	<coluna destino="produtcs_weigth" origem="peso" />
	<coluna destino="produtcs_image" origem="imagem" />
</tabela>

<tabela destino="produtcs_description" origem="st">
	<coluna destino="produtcs_id" origem="ststamp" />
	<coluna destino="produtcs_description" origem="design" />
	<coluna destino="language_id" origem="lang1" />
	<coluna destino="produtcs_url" origem="url" />
</tabela>
    Achei que deste jeito o arquivo ficou menor e mais simplificado.

    OBS. Só utilize esta idéia se REALMENTE você achar que vai resolver o seu problema.

    b) Abaixo segue um código para te mostar como funciona o DOM4J, ele apenas obtem o conteúdo do arquivo e depois imprime.
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class Tituga {


	public static Document readXmlDocument(String fileName) {
		Document document = null;

		try {
			SAXReader reader = new SAXReader();

			document = reader.read(fileName);
		} catch (DocumentException e) {
			e.printStackTrace();
		}

		return document;
	}
	
	@SuppressWarnings("unchecked")
	public static void printXmlDocument(Document document) {
		Element root = document.getRootElement();

		// Obtém a lista de tabelas
		List<Element> rootElements = root.elements();
		
		for (Element tabela : rootElements) {

			StringBuilder sbRoot = new StringBuilder(0);
			
			sbRoot.append("TABELA DESTINO -> ");
			sbRoot.append(tabela.attributeValue("destino"));
			sbRoot.append("  TABELA ORIGEM -> ");
			sbRoot.append(tabela.attributeValue("origem"));
			
			print(sbRoot.toString());
			
			// Obtém a lista de colunas da tabela
			List<Element> colunas = tabela.elements();

			for (Element coluna : colunas) {
				
				StringBuilder sbCol = new StringBuilder(0);
				
                sbCol.append("    COLUNA DESTINO -> "+coluna.attributeValue("destino"));
                sbCol.append("    COLUNA ORIGEM -> "+coluna.attributeValue("origem"));
				
				print(sbCol.toString());
			}
			
			print("----------------------------------------------------------------");
		}
	}
	
	public static void print(String sb) {
		System.out.println(sb.toString());
	}

	public static void main(String[] args) {
		Document doc = Tituga.readXmlDocument("c://portugal//atualizacoes.xml");
		
		Tituga.printXmlDocument(doc);
	}
}
Coloquei o nome da classe de Tituga.java

Para você testar este código basta você fazer o download do DOM4J e adicionar o jar dom4j-1.6.1.jar no projeto. Não esqueça de alterar o local do arquivo xml -> [quote]Document doc = Tituga.readXmlDocument("c://portugal//atualizacoes.xml");[/quote]

Espero que isto tudo lhe ajude em alguma coisa.

[]'s

ah algum problema de as tabelas origem e destino estarem e bd diferentes???
a ligação e uso das tabelas pra instruçoes sql sao feitas como?

Obrigada, ja me ajudou imenso :wink:

Oi Tituga,

Que bom  que vc está conseguindo  :D 

 Respondendo sua primeira pergunta, as tabelas origem e destino podem estar em BDs diferentes sim. Para obter os dados das tabelas origem você utiliza a CONEXÃO do bd A e para atualizar os dados nas tabelas destino você utiliza a CONEXÃO do bd B.

 O que vc quiz dizer com isto, você poderia detalhar?

 [quote]a ligação e uso das tabelas pra instruçoes sql sao feitas como?[/quote]

  acho que não entendi direito.

[]'s

oi
como usa as instruçoes sql, insert, select e update indo buscar os parametros ao xml???

Oi Tituga,

 Infelizmente ainda não ficou claro para mim sua dúvida  :( .

 Se entendi bem a sua situação acho que falta fazer o seguinte:

 1) Obter a conexão com o banco de dados "ORIGEM".
 2) Obter a conexão com o banco de dados "DESTINO".
 3) Montar a instrução sql a partir do xml para obter os dados na origem.
 4) Montar a instrução sql a partir do xml para atualizar os dados no destino.
 5) Executar a instrução sql montada no passo 3 (ler dados na origem).
 6) Executar a instrução sql montada no passo 4 (atualizar dados no destino).
 7) Fechar as conexões com os bancos.
 8) Encerrar a execução.

 Obs. Os pontos citados acima é uma macro visão dos passos a seguir.

 Você está se referindo a qual ponto dos citados acima?

Um java abraço

Oi fantomas
Desculpe so responder agora, tive com alguns problemas.
Eu neste momento tou a fazer a conexao com as bd da seguinte forma:

public Connection CriarLigacao(String Driver, String URL, String User, String Password, String Sep)
{
try
{
if(Ligacao!=null || Stat!=null) FecharLigacao();
this.sep=Sep;

		Class.forName(Driver);	//Driver da base de dados
        Ligacao = DriverManager.getConnection(URL, User, Password);	//Ligação à base de dados

        dbmd=Ligacao.getMetaData();
		Stat=Ligacao.createStatement();
		return Ligacao;
	}
	catch (Exception e)
	{
		e.printStackTrace();
		return null;
	}
}

esta função é chamada na shell.
minha duvida ta se atraves desta conexao o xml funciona na mesma?
como monto e executo a instruçao sql a partir so xml?(seus pontos 3,4,5 e 6).

Ja agora como instalo o dom4j? :oops:

Obrigada e desculpe

Oi Tituga,

Para instalar o dom4j [url]http://www.dom4j.org[/url] faça o seguinte:

1) Fazer o download [url]http://www.dom4j.org/download.html[/url]

2) Se você estiver utilizando a IDE eclipse.
    a) Abra o projeto.
    b) Abra a janela de propriedades do projeto.
    c) Inclua o arquivo jar dom4j-1.6.1.jar no projeto utilizando o botão "Add External Jars...".

 Esta é uma das opções, caso você tenha uma pasta lib dentro do seu projeto você poderia copiar o jar dom4j-1.6.1.jar para esta pasta e incluir-lo no projeto seguindo os passos acima utilizando o botão "Add jars..."

 Leia o GUIDE e faça alguns teste pequenos antes de utilizar para valer.

[]'s

Oi Tituga,

Para instalar o dom4j [url]http://www.dom4j.org[/url] faça o seguinte:

1) Fazer o download [url]http://www.dom4j.org/download.html[/url]

2) Se você estiver utilizando a IDE eclipse.
    a) Abra o projeto.
    b) Abra a janela de propriedades do projeto.
    c) Inclua o arquivo jar dom4j-1.6.1.jar no projeto utilizando o botão "Add External Jars...".

 Esta é uma das opções, caso você tenha uma pasta lib dentro do seu projeto você poderia copiar o jar dom4j-1.6.1.jar para esta pasta e incluir-lo no projeto seguindo os passos acima utilizando o botão "Add jars..."

 Leia o GUIDE e faça alguns testes pequenos antes de utilizar para valer.

[]'s

Oi Tituga,

Segue abaixo mais uma versão do xml (SUGESTÃO) que descreve as tabelas.

<?xml version="1.0" encoding="UTF-8"?>
<base-dados>
	<tabela destino="customers" origem="cl">
		<coluna destino="customers_id" origem="id" primary-key="true" />
		<coluna destino="customers_firstname" origem="nome" />
		<coluna destino="customers_fax" origem="fax" />
		<coluna destino="customers_telephone" origem="telefone" />
		<coluna destino="customers_dob" origem="nascimento" />
		<coluna destino="customers_email_adress" origem="email" />
		<coluna destino="customers_password" origem="pass" />
	</tabela>

	<tabela destino="produtcs" origem="st">
		<coluna destino="produtcs_id" origem="ststamp" primary-key="true" />
		<coluna destino="produtcs_model" origem="familia" />
		<coluna destino="produtcs_quantity" origem="stock" />
		<coluna destino="produtcs_price" origem="pv1" />
		<coluna destino="manufacturers_id" origem="fornec" />
		<coluna destino="produtcs_weigth" origem="peso" />
		<coluna destino="produtcs_image" origem="imagem" />
	</tabela>

	<tabela destino="produtcs_description" origem="st">
		<coluna destino="produtcs_id" origem="ststamp" primary-key="true" />
		<coluna destino="produtcs_description" origem="design" />
		<coluna destino="language_id" origem="lang1" />
		<coluna destino="produtcs_url" origem="url" />
	</tabela>
</base-dados>

A novidade é que eu adicionei a propriedade primary-key na tag tabela.

Segue abaixo a código da classe que utiliza o xml para atualizar as tabelas.

package xml;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class Tituga {
	private Connection cnn = null;

	@SuppressWarnings("unchecked")
	public void processar(String arquivo) {

		this.conectar();
		
		if( this.cnn != null ) {
			Document doc = this.obterXmlDocument(arquivo);
	
			Element root = doc.getRootElement();
	
			// Obtém a lista de tabelas
			List<Element> rootElements = root.elements();
	
			for (Element tabela : rootElements) {
	
				String origem = tabela.attributeValue("origem");
				String destino = tabela.attributeValue("destino");
	
				List<String> colunasOrigem = new ArrayList<String>(0);
				List<String> colunasDestino = new ArrayList<String>(0);
				List<String> colunasChaveOrigem = new ArrayList<String>(0);
				List<String> colunasChaveDestino = new ArrayList<String>(0);
	
				// Obtém a lista de colunas da tabela
				List<Element> colunas = tabela.elements();
	
				for (Element coluna : colunas) {
	
					colunasOrigem.add(coluna.attributeValue("origem"));
					colunasDestino.add(coluna.attributeValue("destino"));
	
					if (coluna.attributeValue("primary-key") != null) {
						colunasChaveOrigem.add(coluna.attributeValue("origem"));
						colunasChaveDestino.add(coluna.attributeValue("destino"));
					}
				}
	
				// Construir os objetos para a tabela origem e destino
				Tabela tabelaOrigem = new Tabela(origem, colunasOrigem, colunasChaveOrigem);
				Tabela tabelaDestino = new Tabela(destino, colunasDestino, colunasChaveDestino);
	
				// Processa a atualização das tabelas origem e destino
				this.executar(tabelaOrigem, tabelaDestino);
			}
			
			this.desconectar();
		}
	}

	private List<String> obterValores(ResultSet rs, List<String> colunas) {
		List<String> valores = new ArrayList<String>(0);

		try {
			ResultSetMetaData rsmd = rs.getMetaData();

			for (String coluna : colunas) {
				int i = rs.findColumn(coluna);
				String t = rsmd.getColumnTypeName(i);

				if (t.equals("VARCHAR")) {
					valores.add(Tabela.stringToString(rs.getString(i)));
				} else if (t.equals("NUMERIC") || t.equals("LONG")) {
					valores.add(Tabela.longToString(rs.getLong(i)));
				} else if ( t.equals("DOUBLE") ) {
					valores.add(Tabela.doubleToString(rs.getDouble(i)));
				} else if (t.equals("DATE")) {
					valores.add(Tabela.dateToString(rs.getDate(i)));
				} else if (t.equals("BLOB")) {
					valores.add("null");
				}
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}

		return valores;
	}

	private void executar(Tabela origem, Tabela destino) {

		String query = origem.obterSelect();

		try {
			List<String> valores = null;

			Statement stOrigem = cnn.createStatement();
			Statement stDestino = cnn.createStatement();

			ResultSet rs = stOrigem.executeQuery(query);

			while (rs.next()) {

				valores = this.obterValores(rs, origem.getColunasChave());

				String sql = destino.obterSelectByPrimaryKey(valores);

				ResultSet rsKey = stDestino.executeQuery(sql);

				valores = this.obterValores(rs, origem.getColunas());
				
				// Verificar se a chave já está no destino
				if (rsKey.next()) {
					// Se estiver altera os dados
					sql = destino.obterUpdate(valores);
				} else {
					// Se NÂO estiver insere os dados
					sql = destino.obterInsert(valores);
				}

				stDestino.execute(sql);
			}

			cnn.commit();
			
			rs.close();

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private void conectar() {
		try {
			cnn = DriverManager.getConnection("jdbc:derby:C:\\portugal\\tituga", "admin", "admin");
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	private void desconectar() {
		if (this.cnn != null) {
			try {
				this.cnn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}

	private Document obterXmlDocument(String fileName) {
		Document document = null;

		try {
			SAXReader reader = new SAXReader();

			document = reader.read(fileName);
		} catch (DocumentException e) {
			e.printStackTrace();
		}

		return document;
	}

	public static void print(String sb) {
		System.out.println(sb.toString());
	}

	public static void main(String[] args) {
		Tituga tituga = new Tituga();

		tituga.processar("c://portugal//atualizacoes.xml");
	}
}

O código abaixo é da classe que descreve o objeto que gera as instruções select/update e fornece alguns método auxiliares.

package xml;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class Tabela {
	private String nome = null;
	private List<String> colunas = new ArrayList<String>(0);
	private List<String> colunasChave = new ArrayList<String>(0);

	public Tabela(String nome, List<String> colunas, List<String> colunasChave) {
		this.nome = nome;
		this.colunas = colunas;
		this.colunasChave = colunasChave;
	}
	
	public List<String> getColunas() {
		return this.colunas;
	}
	
	public List<String> getColunasChave() {
		return this.colunasChave;
	}

	public String obterSelect() {
		StringBuilder sb = new StringBuilder(0);

		sb.append("SELECT ");
		sb.append(this.concatenar(this.colunas));
		sb.append(" FROM ");
		sb.append(this.nome);

		return sb.toString();
	}

	public String obterSelectByPrimaryKey(List<String> valores) {
		String result = null;
		
		if (valores != null && valores.size() == this.colunasChave.size()) {
			StringBuilder sb = new StringBuilder(0);

			sb.append(this.obterSelect());
			sb.append(" WHERE ");

			for (int i = 0; i < this.colunasChave.size(); i++) {
				sb.append(" ");
				sb.append(colunasChave.get(i));
				sb.append("=");
				sb.append(valores.get(i));
				sb.append(" AND");
			}

			result = sb.toString();
			result = result.substring(0, result.length() - 3);
		}

		return result;
	}

	public String obterUpdate(List<String> valores) {
		String result = null;

		if (valores != null && valores.size() == this.colunas.size()) {
			StringBuilder sb = new StringBuilder(0);

			sb.append("UPDATE ");
			sb.append(this.nome);
			sb.append(" SET ");
			
			for (int i = 0; i < this.colunas.size(); i++) {
				sb.append(colunas.get(i));
				sb.append(" = ");
				sb.append(valores.get(i));
				sb.append(",");
			}

			result = retirarUltimoCaracter(sb.toString());
		}

		return result;
	}

	public String obterInsert(List<String> valores) {
		StringBuilder sb = new StringBuilder(0);

		sb.append("INSERT INTO ");
		sb.append(this.nome);
		sb.append(" ( ");
		sb.append(this.concatenar(this.colunas));
		sb.append(" ) ");
		sb.append("VALUES ( ");

		for (String valor : valores) {
			sb.append(valor+"'");
		}

		return( retirarUltimoCaracter(sb.toString())+" )");
	}

	private String concatenar(List<String> colunas) {
		StringBuilder sb = new StringBuilder(0);

		for (String coluna : colunas) {
			sb.append(coluna+",");
		}

		return retirarUltimoCaracter(sb.toString());
	}
	
	public static String doubleToString(Double v) {

		String valor = ( v != null ? String.valueOf(v) : "null" );
		
		return valor;
	}
	
	public static String longToString(Long v) {
		
		String valor = ( v != null ? String.valueOf(v) : "null" );
		
		return valor;
	}
	
	public static String stringToString(String v) {
		
		String valor = ( v != null ? "'" + v + "'" : "null" );
		
		return valor;
	}
	
	public static String dateToString(Date v) {
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");		
		
		String valor = ( v != null ? "'" + sdf.format(v) + "'" : "null" );
		
		return valor;
	}
	
	private String retirarUltimoCaracter(String param) {
		return (param.substring(0, param.length() - 1));
	}
}

Criei uma base de dados com o banco Derby (banco de dados Java) e inclui as tabelas descritas no xml, fiz alguns testes e funcionou.

Espero que este código lhe ajude a ter algumas idéias para resolver o problema.

Desculpe se deixei passar algum erro.

System.out.println(“Um java abraço!”);

System.out.println(“Abraços”);

oi.olha so uma pergunta
tu usas-t apenas uma base de dados com tabelas de origem e destino?

Oi Tituga,

A resposta é SIM dava menos trabalho rsrssr. 

Mas para utilizar outra base de dados acho que ficaria fácil, veja a seguir:
	private void executar(Tabela origem, Tabela destino) {

		String query = origem.obterSelect();

		try {
			List<String> valores = null;

			Statement stOrigem = cnnOrigem.createStatement();  // <<<--------------
			Statement stDestino = cnnDestino.createStatement(); // <<<--------------

			ResultSet rs = stOrigem.executeQuery(query);

			while (rs.next()) {

				valores = this.obterValores(rs, origem.getColunasChave());

				String sql = destino.obterSelectByPrimaryKey(valores);

				ResultSet rsKey = stDestino.executeQuery(sql);

				valores = this.obterValores(rs, origem.getColunas());
				
				// Verificar se a chave já está no destino
				if (rsKey.next()) {
					// Se estiver altera os dados
					sql = destino.obterUpdate(valores);
				} else {
					// Se NÂO estiver insere os dados
					sql = destino.obterInsert(valores);
				}

				stDestino.execute(sql);
			}

			cnnDestino.commit(); // <<<---------------
			
			rs.close();

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

Bastaria criar outra conexão com o banco de dados destino e fazer as alterações nas linhas apontadas com setas no código acima.

[]'s

oi fantomas
Tentei compilar o seu exemplo, depois de alterar alguns dados k nao eram iguais claro, mas da-te um erro aqui:

Tabela tabelaOrigem = new Tabela(origem, colunasOrigem, colunasChaveOrigem);
Tabela tabelaDestino = new Tabela(destino, colunasDestino, colunasChaveDestino);

é na “Tabela”, sempre k encontra isto da um erro.
Onde voce criou essa classe???