二、使用XML迁移数据库表中数据

本文介绍了一种将数据库表数据转换为XML文件,并能将XML数据导入数据库的方法。通过使用Java JDBC连接数据库,实现了数据库连接工厂,同时利用DOM4J进行XML的读写操作。详细展示了如何动态拼接SQL语句,以及如何处理不同类型的字段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据库连接工厂

package com.test.dom4j;

import java.sql.Connection;

public interface IDbFactory {
	/**
	 * 使用JDBC创建数据库连接
	 * 使用Mysql数据库,自行下载Mysql数据库驱动连接数据库
	 * JDBC Mysql连接配置
	 *		url=jdbc:mysql://localhost:3306/w1?useUnicode=true&characterEncoding=utf8
	 *		username=root
	 *		password=root
	 * @param url 数据库连接URL
	 * @param user 数据库用户
	 * @param pwd 数据库密码
	 * @return
	 */
	public Connection getCon(String url,String user,String pwd);
}

工厂实现类

package com.test.dom4j;

import java.sql.Connection;
import java.sql.DriverManager;

public class DbFactory implements IDbFactory{

	public Connection getCon(String url, String user, String pwd) {
		try
		{
			Class.forName("com.mysql.jdbc.Driver");//java.lang.Class
			Connection con = DriverManager.getConnection(url, user, pwd);
			return con;
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
		return null;
	}

}

数据迁移接口

package com.test.dom4j;

import java.sql.Connection;

public interface ITableMagrate {
	/**
	 * 此方法实现读取数据库表中数据并保存到文件系统,以XML形式存储
	 * XML存储格式为,根据节点为table,属性name为表名,每行生成row节点,row节点中每列生成column节点,属性name为列名
	 * <table name="">
	 * 	<row>
	 * 		<column name=""></column>
	 * 		<column name=""></column>
	 *      ...
	 * 	<row>
	 * 	<row>
	 * 		<column name=""></column>
	 * 		<column name=""></column>
	 *      ...
	 * 	<row>
	 * </table>
	 * @param con 数据库连接
	 * @param tableName 表名
	 * @param file 文件绝对目录
	 */
	public void db2xml(Connection con,String tableName,String file);
	
	/**
	 * 从XML数据文件中解析数据并保存到数据库表tableName中,数据库表可以预先定义
	 * XML存储格式为,根据节点为table,属性name为表名,每行生成row节点,row节点中每列生成column节点,属性name为列名
	 * <table name="">
	 * 	<row>
	 * 		<column name=""></column>
	 * 		<column name=""></column>
	 *      ...
	 * 	<row>
	 * 	<row>
	 * 		<column name=""></column>
	 * 		<column name=""></column>
	 *      ...
	 * 	<row>
	 * </table>
	 * @param con 数据库连接
	 * @param tableName 表名
	 * @param file 文件绝对目录
	 */
	public void xml2db(Connection con,String tableName,String file);
}

迁移实现类

根据XML解析动态拼接SQL,针对类不同类型还需要细化业务逻辑,本例只针对字符类型字段处理。

package com.test.dom4j;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
import java.util.Iterator;
import java.util.List;

import org.dom4j.Attribute;
import org.dom4j.CDATA;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

public class TableMagrate implements ITableMagrate{

	@Override
	public void db2xml(Connection con, String tableName, String file) {
		try
		{
			Document doc = DocumentHelper.createDocument();
			Element root = DocumentHelper.createElement("table");
			Attribute attTab = DocumentHelper.createAttribute(root, "name", tableName);
			root.add(attTab);
			doc.setRootElement(root);
			String sql = "select * from "+tableName;
			Statement stat = con.createStatement();
			ResultSet rs = stat.executeQuery(sql);
			ResultSetMetaData rsmd = rs.getMetaData();
			int colCnt = rsmd.getColumnCount();
			while(rs.next())
			{
				Element rowEle = DocumentHelper.createElement("row");
				root.add(rowEle);
				for(int i=1;i<=colCnt;i++)
				{
					String colName = rsmd.getColumnName(i);
					String colVal = rs.getString(colName);
					if(colVal == null)
						colVal = "";
					Element columnEle = DocumentHelper.createElement("column");
					rowEle.add(columnEle);
					Attribute att = DocumentHelper.createAttribute(columnEle, "name", colName);
					columnEle.add(att);
					CDATA cdata = DocumentHelper.createCDATA(colVal);
					columnEle.add(cdata);
				}
			}
			OutputFormat of = new OutputFormat("\t",true);
			FileOutputStream fos = new FileOutputStream(file);
			XMLWriter xmlw = new XMLWriter(fos,of);
			xmlw.write(doc);
			fos.close();
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
	}

	@Override
	public void xml2db(Connection con, String tableName, String file) {
		try
		{
			FileInputStream fis = new FileInputStream(file);
			SAXReader saxr = new SAXReader();
			Document doc = saxr.read(fis);
			Element root = doc.getRootElement();
			Attribute attTab = root.attribute("name");
			String tabName = attTab.getValue();
			List rows = root.elements("row");
			
			for(Iterator it=rows.iterator();it.hasNext();)
			{
				//insert into table (id,name) values (1,2)
				StringBuffer sb = new StringBuffer();
				sb.append("insert into ");
				sb.append(tabName);
				sb.append(" (");
				StringBuffer sb2 = new StringBuffer();
				sb2.append(" values (");
				Element rowEle = (Element)it.next();
				List cols = rowEle.elements("column");
				for(Iterator it2=cols.iterator();it2.hasNext();)
				{
					Element colEle = (Element)it2.next();
					Attribute colAtt = colEle.attribute("name");
					String colName = colAtt.getValue();
					if("id".equals(colName))
						continue;
					sb.append(colName);
					sb.append(",");
					String colVal = colEle.getText();
					if("".equals(colVal))
					{
						sb2.append("null");
						sb2.append(",");
					}
					else
					{
						sb2.append("'");
						sb2.append(colVal);
						sb2.append("',");
					}
				}
				String sql1 = sb.toString();
				if(sql1.endsWith(","))
					sql1 = sql1.substring(0,sql1.length()-1);
				sql1 = sql1 + ")";
				
				String sql2 = sb2.toString();
				if(sql2.endsWith(","))
					sql2 = sql2.substring(0,sql2.length()-1);
				sql2 = sql2 + ")";
				
				String sql = sql1 + sql2;
				Statement stat = con.createStatement();
				stat.executeUpdate(sql);
				stat.close();
			}
			fis.close();
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
	}

}

测试类

package com.test.dom4j;

import java.sql.Connection;

public class TestDb {

	public static void main(String[] args) {
		IDbFactory dbf = new DbFactory();
		ITableMagrate itm = new TableMagrate();
		String url = "jdbc:mysql://localhost:3306/w1?useUnicode=true&characterEncoding=utf8";
		String user = "root";
		String pwd = "root";
		Connection con = dbf.getCon(url, user, pwd);
		//itm.db2xml(con, "t_student", "d:\\my.xml");
		itm.xml2db(con, "t_student", "d:\\my.xml");
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值