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