最近在做一个动态数据导入的功能。可是遇到了一定的困难。。有可能是需求不太明确。
解决方案 »
- zk中foreach与组件model绑定数据的区别
- 用java如何实现 html只保留img标签?
- 关于Struts2页面传值的问题,请教高手帮忙
- 在jsp加载时就能访问到servlet处理数据,请高人指点,一定结帐,谢谢!!!!!!!!!!!!
- session 失效问题,刚登陆,能取道session值,但是一会儿就失效!
- html能不能实现选择文件夹
- 求助:一个JSP调用存储过程的问题,望高手帮忙~~~~
- 请教,javabean应该放在那个文件夹下??
- 小生刚想学JSP,请问apache在哪里下载?
- Spring Boot 为什么我后缀设置的是JSP可还是访问不了
- 关于文件上传问题 请高手帮忙
- java之static
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(); } }
/** * 根据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
制订导入项规则
制订文件导入项
导入电子数据
这三个功能模块 第一个是管理员在一个列表页面选中他想导入的数据内容(选中一些字段信息)记录保存在一个基表里。
第二个是管理员在制定规则的时候,他会找刚才选中的哪些字段属于哪个资料类型(图书 期刊 博硕士论文 会议论文 技术期刊文章)这5种类型,这块有一个录入刚才选中的字段文件名的功能。主要是字段对应的xml里的节点信息,也就是需要导入的哪个字段信息。操作完成后。
进入导入电子数据 模块,
页面上有一个导入的按钮。只要选中刚才录入的相应的哪条记录。(存放记录的是一个中间表里)
还有一个传文件存放位置的浏览功能,后台只要得到xml文件的url就行,然后开始执行导入操作,在导入之前先去哪个中间表信息。得到文件名和要导入的哪个字段属于哪个表。然后拼接sql。做一些逻辑判断。。
现在问题出在管理员选中的字段和数据文件节点的匹配上。还有动态sql的拼接。谢谢。。