刚学习java不久,在做DRP分销商管理这个项目中,发现很多新东西,需要我们不断总结。今天我们就来介绍一下导入XML文件。

       在实际应用中,导入是一项很重要的功能,一般来说我们常用的是导入Excel,Word等,但是今天我们要导入的是XML文件,因为XML是一种纯文本文件,具有很好的兼容性和可扩展性,在数据传输和共享的时候更具有通用性。


1、需要导入的XML文件

       文件中每一个标签如< NUMERO >、< REPOSICION >等,对应数据库中的一个字段。当我们引入相应的jar包,如dom4j等,之后就可以编写导入的方法。

<?xml version="1.0" encoding="utf-8"?>
<ACCESOS>
    <item>
        <SOCIO>
            <NUMERO>00045050</NUMERO>
            <REPOSICION>0</REPOSICION>
            <NOMBRE>MOISES MORENO</NOMBRE>
            <TURNOS>
                <LU>T1</LU>
                <MA>T2</MA>
                <MI>T3</MI>
                <JU>T4</JU>
                <VI>T5</VI>
                <SA>T6</SA>
                <DO>T7</DO>
            </TURNOS>
        </SOCIO>
    </item>
    <item>
        <SOCIO>
            <NUMERO>00045051</NUMERO>
            <REPOSICION>0</REPOSICION>
            <NOMBRE>RUTH PENA</NOMBRE>
            <TURNOS>
                <LU>S1</LU>
                <MA>S2</MA>
                <MI>S3</MI>
                <JU>S4</JU>
                <VI>S5</VI>
                <SA>S6</SA>
                <DO>S7</DO>
            </TURNOS>
        </SOCIO>
    </item>
</ACCESOS>

2、连接数据库的类方法

       此类用于连接数据库,类似于之前在.net那边使用的SQLHelper。

/**
 * 封装数据常用操作
 * @author Administrator
 *
 */
public class DbUtil {

    /**
     * 取得Connection
     * @return
     */
    public static Connection getConnection(){
        Connection conn=null;
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");//加载驱动
            String url="jdbc:oracle:thin:@192.168.26.206:1521:ORCL"; 
            //连接数据库的用户名和密码
            String username="shiqidrp";
            String password="shiqidrp";

            conn=DriverManager.getConnection(url,username,password);

        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return conn;
    }

    /**
     * 关闭ResultSet对象,释放资源
     * @param rs
     */
    public static void close(ResultSet rs)
    {
        if(rs!=null)
        {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 关闭Connection对象,释放资源
     * @param conn
     */
    public static void close(Connection conn)
    {
        if(conn!=null) 
        {
            try {
                conn.close();
            }catch(SQLException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 关闭PreparedStatement对象,释放资源
     * @param pstmt
     */
    public static void close(PreparedStatement pstmt)
    {
        if(pstmt!=null) 
        {
            try {
                pstmt.close();
            }catch(SQLException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 关闭Statement对象,释放资源
     * @param pstmt
     */
    public static void close(Statement pstmt)
    {
        if(pstmt!=null) 
        {
            try {
                pstmt.close();
            }catch(SQLException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 开启事务
     * @param conn
     */
    public static void beginTransaction(Connection conn)
    {
        try {
            if(conn!=null){
                if(conn.getAutoCommit())
                {
                    conn.setAutoCommit(false);
                }
            }
        } catch (SQLException e) {
        }
    }
    /**
     * 关闭事务
     * @param conn
     */
    public static void commitTransaction(Connection conn)
    {
        try {
            if(conn!=null){
                if(!conn.getAutoCommit())
                {
                    conn.commit();
                }
            }
        } catch (SQLException e) {
        }
    }
    /**
     * 回滚事务
     * @param conn
     */
    public static void rollbackTransaction(Connection conn)
    {
        try {
            if(conn!=null){
                if(!conn.getAutoCommit())
                {
                    conn.rollback();
                }
            }
        } catch (SQLException e) {
        }
    }
    /**
     * 重置事务
     * @param conn
     */
    public static void resetTransaction(Connection conn)
    {
        try {
            if(conn!=null){
                if(conn.getAutoCommit())
                {
                    conn.setAutoCommit(false);
                }else{
                    conn.setAutoCommit(true);
                }
            }
        } catch (SQLException e) {
        }
    }
}

3、执行导入的类

       利用此类,读取XML文件中的数据并保存到数据库中。

public class TestXMLImport {

    /**
     * @param args
     */
    public static void main(String[] args) {
        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 document=new SAXReader().read(new File("G:/提高班/7DRP/drp/test_xmlImport/xml/test01.XML"));
            //获得我们所需要的节点集
            List itemList=document.selectNodes("/ACCESOS/item/SOCIO");
            //循环得到节点集中元素,并转化成SQL语句
            for(Iterator iterator=itemList.iterator();iterator.hasNext();)
            {
                //得到相应的节点的值
                Element element=(Element)iterator.next();
                String numero = element.elementText("NUMERO");
                String reposicion = element.elementText("REPOSICION");
                String nombre = element.elementText("NOMBRE");
                List turnosList=element.elements("TURNOS");
                StringBuffer sbBuffer=new StringBuffer();
                //循环得到TURNOS节点下的元素,并拼成串
                for(Iterator iterator1=turnosList.iterator();iterator1.hasNext();)
                {
                    Element turnosElt = (Element)iterator1.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");
                    sbBuffer.append(lu + "," + ma + "," + mi + "," + ju + "," + vi + "," + sa + "," + doo);
                }
                //给SQL语句赋值
                pstmt.setString(1, numero);
                pstmt.setString(2, reposicion);
                pstmt.setString(3, nombre);
                pstmt.setString(4, sbBuffer.toString());
                //保存生成的SQL语句
                pstmt.addBatch();
            }
            //批量执行SQL语句
            pstmt.executeBatch();
            System.out.println("將xml導入成功");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

4总结

       我们在学习过程中,不要仅仅为了实现功能,最主要的还是了解实现的这个过程,这种思路,当我们下次再导入其他格式的文件时就可以自己动手实现了。总之,学习在于总结出的学习方法,如何让学习变得简单,就看我们怎么做总结了。