如何将多组XML值存储到Java并传入PreparedStatement?
处理多组XML数据并批量插入数据库的解决方案
这个问题其实很常见——当XML里包含多组重复结构的数据时,我们只需要把每组数据封装成对象,再批量处理插入就可以了。我给你一步步拆解解决方案:
第一步:封装每组数据为实体类
首先,我们创建一个简单的实体类,用来存储每组<src>到<prefix>的数据,这样代码会更清晰易维护:
public class InsertRecord { private String src; private String dest; private String svcFlag; private String svcClass; private String svcTypeID; private String callCode; private String prefix; // Getter和Setter方法 public String getSrc() { return src; } public void setSrc(String src) { this.src = src; } public String getDest() { return dest; } public void setDest(String dest) { this.dest = dest; } public String getSvcFlag() { return svcFlag; } public void setSvcFlag(String svcFlag) { this.svcFlag = svcFlag; } public String getSvcClass() { return svcClass; } public void setSvcClass(String svcClass) { this.svcClass = svcClass; } public String getSvcTypeID() { return svcTypeID; } public void setSvcTypeID(String svcTypeID) { this.svcTypeID = svcTypeID; } public String getCallCode() { return callCode; } public void setCallCode(String callCode) { this.callCode = callCode; } public String getPrefix() { return prefix; } public void setPrefix(String prefix) { this.prefix = prefix; } }
第二步:修改XML解析逻辑,批量收集数据
你的原始XML结构是每组7个标签(src→dest→svcFlag→svcClass→svcTypeID→callCode→prefix)重复出现,所以我们可以按这个固定顺序遍历节点,每7个节点为一组,封装成InsertRecord对象并加入列表:
// 假设你已经获取到<newInsert>对应的Element对象:newInsertElement List<InsertRecord> records = new ArrayList<>(); NodeList childNodes = newInsertElement.getChildNodes(); InsertRecord currentRecord = null; int fieldCounter = 0; for (int i = 0; i < childNodes.getLength(); i++) { Node node = childNodes.item(i); // 跳过XML中的空白文本节点(比如换行、空格) if (node.getNodeType() != Node.ELEMENT_NODE) { continue; } Element element = (Element) node; String tagName = element.getTagName(); String text = element.getTextContent(); // 每7个字段开始新的一组记录 if (fieldCounter % 7 == 0) { currentRecord = new InsertRecord(); records.add(currentRecord); } // 根据标签名给当前记录赋值 switch (tagName) { case "src": currentRecord.setSrc(text); break; case "dest": currentRecord.setDest(text); break; case "svcFlag": currentRecord.setSvcFlag(text); break; case "svcClass": currentRecord.setSvcClass(text); break; case "svcTypeID": currentRecord.setSvcTypeID(text); break; case "callCode": currentRecord.setCallCode(text); break; case "prefix": currentRecord.setPrefix(text); break; } fieldCounter++; }
第三步:使用PreparedStatement批量插入数据库
现在我们有了所有记录的列表,接下来用JDBC的批处理功能批量插入,这比单条插入效率高得多:
String ins_query = "INSERT INTO your_table (src, dest, svcFlag, svcClass, svcTypeID, callCode, prefix) VALUES (?, ?, ?, ?, ?, ?, ?)"; // 使用try-with-resources自动关闭资源 try (PreparedStatement st = con.prepareStatement(ins_query)) { for (InsertRecord record : records) { // 给占位符赋值 st.setString(1, record.getSrc()); st.setString(2, record.getDest()); st.setString(3, record.getSvcFlag()); st.setString(4, record.getSvcClass()); st.setString(5, record.getSvcTypeID()); st.setString(6, record.getCallCode()); st.setString(7, record.getPrefix()); // 将当前SQL添加到批处理队列 st.addBatch(); } // 执行批量插入,返回每条SQL影响的行数 int[] affectedRows = st.executeBatch(); // 可选:验证插入结果 for (int rows : affectedRows) { if (rows <= 0) { System.out.println("某条记录插入失败"); } } } catch (SQLException e) { e.printStackTrace(); // 这里可以添加自定义的异常处理逻辑,比如回滚事务 }
额外优化建议
如果你的XML结构可以调整,建议把每组数据放到一个独立的子元素里,比如:
<newInsert> <record> <src>BUDDY</src> <dest>12345</dest> <svcFlag>15</svcFlag> <svcClass>0</svcClass> <svcTypeID>ABCD</svcTypeID> <callCode></callCode> <prefix></prefix> </record> <record> <src>BUDDY</src> <dest>1245</dest> <svcFlag>15</svcFlag> <svcClass>1</svcClass> <svcTypeID>ABDC</svcTypeID> <callCode></callCode> <prefix></prefix> </record> </newInsert>
这种结构下解析会更简单,直接遍历所有<record>节点,每个节点的处理逻辑和你原来的单组XML逻辑几乎一致,不需要按计数器分组,代码可读性会更强。
内容的提问来源于stack exchange,提问作者user11807402
相关产品推荐
相关产品推荐

