之前了解过一篇,是通过Dom4j读取XML文件,由于一些原因,我们会遇到一些这样的情况 ,解析XML,将其放到数据库中保存,然后再适当的时候再读取出来显示,所以如何将我们的这次我们借助于dom4j来完成我们XML文件存入数据库的操作。

Step-1:

     在进行操作之前,你必须要存在一个这样的数据库表来进行接收操作。对于数据库表的创建,我们可以采用PL SQL 直接导入sql操作,然后直接存入数据库:文件--打开--选择SQL Script,则可以导入写好的sql语句。这样想要的表则存入数据库中。

Step-2:

数据库表创建成功之后,则可以回到我们的工具(Eclipse/MyEclipse……)上,建立lib包,然后引入三个必要的jar包

  • dom4j-1.6.1.jar(因为采用dom4j辅助存入,所以这个是必要的)
  • jaxen-1.1-beta-6jar(使用dom4j解析XML时,要快速获取某个节点的数据,使用XPath是个不错的方法)
  • ojdbc6.jar(和数据库打交道)

Step-3:



1、建立一个文件包,将我们需要保存到数据库的xml文件放入其中。



2、在src下建立一个包,在其中建立两个类,一个用来存放执行方法,另一个用来和数据库进行连接



XMLSchema 到数据库表_开发工具



Step-4:



     一切准备工作完成之后,就可以实行填充工作了,首先Until中添加数据库连接操作:



/**
 * @ClassName: DbUtil
 * @Description: 封装数据库常用操作
 * @author: HuoYaJing
 * @date:2015年10月6日 下午6:51:42
 */
public class DbUtil {
	/**
	 * @throws SQLException
	 * @Title: getConnection
	 * @Description: 取得Connection
	 * @param @return
	 * @return Connection
	 * @throws
	 */
	public static Connection getConnection() {
		// 加载驱动,使用反射来实现
		Connection conn = null;
		try {
                        //驱动连接
			 Class.forName("oracle.jdbc.driver.OracleDriver");
			// 连接
			 String url = "jdbc:oracle:thin:@127.0.0.1:1521:ORCLE";
			 String username = "C##drp1";  //连接数据库的用户名
			 String password = "drp1";     //连接数据库的密码
			 conn = DriverManager.getConnection(url, username, password);  //进行连接
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		return conn;
	}


TestXMLImport中进行操作:



public static void main(String[] args) throws SQLException {
		// TODO Auto-generated method stub
//		执行插入的SQL语句
		String sql="insert into t_xml(NUMERO, REPOSICION, NOMBRE, TURNOS) values (?, ?, ?, ?)";
		Connection conn = null;
		PreparedStatement pstmt = null;
		try {
			conn = DbUtil.getConnection();
			pstmt = conn.prepareStatement(sql);
//			读取xml文件存放的路径
			Document doc=new SAXReader().read(new File("E:\\提高班学习资料\\接口管理系统\\Source\\test_xmlImport\\xml\\test01.xml"));
//			查找对应的信息,从XMl中找对应的层层关系
			List itemList= doc.selectNodes("/ACCESOS/item/SOCIO");
//			遍历
			for(Iterator iter=itemList.iterator();iter.hasNext();){
				Element el=(Element) iter.next();
//				使用Element的elementText属性取值,将值一一取出来
				String numero=el.elementText("NUMERO");
				String reposicion=el.elementText("REPOSICION");
				String nombre=el.elementText("NOMBRE");
				
//				返回集合
				List turnosList=el.elements("TURNOS");
				StringBuffer sbsString=new StringBuffer();
//				第二层循环,同理将值一一取出来赋值给变量sbsString
				for(Iterator  iter1=turnosList.iterator();iter1.hasNext();){
					Element turnosElt=(Element)iter1.next();
					String lu=turnosElt.elementText("LU");
					String ma=turnosElt.elementText("MA");
					String mi=turnosElt.elementText("MI");
					String ju=turnosElt.elementText("JU");
					String vi=turnosElt.elementText("VI");
					String sa=turnosElt.elementText("SA");
					String doo=turnosElt.elementText("DO");
					sbsString.append(lu + "," + ma + "," + mi + "," + ju + "," + vi + "," + sa + "," + doo);
				}
//				通过pstmt赋值
				pstmt.setString(1, numero);
				pstmt.setString(2, reposicion);
				pstmt.setString(3,nombre);
				pstmt.setString(4, sbsString.toString());
				pstmt.addBatch();
			}
			pstmt.executeBatch();
//			提示
			System.out.println("将XML导入数据库成功");
		 } catch (DocumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
//			关闭
			DbUtil.close(pstmt);
			DbUtil.close(conn);
		}
	}

     

工作完成,只要对其进行单元测试在console输出框中输出:


XMLSchema 到数据库表_XMLSchema 到数据库表_02


     

最后看我们的数据库信息:

XMLSchema 到数据库表_开发工具_03


     操作完成。对于操作的部分其实就是通过一一遍历读取的操作将其值赋值,通过PreparedStatement(预处理执行语句)操作将numero,reposicion,nombre,sbsString作为4个字段名,将值保存到数据库中的操作。