通过XMLConfiguration解析XML获取更新数据库sql

需求:将用户从数据库导出,并且导入另一个用户后更新其中一些表的数据值。

1、XML原始文件

 

<?xml version="1.0" encoding="UTF-8" ?>
<database>
	<tables>
		<!-- 修改BUSINESS_SYSTEM表 -->
		<table name = "BUSINESS_SYSTEM">
			<!-- 终端管理 -->
			<fields id="2">
				<field IP = "xxxx.xxxx.xxxx.xxxx" />
				<field PORT = "40009"/>
			</fields>
            <!-- 权限管理 -->
			<fields id="3">
				<field IP = "xxxx.xxxx.xxxx.xxxx"/>
				<field PORT = "40001"/>
			</fields>
            <!-- 短彩信管理平台 -->
			<fields id="101">
				<field IP = "xxxx.xxxx.xxxx.xxxx"/>
				<field PORT = "40004"/>
			</fields>
			<!-- 商户管理系统 -->
			<fields id="121">
				<field IP = "xxxx.xxxx.xxxx.xxxx"/>
				<field PORT = "8080"/>
			</fields>
			<!-- 基础用户管理系统 -->
			<fields id="141">
				<field IP = "xxxx.xxxx.xxxx.xxxx"/>
				<field PORT = "40001"/>
			</fields>
			<!-- 电子商务后台管理系统 -->
			<fields id="161">
				<field IP = "xxxx.xxxx.xxxx.xxxx"/>
				<field PORT = "40006"/>
			</fields>
			<!-- 万能遥控器管理系统 -->
			<fields id="201">
				<field IP = "xxxx.xxxx.xxxx.xxxx"/>
				<field PORT = "40013"/>
			</fields>
			<!-- 预付卡支付管理系统 -->
			<fields id="202">
				<field IP = "xxxx.xxxx.xxxx.xxxx"/>
				<field PORT = "40014"/>
			</fields>
			<!-- 日志管理系统 -->
			<fields id="242">
				<field IP = "xxxx.xxxx.xxxx.xxxx"/>
				<field PORT = "40023"/>
			</fields>
			<!-- 业务管理系统 -->
			<fields id="241">
				<field IP = "xxxx.xxxx.xxxx.xxxx"/>
				<field PORT = "40010"/>
			</fields>
		</table>
		<!-- 修改property_value表 -->
		<table name = "PROPERTY_VALUE">
		    <!-- 数据库URL -->
			<fields PROPERTY_VALUE_ID="12">
				<field VALUE = "jdbc:oracle:thin:@xxxx.xxxx.xxxx.xxxx:1521:orcl"/>
			</fields>
			<!-- log日志URL -->
			<fields PROPERTY_VALUE_ID="38">
				<field VALUE = "jdbc:oracle:thin:@xxxx.xxxx.xxxx.xxxx:1521:orcl"/>
			</fields>
			<!-- ftp配置 -->
			<fields PROPERTY_VALUE_ID="13">
				<field VALUE = "192.168.0.112"/>
			</fields>
			<!-- 域名 -->
			<fields PROPERTY_VALUE_ID="45">
				<field VALUE = "http://192.168.0.104/"/>
			</fields>
			<!-- jsonP -->
			<fields PROPERTY_VALUE_ID="74">
				<field VALUE = "http://xxxx.xxxx.xxxx.xxxx:40000"/>
			</fields>
			<!-- 重定向IP -->
			<fields PROPERTY_VALUE_ID="5">
				<field VALUE = "xxxx.xxxx.xxxx.xxxx"/>
			</fields>
			<!-- 重定向PORT -->
			<fields PROPERTY_VALUE_ID="6">
				<field VALUE = "40000"/>
			</fields>
		</table>
		<!-- 修改property_value表 -->
		<table name = "BG_PROPERTY_VALUE">
			<!-- 数据库URL -->
			<fields BG_PROPERTY_VALUE_ID="2">
				<field VALUE = "jdbc:oracle:thin:@xxxx.xxxx.xxxx.xxxx:1521:orcl"/>
			</fields>
			<!-- 图片服务器 -->
			<fields BG_PROPERTY_VALUE_ID="62">
				<field VALUE = "http://xxxx.xxxx.xxxx.xxxx:40018/"/>
			</fields>
			<!-- 域名 -->
			<fields BG_PROPERTY_VALUE_ID="64">
				<field VALUE = "http://192.168.0.104:8081/dfs/ws/imgSys"/>
			</fields>
			<!-- 图片服务器 -->
			<fields BG_PROPERTY_VALUE_ID="65">
				<field VALUE = "http://xxxx.xxxx.xxxx.xxxx:40018/"/>
			</fields>
			<!-- 业务自助管理自定义系统URL -->
			<fields BG_PROPERTY_VALUE_ID="69">
				<field VALUE = "jdbc:oracle:thin:@xxxx.xxxx.xxxx.xxxx:1521:orcl"/>
			</fields>
			<!-- LOG数据库url -->
			<fields BG_PROPERTY_VALUE_ID="32">
				<field VALUE = "jdbc:oracle:thin:@xxxx.xxxx.xxxx.xxxx:1521:orcl"/>
			</fields>
		</table>
	</tables>
</database>  

 2、XMLConfiguration解析java代码

  

package com.handaer.pro.xml;

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

import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.XMLConfiguration;
import org.apache.commons.configuration.HierarchicalConfiguration.Node;

public class PaserXml
{
    @SuppressWarnings("unchecked")
    public List<String> initXml()
    {
        XMLConfiguration config = new XMLConfiguration();
        config.setDelimiterParsingDisabled(true);
        config.setFileName("config/data.xml");
        try
        {
            config.load();
        }
        catch (ConfigurationException e)
        {
            e.printStackTrace();
        }
        Node root = config.getRoot();
        List<String> sqlList = new ArrayList<String>();
        if (root.hasChildren())
        {
            List<Node> tablesNodeList = root.getChildren();
            for (Node tablesNode : tablesNodeList)
            {
                List<Node> tableNodeList = tablesNode.getChildren();
                for (Node tableChildNode : tableNodeList)
                {
                    StringBuilder sql = new StringBuilder("UPDATE ");
                    String tableName = (String) ((Node) tableChildNode.getAttributes().get(0)).getValue();
                    sql.append(tableName).append(" SET ");
                    List<Node> fieldsNodeList = tableChildNode.getChildren();
                    for (Node fields : fieldsNodeList)
                    {
                        StringBuilder filedSb = new StringBuilder();
                        List<Node> fieldNodeList = fields.getChildren();
                        int count = 0;
                        for (Node field : fieldNodeList)
                        {
                            count++;
                            String dbFieldName = (String) ((Node) field.getAttributes().get(0)).getName();
                            filedSb.append(dbFieldName).append("=");
                            String dbField = (String) ((Node) field.getAttributes().get(0)).getValue();
                            filedSb.append("'").append(dbField).append("'");
                            if (count < fieldNodeList.size())
                            {
                                filedSb.append(" , ");
                            }
                        }
                        String idName = (String) ((Node) fields.getAttributes().get(0)).getName();
                        filedSb.append(" WHERE ").append(idName).append("=");
                        String id = (String) ((Node) fields.getAttributes().get(0)).getValue();
                        filedSb.append(id);
                        int headLength = sql.length();
                        sql.append(filedSb);
                        System.out.println(sql.toString());
                        sqlList.add(sql.toString());
                        sql.delete(headLength, sql.length());
                        filedSb.delete(0, filedSb.length());
                    }
                    sql.delete(0, sql.length());
                }
            }
        }
        return sqlList;
    }

}

 3、ORACLE执行java源码

 

package com.handaer.pro;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import org.apache.log4j.Logger;

public class OracleHelper
{

    private static final Logger logger = Logger.getLogger(OracleHelper.class);

    private static int CMD_TYPE_IDX = 2;

    private static int CMD_ORACLE_IDX = 3;

    private static int CMD_FILE_PATH_IDX = 5;

    private static int CMD_OWNER_IDX = 7;

    private static int CMD_TOUSER_IDX = 9;

    private final String[] cmdExpArray = { "cmd", "/c", "", "", "file=", "", "owner=", "" };

    private final String[] cmdImpArray = { "cmd", "/c", "", "", "file=", "", "fromuser=", "", "touser=", "" };

    public void setOracleType(String type)
    {
        cmdExpArray[CMD_TYPE_IDX] = type;
        cmdImpArray[CMD_TYPE_IDX] = type;
    }

    public void setOracleInstance(String oracleInstance)
    {
        cmdExpArray[CMD_ORACLE_IDX] = oracleInstance;
        cmdImpArray[CMD_ORACLE_IDX] = oracleInstance;
    }

    public void setFilePath(String filePath)
    {
        cmdExpArray[CMD_FILE_PATH_IDX] = filePath;
        cmdImpArray[CMD_FILE_PATH_IDX] = filePath;
    }

    public void setOwner(String owner)
    {
        cmdExpArray[CMD_OWNER_IDX] = owner;
    }

    public void setUser(String fromUser, String toUser)
    {
        cmdImpArray[CMD_OWNER_IDX] = fromUser;
        cmdImpArray[CMD_TOUSER_IDX] = toUser;
    }

    public boolean preform(int type)
    {
        boolean result = false;
        try
        {
            if (logger.isDebugEnabled())
            {
                logger.debug("ORACLE command : " + this);
            }
            Process ldrTmp = null;

            if (type == 1)
            {

                ldrTmp = Runtime.getRuntime().exec(cmdExpArray);
            }
            if (type == 2)
            {

                ldrTmp = Runtime.getRuntime().exec(cmdImpArray);
            }
            final Process ldr = ldrTmp;

            new Thread()
            {
                public void run()
                {

                    BufferedReader reader = new BufferedReader(new InputStreamReader(ldr.getErrorStream()));
                    try
                    {
                        String line = reader.readLine();
                        if (logger.isDebugEnabled())
                        {
                            logger.debug("ORACLE Error Message:");
                        }
                        while (line != null)
                        {
                            line = reader.readLine();
                            if (logger.isDebugEnabled())
                            {
                                logger.debug(line);
                            }
                        }
                    }
                    catch (IOException e)
                    {
                        logger.error("ORACLE get error stream failed.", e);
                    }
                    finally
                    {
                        try
                        {
                            if (reader != null)
                            {
                                reader.close();
                                reader = null;
                            }
                        }
                        catch (IOException e)
                        {
                            logger.error(e.getMessage(), e);
                        }
                    }
                }
            }.start();

            new Thread()
            {
                public void run()
                {
                    BufferedReader reader = new BufferedReader(new InputStreamReader(ldr.getInputStream()));
                    try
                    {
                        String line = reader.readLine();
                        if (logger.isDebugEnabled())
                        {
                            logger.debug("ORACLE Output Message: ");
                        }
                        while (line != null)
                        {
                            line = reader.readLine();
                            if (logger.isDebugEnabled())
                            {
                                logger.debug(line);
                            }
                        }
                    }
                    catch (IOException e)
                    {
                        logger.error("ORACLE  get input stream failed.", e);
                    }
                    finally
                    {
                        try
                        {
                            if (reader != null)
                            {
                                reader.close();
                                reader = null;
                            }
                        }
                        catch (IOException e)
                        {
                            logger.error(e.getMessage(), e);
                        }
                    }
                }
            }.start();
            try
            {

                int exitValue = ldr.waitFor();
                if (exitValue == 2 || exitValue == 0)
                {
                    if (logger.isDebugEnabled())
                    {
                        logger.debug("ORACLE  success.");
                    }
                    result = true;
                }
                else
                {
                    logger.error("ORACLE SQLLoad failed," + this);
                }
            }
            catch (InterruptedException e)
            {
                logger.error("ORACLE SQLLoad interrupted.", e);
            }
        }
        catch (IOException e)
        {
            logger.error(e.getMessage(), e);
        }
        return result;
    }

}

 4、建立数据库连接java代码

 

package com.handaer.pro;

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

public class OracleConnection
{
    private static OracleConnection oracleConnection = null;

    private OracleConnection()
    {

    }

    public static final OracleConnection getOracleConnectionInstance()
    {
        if (oracleConnection == null)
        {
            oracleConnection = new OracleConnection();
        }
        return oracleConnection;
    }

    private Statement st = null;

    private Connection connection = null;

    private ResultSet rs = null;

    static
    {
        try
        {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            System.out.println("加载驱动...");
        }
        catch (ClassNotFoundException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public Connection buildConnection(String url, String userName, String password)
    {
        try
        {
            connection = DriverManager.getConnection(url, userName, password);
            System.out.println("创建连接...");
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }
        return connection;
    }

    public Statement buildStatement(Connection connection)
    {
        try
        {
            st = connection.createStatement();
        }
        catch (SQLException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return st;
    }

    public void executeSql(String sql, int type)
    {

        try
        {
            st.executeUpdate(sql);
        }
        catch (SQLException e)
        {
            if (type == 1)
            {
                System.out.println("table之间有关联");
            }
            else
            {
                e.printStackTrace();
            }

        }
    }

    public List<String> executeQuery(String sql, String field)
    {
        List<String> tableList = new ArrayList<String>();
        try
        {
            rs = st.executeQuery(sql);
            while (rs.next())
            {
                tableList.add(rs.getString(field));
            }
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }
        return tableList;
    }

    public void close()
    {
        try
        {
            if (rs != null)
            {
                rs.close();
            }
            if (st != null)
            {
                st.close();
            }
            if (connection != null)
            {
                connection.close();
            }

        }
        catch (SQLException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("关闭连接....");
    }

}

 5、测试程序

 

package com.handaer.pro.server;

import java.sql.Connection;
import java.util.List;

import com.handaer.pro.OracleConnection;
import com.handaer.pro.OracleHelper;
import com.handaer.pro.xml.PaserXml;

public class StartServer
{
    /**
     * ---------------------------原始库信息----------------------------------------
     * ----
     */

    public static String expuserName = "pms";

    public static String exppassword = "pmspwd";

    public static String exportip = "192.168.0.122";

    /**
     * ---------------------------目的库信息----------------------------------------
     * ----
     */

    public static String impuserName = "pms";

    public static String imppassword = "pmspwd";

    public static String url = "jdbc:oracle:thin:@192.168.0.123:1521:orcl";

    public static String impIp = "192.168.0.123";
    
    public static String impSidNum = "orcl.localdomain";

    /**
     * -----------------------------系统管理员--------------------------------------
     * -----
     */

    public static String systemName = "system";

    public static String systempassword = "handaer";

    /**
     * ------------------------------SID号--------------------------------------
     * ---
     */

    public static String sidNum = "orcl";

    public static String filePath = "D:\\exp\\pms.dmp";

    /**
     * @param args
     */
    public static void main(String[] args)
    {

        System.out.println("------------------------begin--------------------------------");
        // 导入目的表之前先删除表
        deleteTableSql();
        System.out.println("---------------------delete all table------------------------");

        // 删除目的表所有sequence
        deleteSequenceSql();
        System.out.println("--------------------delete all sequence-----------------------");

        expDbInfo();
        System.out.println("---------------------------end exp----------------------------");

        impDbInfo();
        System.out.println("----------------------------end imp-----------------------------");

        PaserXml paserXml = new PaserXml();
        List<String> sqlList = paserXml.initXml();
        System.out.println("-------------------------end init xml--------------------------");

        changeDbData(sqlList);
        System.out.println("-------------------------end modify data------------------------");
        System.out.println("-------------------------------end------------------------------");

    }

    /**
     * 导出原始库
     */
    private static void expDbInfo()
    {
        OracleHelper oracleHelper = new OracleHelper();
        oracleHelper.setOracleType("exp");
        StringBuilder sb = new StringBuilder(expuserName).append("/").append(exppassword).append("@").append(exportip).append("/").append(sidNum);
        oracleHelper.setOracleInstance(sb.toString());
        oracleHelper.setFilePath(filePath);
        oracleHelper.setOwner(expuserName);
        oracleHelper.preform(1);
    }

    /**
     * 导入目的库
     */
    private static void impDbInfo()
    {
        OracleHelper oracleHelper = new OracleHelper();
        oracleHelper.setOracleType("imp");
        StringBuilder sb = new StringBuilder(systemName).append("/").append(systempassword).append("@").append(impIp).append("/").append(impSidNum);
        oracleHelper.setOracleInstance(sb.toString());
        oracleHelper.setFilePath(filePath);
        oracleHelper.setUser(expuserName, impuserName);
        oracleHelper.preform(2);
    }

    /**
     * 修改权限数据库中的数据
     * 
     * @param sqlList
     */
    private static void changeDbData(List<String> sqlList)
    {
        Connection connection = OracleConnection.getOracleConnectionInstance().buildConnection(url, impuserName, imppassword);
        OracleConnection.getOracleConnectionInstance().buildStatement(connection);
        for (String sql : sqlList)
        {
            OracleConnection.getOracleConnectionInstance().executeSql(sql, 0);
        }
        OracleConnection.getOracleConnectionInstance().close();
    }

    /**
     * 删除目的库中所有表
     */
    private static void deleteTableSql()
    {
        Connection connection = OracleConnection.getOracleConnectionInstance().buildConnection(url, impuserName, imppassword);
        OracleConnection.getOracleConnectionInstance().buildStatement(connection);
        String sql = "select 'drop table ' || table_name ||chr(13)||chr(10) tablesql from user_tables";
        List<String> tableList = OracleConnection.getOracleConnectionInstance().executeQuery(sql, "tablesql");
        while (tableList.size() != 0)
        {
            for (String tablesql : tableList)
            {
                OracleConnection.getOracleConnectionInstance().executeSql(tablesql, 1);
            }
            tableList = OracleConnection.getOracleConnectionInstance().executeQuery(sql, "tablesql");
        }

        OracleConnection.getOracleConnectionInstance().close();
    }

    /**
     * 删除目的库中所有sequence
     */

    private static void deleteSequenceSql()
    {
        Connection connection = OracleConnection.getOracleConnectionInstance().buildConnection(url, impuserName, imppassword);
        OracleConnection.getOracleConnectionInstance().buildStatement(connection);
        String sql = "select 'drop sequence ' || sequence_name ||chr(13)||chr(10) se from user_sequences";
        List<String> tableList = OracleConnection.getOracleConnectionInstance().executeQuery(sql, "se");
        for (String tablesql : tableList)
        {
            OracleConnection.getOracleConnectionInstance().executeSql(tablesql, 0);
        }
        OracleConnection.getOracleConnectionInstance().close();
    }
}

 6、测试结果

    解析xml生成sql的结果如下:

  

UPDATE BUSINESS_SYSTEM SET IP='xxxx.xxxx.xxxx.xxxx' , PORT='40009' WHERE id=2
UPDATE BUSINESS_SYSTEM SET IP='xxxx.xxxx.xxxx.xxxx' , PORT='40001' WHERE id=3
UPDATE BUSINESS_SYSTEM SET IP='xxxx.xxxx.xxxx.xxxx' , PORT='40004' WHERE id=101
UPDATE BUSINESS_SYSTEM SET IP='xxxx.xxxx.xxxx.xxxx' , PORT='8080' WHERE id=121
UPDATE BUSINESS_SYSTEM SET IP='xxxx.xxxx.xxxx.xxxx' , PORT='40001' WHERE id=141
UPDATE BUSINESS_SYSTEM SET IP='xxxx.xxxx.xxxx.xxxx' , PORT='40006' WHERE id=161
UPDATE BUSINESS_SYSTEM SET IP='xxxx.xxxx.xxxx.xxxx' , PORT='40013' WHERE id=201
UPDATE BUSINESS_SYSTEM SET IP='xxxx.xxxx.xxxx.xxxx' , PORT='40014' WHERE id=202
UPDATE BUSINESS_SYSTEM SET IP='xxxx.xxxx.xxxx.xxxx' , PORT='40023' WHERE id=242
UPDATE BUSINESS_SYSTEM SET IP='xxxx.xxxx.xxxx.xxxx' , PORT='40010' WHERE id=241
UPDATE PROPERTY_VALUE SET VALUE='jdbc:oracle:thin:@xxxx.xxxx.xxxx.xxxx:1521:orcl' WHERE PROPERTY_VALUE_ID=12
UPDATE PROPERTY_VALUE SET VALUE='jdbc:oracle:thin:@xxxx.xxxx.xxxx.xxxx:1521:orcl' WHERE PROPERTY_VALUE_ID=38
UPDATE PROPERTY_VALUE SET VALUE='192.168.0.112' WHERE PROPERTY_VALUE_ID=13
UPDATE PROPERTY_VALUE SET VALUE='http://192.168.0.104/' WHERE PROPERTY_VALUE_ID=45
UPDATE PROPERTY_VALUE SET VALUE='http://xxxx.xxxx.xxxx.xxxx:40000' WHERE PROPERTY_VALUE_ID=74
UPDATE PROPERTY_VALUE SET VALUE='xxxx.xxxx.xxxx.xxxx' WHERE PROPERTY_VALUE_ID=5
UPDATE PROPERTY_VALUE SET VALUE='40000' WHERE PROPERTY_VALUE_ID=6
UPDATE BG_PROPERTY_VALUE SET VALUE='jdbc:oracle:thin:@xxxx.xxxx.xxxx.xxxx:1521:orcl' WHERE BG_PROPERTY_VALUE_ID=2
UPDATE BG_PROPERTY_VALUE SET VALUE='http://xxxx.xxxx.xxxx.xxxx:40018/' WHERE BG_PROPERTY_VALUE_ID=62
UPDATE BG_PROPERTY_VALUE SET VALUE='http://192.168.0.104:8081/dfs/ws/imgSys' WHERE BG_PROPERTY_VALUE_ID=64
UPDATE BG_PROPERTY_VALUE SET VALUE='http://xxxx.xxxx.xxxx.xxxx:40018/' WHERE BG_PROPERTY_VALUE_ID=65
UPDATE BG_PROPERTY_VALUE SET VALUE='jdbc:oracle:thin:@xxxx.xxxx.xxxx.xxxx:1521:orcl' WHERE BG_PROPERTY_VALUE_ID=69
UPDATE BG_PROPERTY_VALUE SET VALUE='jdbc:oracle:thin:@xxxx.xxxx.xxxx.xxxx:1521:orcl' WHERE BG_PROPERTY_VALUE_ID=32
-------------------------end init xml--------------------------

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值