• DRP中利用dom4j完成XML文件导入数据库


      此篇博文转于守宏师哥。

       XML在不同语言,不同数据源中交换数据已经成为主流。在这些的DRP项目中,王勇老师提到了使用XML在不同数据库中交换数据,达到安全,灵活的目的。不过他只是提到有这么一种方法,做了其中的一部分工作。因为感觉这种技术非常实用,这里我把这个过程补充完整。
     
      开发环境:
      sql server  2008数据库,Oracle数据库,PL/SQL,MyEclipse开发环境。

      将sql数据库一个表中的数据库导出到xml文件中,再通过dom4j读取xml文件,将xml中的数据写入到Oracle数据库中。

    一:分析表结构,建立目标数据库表。
       既然是不同的数据库,但是数据库表结果应该是一样的,在实际项目中,一般是首先分析表结构。利用已经存在的xml文件,或者数据库表,在目的数据库中建立对应的表。原数据库与目标数据库的表结构是一致的。
     
    二:将sql server数据库中的数据导出成xml文件。
        一般情况为了安全起见,不会开放数据库,只能将数据库中的数据导出到xml。Sql server导出到xml的方法如下:
       利用sql查询语句

    select * from classInfo for xml path('my'),root('myRoot')

       这里的classInfo是表名称,for xml path是关键语句,表示查询结果以xml的形式输出。其中括号和其中的my可以省略。它代表xml文件的一个行目录,每一个my代表数据库的一条记录,my是自己命名的节点名称,可以是任意名称。root('myRoot')代表xml文件的根目录是myRoot,也可以自己命名。

    数据库中的记录为:


    生成的xml文件为:

    <myRoot>
      <my>
        <classNo>07</classNo>
        <classes>07</classes>
        <grade>2008</grade>
        <classSize>90</classSize>
        <collegeNo>01</collegeNo>
        <specialtyNo>01001</specialtyNo>
        <assistant></assistant>
        <remark>无</remark>
        <IsEffective>是</IsEffective>
      </my>
      <my>
        <classNo>09</classNo>
        <classes>音乐</classes>
        <grade>如:2008</grade>
        <classSize>90</classSize>
        <collegeNo>06</collegeNo>
        <specialtyNo>09</specialtyNo>
        <assistant></assistant>
        <remark>无</remark>
        <IsEffective>是</IsEffective>
      </my>
      <my>
        <classNo>123</classNo>
        <classes>faf</classes>
        <grade>如:2008</grade>
        <classSize>22</classSize>
        <collegeNo>01</collegeNo>
        <specialtyNo>234r</specialtyNo>
        <assistant>234</assistant>
        <remark>af</remark>
        <IsEffective>是</IsEffective>
      </my>
      <my>
        <classNo>323</classNo>
        <classes>33</classes>
        <grade>20093</grade>
        <classSize>33</classSize>
        <collegeNo>01</collegeNo>
        <specialtyNo>就</specialtyNo>
        <assistant>
    234</assistant>
        <remark>333</remark>
        <IsEffective>是</IsEffective>
      </my>
      <my>
        <classNo>999</classNo>
        <classes>信息2班</classes>
        <grade>2008</grade>
        <classSize>80</classSize>
        <collegeNo>01</collegeNo>
        <specialtyNo>03</specialtyNo>
        <assistant>234</assistant>
        <remark>好</remark>
        <IsEffective>是</IsEffective>
      </my>
    
    </myRoot>
    三:配置开发环境,编写读取XML文件和写入数据库的语句。
    上文中已经说到了如何读取xml文件。这里利用dom4j读取配置文件,将xml中的数据读取出来。
    数据库助手类,负责连接,关闭数据库

    package com.lsh.testXML;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    /**
     * 数据库工具类
     * @author 李守宏
     *
     */
    public class DBUtil {
    
    	/**
    	 * 取得数据库连接
    	 * @return
    	 */	
    	public static Connection getConnection() {
    		Connection conn = null;
    		try {
    			Class.forName("oracle.jdbc.driver.OracleDriver");
    			String dbUrl = "jdbc:oracle:thin:@127.0.0.1:1521:orcl";
    			String username = "drp";
    			String password = "drp";
    			conn = DriverManager.getConnection(dbUrl, username, password);
    		} catch (ClassNotFoundException e) {
    			e.printStackTrace();
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    		return conn;
    	}
    	//关闭preparedStatement
    	public static void close(PreparedStatement pstmt) {
    		if (pstmt != null) {
    			try {
    				pstmt.close();
    			} catch (SQLException e) {
    				e.printStackTrace();
    			}
    		}
    	}
    	//关闭connection
    	public static void close(Connection conn) {
    		if (conn != null) {
    			try {
    				conn.close();
    			} catch (SQLException e) {
    				e.printStackTrace();
    			}	
    		}
    	}
    }
    

    执行读取xml和写入oracel数据库的程序:

    package com.lsh.testXML;
    
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.util.Iterator;
    import java.util.List;
    
    import org.dom4j.Document;
    import org.dom4j.DocumentException;
    import org.dom4j.Element;
    import org.dom4j.io.SAXReader;
    /**
     * 利用dom4j读取xml,再写入到oracel数据库中
     * @作者 李守宏——七期信息技术提高班
     * @创建日期 2012-2-18
     */
    public class test {
    
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		try {
    			//my.xml位于classpath路径下,也可以放到其他路径,这里只要指明路径就行
    			Document doc = new SAXReader().read(Thread.currentThread().getContextClassLoader().getResourceAsStream("my.XML"));
    			xmlTODB(doc.selectNodes("/myRoot/my"));
    
    		} catch (DocumentException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    	
    	private static void xmlTODB(List itemList){
    		String sql = "insert into classInfo(Classno,Classes,Grade,Classsize,Collegeno,Specialtyno,Assistant,Remark,Iseffective)" +
    				" values(?,?,?,?,?,?,?,?,?)";
    		Connection conn = null;
    		PreparedStatement pstmt = null;
    		
    		try{
    			conn = DBUtil.getConnection();
    			pstmt = conn.prepareStatement(sql);
    		//迭代获取xml每个节点的值,将xml读出的数据看成一个list
    		for(Iterator iter=itemList.iterator();iter.hasNext();){
    			Element elt = (Element)iter.next();
    			String classNo = elt.elementText("classNo");
    			String classes =elt.elementText("classes");
    			String grade =  elt.elementText("grade");
    			String classSize = elt.elementText("classSize");
    			String specialtyNo = elt.elementText("specialtyNo");
    			String collegeNo = elt.elementText("collegeNo");
    			String assistant = elt.elementText("assistant");
    			String remark = elt.elementText("remark");
    			String isEffective = elt.elementText("IsEffective");
    			
    			pstmt.setString(1, classNo);
    			pstmt.setString(2, classes);
    			pstmt.setString(3, grade);
    			pstmt.setString(4, classSize);
    			pstmt.setString(5, specialtyNo);
    			pstmt.setString(6, collegeNo);
    			pstmt.setString(7, assistant);
    			pstmt.setString(8, remark);
    			pstmt.setString(9, isEffective);
    
    			pstmt.addBatch();
    		}
    			pstmt.executeBatch();
    			System.out.println("ok");
    		}catch(Exception e){
    			e.printStackTrace();
    		}finally{
    			DBUtil.close(conn);
    			DBUtil.close(pstmt);
    		}
    	}
    }

    PS:注意在sql中不区分大小写,在xml中区分大小写。


  • 相关阅读:
    无预挖无ICO-潜力币XDAG最强攻略
    DAG也许是真正的区块链3.0
    k-means+python︱scikit-learn中的KMeans聚类实现( + MiniBatchKMeans)
    使用sklearn进行K_Means聚类算法
    机器学习sklearn19.0聚类算法——Kmeans算法
    线性判别分析LDA原理总结
    LNMP V1.4一键快速部署Let's Encrypt免费SSL证书
    LNMP 1.x升级到LNMP 1.4教程及注意事项和多PHP版本使用教程
    Config Server高可用
    Config非对称加解密
  • 原文地址:https://www.cnblogs.com/xzpblog/p/5117947.html
Copyright © 2020-2023  润新知