You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将多组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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 09:18:24