最近在做一个动态数据导入的功能。可是遇到了一定的困难。。有可能是需求不太明确。

解决方案 »

  1.   

    JAVA将XML文件导入到SQLSERVER中
     XmlLoadFactory.javapackage com.nova.comm.xmltodatabase; import java.io.File;import java.sql.Connection;import java.sql.DatabaseMetaData;import java.sql.ResultSet;import java.sql.ResultSetMetaData;import java.sql.SQLException;import java.sql.Statement;import java.util.ArrayList;import java.util.Hashtable;import java.util.List; import org.apache.log4j.Logger;import org.jdom.Document;import org.jdom.Element;import org.jdom.JDOMException;import org.jdom.input.SAXBuilder; import com.nova.comm.database.DAO;  /** * 数据导入配置文件读取 */public class XmlLoadFactory {        /**        * 读取配置文件        *         * @param confPath        *            配置文件路径        * @return 返回数据导入配置文件类对象        */       public static DBImportConf getDBImportConf(String confPath) throws DBImportException {               SAXBuilder sb = new SAXBuilder();              DBImportConf conf = null;              Document doc = null;              try {                     doc = sb.build(confPath); // 构造文档对象                     Element root = doc.getRootElement(); // 获取根元素                     Element dbElement = root.getChild("db");                     String startPath = dbElement.getChildText("start-path");                     String endPath = dbElement.getChildText("end-path");                     String startTime = dbElement.getChildText("start-time");                     String delUpdTable = dbElement.getChildText("del-update-table");                     conf = new DBImportConf();                     conf.setStartPath(startPath);                     conf.setEndPath(endPath);                     conf.setStartTime(startTime);                     conf.setDelUpdTable(delUpdTable);              } catch (JDOMException e) {                     // TODO Auto-generated catch block                     e.printStackTrace();                     throw new DBImportException("读取配置文件出错(JDOMException)"+e.getMessage());              } catch (Exception e) {                     // TODO Auto-generated catch block                     e.printStackTrace();                     throw new DBImportException("读取配置文件出错(IOException)"+e.getMessage());                                   }              return conf;       }         public static void main(String[] args){              DAO dao = new DAO();              Connection con = dao.getConnection();              DatabaseMetaData dbmd;              try {                     Statement st = con.createStatement();                     ResultSet rs3 = st.executeQuery("select * from clk where 1=2");                     ResultSetMetaData rsmd = rs3.getMetaData();                     for(int i=1;i<=rsmd.getColumnCount();i++){                            System.out.println(rsmd.getColumnName(i));                            System.out.println(rsmd.getColumnTypeName(i));                            System.out.println();                     }               } catch (SQLException e) {                     // TODO Auto-generated catch block                     e.printStackTrace();              }       }      
      

  2.   


     /**        * 根据xml文件导入数据库        *         * @param con        *            数据库连接        * @param xmlFile        *            xml文件        * @return 正常返回大于0,错误返回小于0        */       public static int exeDBOperByXml(DBImportConf conf,Connection con, File xmlFile) {              String action = "insert";              String dbType = "sqlserver";              SAXBuilder sb = new SAXBuilder();              Document doc;              Logger log = Logger.getLogger("XmlLogFactory.exeDBOperByXml");              String msg = "";                            try {                     doc = sb.build(xmlFile); // 构造文档对象                     Element root = doc.getRootElement(); // 获取根元素                     Element dataElement = root.getChild("data"); // 获取data子元素                      List tableList = dataElement.getChildren();                     for(int i=0;i<tableList.size();i++){                                                        Element tableData = (Element)tableList.get(i); //获取table元素                            String tableName = tableData.getChild("name").getName();//获取表名称                            String spaAction = "";                            String fileName = xmlFile.getName();                            String kyzCode = fileName.substring(0,fileName.indexOf("-"));//从文件名中获取的客栈编码                            StringBuffer delSqlBuf = new StringBuffer();                            List rowList = tableData.getChild("rows").getChildren("row");//获取table元素中所有的row元素                             boolean spaTable = false;                            for(int j=0;j<rowList.size();j++){                                   List fieldList = ((Element)rowList.get(j)).getChildren();//获取所有列名                                   UnitData data = new UnitData();                                   data.setDbType(dbType);                                   data.setAction(action);                                   data.setTableName(tableName);                                   String spaSql = " where 1=1 ";                                                                      for(int k=0;k<fieldList.size();k++){//循环取出列值                                          Element field = (Element)fieldList.get(k);                                          String fieldName = field.getName();                                          String fieldValue = field.getName();                                          fieldValue = fieldValue.trim();                                          /**if(tableName.toLowerCase().equals("clk") &&                                                         (fieldName.toLowerCase().equals("kyz")                                                                       || fieldName.toLowerCase().equals("cph"))){                                                                                                  spaSql += " and "+fieldName+"='"+fieldValue+"'";                                          }                                          */                                          String fieldType = "";                                          Statement st = null;                                          ResultSet rs = null;                                          ResultSetMetaData rsmd = null;                                          String sql = "select "+ fieldName +" from " + tableName +" where 1=2";                                          try {                                                 st = con.createStatement();                                                 rs = st.executeQuery(sql);                                                 rsmd = rs.getMetaData();                                                 fieldType = rsmd.getColumnTypeName(1);//获取数据库中,字段的类型                                          } catch (SQLException e) {                                                 // TODO Auto-generated catch block                                                 msg = "获取字段类型错误,表名:"                                                        +tableName+", \r\n"+"字段名:"+fieldName                                                        +" \r\n错误信息:"+e.getMessage();                                                 log.error(msg);                                                 e.printStackTrace();                                          }finally{                                                 try {                                                        rs.close();                                                        st.close();                                                 } catch (SQLException e) {                                                        // TODO Auto-generated catch block                                                        msg = "获取字段类型关闭ResultSet和Statement时错误,表名:"                                                               +tableName+", \r\n"+"字段名:"+fieldName                                                               +" \r\n错误信息:"+e.getMessage();                                                        log.error(msg);                                                        e.printStackTrace();                                                 }                                          }                                          FieldData fieldData = new FieldData(fieldName,                                                        fieldType, 20, fieldValue);                                          data.addField(fieldData);                                   }                                                                      // 根据数据单元拼装sql                                   ParseUnitDataInf sqlParse = null;                                   if ( data.getDbType() != null                                                 && data.getDbType().equals("sqlserver") ){                                          sqlParse = new ParseUnitDataBySqlServer();                                                                             }                                          else {                                          continue;                       &nbs
      

  3.   

    首先是这块的功能主要是分三个模块。
    制订导入项规则
    制订文件导入项
    导入电子数据
     这三个功能模块 第一个是管理员在一个列表页面选中他想导入的数据内容(选中一些字段信息)记录保存在一个基表里。  
     
    第二个是管理员在制定规则的时候,他会找刚才选中的哪些字段属于哪个资料类型(图书 期刊 博硕士论文 会议论文 技术期刊文章)这5种类型,这块有一个录入刚才选中的字段文件名的功能。主要是字段对应的xml里的节点信息,也就是需要导入的哪个字段信息。操作完成后。
    进入导入电子数据 模块,
    页面上有一个导入的按钮。只要选中刚才录入的相应的哪条记录。(存放记录的是一个中间表里)
    还有一个传文件存放位置的浏览功能,后台只要得到xml文件的url就行,然后开始执行导入操作,在导入之前先去哪个中间表信息。得到文件名和要导入的哪个字段属于哪个表。然后拼接sql。做一些逻辑判断。。
    现在问题出在管理员选中的字段和数据文件节点的匹配上。还有动态sql的拼接。谢谢。。