之前了解过一篇,是通过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下建立一个包,在其中建立两个类,一个用来存放执行方法,另一个用来和数据库进行连接
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输出框中输出:
最后看我们的数据库信息:
操作完成。对于操作的部分其实就是通过一一遍历读取的操作将其值赋值,通过PreparedStatement(预处理执行语句)操作将numero,reposicion,nombre,sbsString作为4个字段名,将值保存到数据库中的操作。