Xml,java e bd-como fazer

38 respostas
T

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

38 Respostas

fantomas

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?

   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!” );

T

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

fantomas

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?

pass???
manufacturers_id(???)
customers_firstname+customers_lastname(??)

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

[]'s

T

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

T

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

fantomas

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

T

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

fantomas

Oi totuga,

Então....eu nunca utilizei o xerces.  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.  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 -> <blockquote>Document doc = Tituga.readXmlDocument("c://portugal//atualizacoes.xml");</blockquote>

Espero que isto tudo lhe ajude em alguma coisa.

[]'s

T

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:

fantomas

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?

 <blockquote>a ligação e uso das tabelas pra instruçoes sql sao feitas como?</blockquote>

  acho que não entendi direito.

[]'s

T

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

fantomas

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

T

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

fantomas

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

fantomas

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

fantomas

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”);

T

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

fantomas

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

T

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???

fantomas

Oi tituga,

Provavelmente é por causa desta linha:

package xml;

Tente adapta-la ao seu projeto para ver se funciona. Se o erro continuar post os detalhes do erro.

[]'s

T

Oi
Nao essa linha ta bem.
o erro é este:

Tabela cannot be resolved to a type.

Nao sei o porque deste erro.POde ajudar?

Entretanto tentei com o seu outro codigo, mudei algumas coisas e ficou assim:

package pt.ConvBD;

import java.util.List;

import org.dom4j.Document;

import org.dom4j.DocumentException;

import org.dom4j.Element;

import org.dom4j.io.SAXReader;

public class xml {

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());  
}

}

O k voce tinha no main eu coloquei na minha shell, aquando faço a ligação.
so k ao correr dao estes erros:

org.dom4j.DocumentException: unknown protocol: c Nested exception: unknown protocol: c

at org.dom4j.io.SAXReader.read(SAXReader.java:484)

at org.dom4j.io.SAXReader.read(SAXReader.java:321)

at pt.ConvBD.xml.readXmlDocument(xml.java:19)

at pt.Interface.Janela$12.widgetSelected(Janela.java:506)

at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:227)

at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:66)

at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:938)

at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3682)

at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3293)

at pt.Interface.Janela.main(Janela.java:161)

Nested exception:

java.net.MalformedURLException: unknown protocol: c

at java.net.URL.(Unknown Source)

at java.net.URL.(Unknown Source)

at java.net.URL.(Unknown Source)

at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(Unknown Source)

at com.sun.org.apache.xerces.internal.impl.XMLVersionDetector.determineDocVersion(Unknown Source)

at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)

at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)

at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)

at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)

at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)

at org.dom4j.io.SAXReader.read(SAXReader.java:465)

at org.dom4j.io.SAXReader.read(SAXReader.java:321)

at pt.ConvBD.xml.readXmlDocument(xml.java:19)

at pt.Interface.Janela$12.widgetSelected(Janela.java:506)

at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:227)

at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:66)

at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:938)

at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3682)

at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3293)

at pt.Interface.Janela.main(Janela.java:161)

Nested exception: java.net.MalformedURLException: unknown protocol: c

at java.net.URL.(Unknown Source)

at java.net.URL.(Unknown Source)

at java.net.URL.(Unknown Source)

at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(Unknown Source)

at com.sun.org.apache.xerces.internal.impl.XMLVersionDetector.determineDocVersion(Unknown Source)

at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)

at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)

at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)

at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)

at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)

at org.dom4j.io.SAXReader.read(SAXReader.java:465)

at org.dom4j.io.SAXReader.read(SAXReader.java:321)

at pt.ConvBD.xml.readXmlDocument(xml.java:19)

at pt.Interface.Janela$12.widgetSelected(Janela.java:506)

at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:227)

at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:66)

at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:938)

at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3682)

at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3293)

at pt.Interface.Janela.main(Janela.java:161)

java.lang.NullPointerException

at pt.ConvBD.xml.printXmlDocument(xml.java:31)

at pt.Interface.Janela$12.widgetSelected(Janela.java:507)

at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:227)

at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:66)

at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:938)

at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3682)

at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3293)

at pt.Interface.Janela.main(Janela.java:161)

sabe o pk disto??

Mt obrigada fantomas tem sido de grand ajuda.
bj

fantomas

Oi tituga,

O primeiro problema que você citou pode ser porque vc não tenha importado a classe Tabela no código onde ela está sendo utilizada. Verifique se na classe onde está ocorrendo o erro existe uma linha assim:

import pacoteA.pacoteB.pacoteC.Tabela;

Onde pacoteA.pacoteB.pacoteC indica o pacote (package) ou os pacotes onde você colocou a classe Tabela.

Acho que eclipse se vc teclar Ctrl+Shift+O na classe que estiver com o erro  ele faz a importação automática para você

O outro problema com a classe XML pode ser que você tenha colocado algum caracter estranho na url onde está localizado o arquivo, para simular o erro eu coloquei um espaço na url.
Document doc = Xml.readXmlDocument("c:// portugal//atualizacoes.xml"); // <-- TEM UM ESPAÇO ANTES DA PALAVRA PORTUGAL

[]'s

T

OI fantomas.

foi erro meu. realmente faltava o import.
mas agora qd tento por a correr da-m o seguint erro :

java.lang.NoClassDefFoundError: org/jpox/enhancer/JPOXEnhancer

nao sei o k é?

Quanto ao outro problema ja ta resolvido tambem, tinhas espaços, resolvi por no c: e assim ficou resolvido.

obrigada voce tem sido d grande ajuda

T

oi
ja adicionei no meu programa.
ele le e imprime o xml mas nao consigo executar as funçoes sql.
da-me o erro:

java.sql.SQLException: Can not issue NULL query.

at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1056)

at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:957)

at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927)

at com.mysql.jdbc.StatementImpl.checkNullOrEmptyQuery(StatementImpl.java:431)

at com.mysql.jdbc.StatementImpl.executeQuery(StatementImpl.java:1257)

at pt.ConvBD.Tituga.executar(Tituga.java:117)

at pt.ConvBD.Tituga.processar(Tituga.java:63)

at pt.Interface.Janela$12.widgetSelected(Janela.java:510)

at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:227)

at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:66)

at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:938)

at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3682)

at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3293)

at pt.Interface.Janela.main(Janela.java:162)

ja ta quase… <img src="//https://cdn.jsdelivr.net/gh/twitter/twemoji@14/assets/72x72/w.pngink.png?v=5" title=":wink:" class="emoji" alt=":wink:">
fantomas

Oi tituga,

Acho que o problema é o seguinte:

Este método deve estar voltando um valor nulo.
String sql = destino.obterSelectByPrimaryKey(valores);
Se isso for verdade você terá que fazer uma verificação no código desta linha:
valores = this.obterValores(rs, origem.getColunasChave());
Se o método obterValores() voltar uma lista de valores vazia certamente ocorrerá este erro. Se isto se confirmar verifique se o método getColunasChave() está voltando o nome da coluna corretamente. 

 Lembre que no arquivo xml você terá que colocar a propriedade primary-key="true" deste jeito:
<coluna destino="customers_id" origem="no" primary-key="true" type="long" />
O método getColunasChave() tem que retornar a coluna descrita nesta tag, que é a "cutomers_id" utilizada neste exemplo.

 Obs. O nome das colunas no xml não podem conter erros, ou seja, tem que estar exatamente igual ao nome da coluna que está na tabela da base de dados.

 Bem...acho que o problema é este.

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

T

OI.
Desculpa la…
cm faço a verificação? :oops:

ja tentei o debug com um brakpoint na linha mas nao consegui…
bj

fantomas

Oi tituga,

Dê uma lida nas páginas destes links:

http://hotwork.sourceforge.net/hotwork/manual/eclipse/eclipse-user-guide.html#Rodando_em_modo_Debug
http://www.filesystems.org/~dquigley/cse219/index.php?it=eclipse&tt=debug&pf=y
http://hotwork.sourceforge.net/hotwork/manual/eclipse/eclipse-user-guide.html

[]'s

T

oi.
ainda nao consegui fazer o debug, da-m uns erros
mas consegui descobrir k o outro erro se devia a estar a fazer a ligação duas vezes à base de dados, provavelment (pois apaguei e deu !!! lol)

mas agora acontece k nao faz nem os inserts nem updates.
o k tens nesta linha como arquivo :

Document doc = this.obterXmlDocument(arquivo);

serve para que?

e ja agora nao colocas-t a mostrar os dados k vai passar pois nao?

desculpa tanta pergunta, mas é k tou mesmo atrapalhada nisto, e como ja deu pra perceber nao sou mt sabedora de java :roll:

bj obrigada

T

oi.

finalmente consegui descobrir…fiz um print dos valores e realmente esta vazio, porque sera?

so falta mesmo ultrapassar este obstaculo…

bj

T

Amigo problema resolvido…
Ja faz a passagem dos dados…

Agora preciso colocar a passar a pass encriptada, ou seja tem k passar por uma função minha e so depois é mandada para a outra base de dados…
se tiveres alguma ideia diz.

bjs e mt obrigada :wink:

fantomas

Oi tituga,

Document doc = this.obterXmlDocument(arquivo);

serve para que?

O método this.obterXmlDocument(arquivo) retorna o conteúdo do arquivo xml em uma estrutura navegável do tipo Document, o parametro passado é a localização do arquivo.

Eu ainda não utilizei criptografia mas dê uma olhada neste link http://www.devmedia.com.br/articles/viewcomp.asp?comp=2944 acho que vai te ajudar.

Deculpe a demora em responder.

[]'s

T

eu ja tenho minha função criptografia a funcionar, ou melhor funciona mas nao com o xml.

minha duvida esta como a vou usar no xml???
Aqui esta como eu chamo a função criptografia:

Criptografia.criptografar(senha)

onde senha é o valor a encriptar.

nao sei como colocar isso no xml.

bjs

fantomas

Oi tituga,

Segue abaixo uma sugestão, as alterações estão apontadas com uma seta.
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);
	private List<String> colunasCriptografar = new ArrayList<String>(0);  // <---------------

	public Tabela(String nome, List<String> colunas, List<String> colunasChave, List<String> colunasCriptografar) { // <<----
		this.nome = nome;
		this.colunas = colunas;
		this.colunasChave = colunasChave;
		this.colunasCriptografar = colunasCriptografar;
	}
	
	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 List<String> getColunasCriptografar() {
		return this.colunasCriptografar;
	}

	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));
	}
}
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.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);
				List<String> colunasCriptografar = 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"));
					}
					
					if (coluna.attributeValue("criptografar") != null) {          // <<------------------
						colunasCriptografar.add(coluna.attributeValue("origem")); // <<------------------
					}                                                             // <<------------------  
				}

				// Construir os objetos para a tabela origem e destino
				Tabela tabelaOrigem = new Tabela(origem, colunasOrigem, colunasChaveOrigem, colunasCriptografar); // <<------------
				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());
				
				valores = CriptografiaUtil.criptografar(origem, valores); // <--------------------
				
				// 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");
	}
}

Esta classe é nova.

import java.util.ArrayList;
import java.util.List;

public class CriptografiaUtil {

	public static List<String> criptografar(Tabela tabela, List<String> valores ) {
		List<String> valoresCriptografados = new ArrayList<String>(0);
		
		List<String> colunas = tabela.getColunas();
		List<String> colunasCriptografar = tabela.getColunasCriptografar();
		
		for(int i = 0; i < colunas.size(); i++) {
			
			String coluna = colunas.get(i);
			String valor = valores.get(i);
			
			if(colunasCriptografar.contains(coluna)) {
				String valorCriptografado = Criptografia.criptografar(valor); // <<---------------- CRIPTOGRAFAR
				
				valor = "'"+valorCriptografado+"'";
			}
			
			valoresCriptografados.add(valor);
		}
		
		return valoresCriptografados;
	}
}

Antes de alterar o seu projeto faça um backup antes, espero ter ajudado

[]'s

fantomas

Esqueci de enviar o novo xml, foi adicionado o atributo criptografar=“true”

<?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" criptografar="true" />
	</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>

[]'s

T

É isso amigo.

agora tenho apenas um problema k tou a tentar resolver.
No update ele nao da erro mas, como tenho varias linhas nao esta a fazer o update no sitio certo, falta o where, teria de ficar qualquer coisa como:

UPDATE customers SET customers_firstname = ‘Paulo’,customers_fax = 252718923,customers_telephone = 912345678,customers_dob = ‘1985-02-10’,customers_email_address = ‘[email removido]’,customers_password = ‘b5ef261a75dce04c2b86ad4a0d3ea510’ WHERE customers_id=‘id’

mas nao sei como.

ja tentei alterar no codigo mas nao consigo tirar a virgula antes do where…

obrigada por tudo

fantomas

Oi tituga,

Na classe Tabela.java tem um método que faz isso.

private String retirarUltimoCaracter(String param) { return (param.substring(0, param.length() - 1)); }

[]'s

T

oi.

Ja resolvi o problema.

Acrescentei o WHERE e coloquei um if, no caso se ser o this.colunasChave.size()-1 nao coloca virgula, assim insere os dados direitinhos :wink:

Obrigada pela sua ajuda fantimas, ficou tudo a funcionar direitinho :wink:

bj

T

oi amigo

tou com um novo problema…
queria gerar o .jar para puder colocar o programa a funcionar noutro computador, mas nao da.
Fiz o export mas ao tentar correr da-m um erro:

could not find the main class : ptInterface.Janela2.Program will exit.

a minha main é uma windows application…
podes-m ajudar?

Criado 28 de maio de 2008
Ultima resposta 16 de jun. de 2008
Respostas 38
Participantes 2