Java 通过JDBC将外键的可变长度列表作为参数传递给存储过程,然后使用这些列表将行插入表中

Java 通过JDBC将外键的可变长度列表作为参数传递给存储过程,然后使用这些列表将行插入表中,java,mysql,stored-procedures,jdbc,Java,Mysql,Stored Procedures,Jdbc,我需要构造一个事务/存储过程,它接收两个外键列表,并从这些外键向表中插入新行 具体地说,我有一个表,它具有与订单对应的订单ID和项目ID。我需要在提交订单时添加到此表 为了用代码进行总结,我想做以下几点: DELIMITER ## BEGIN CREATE STORED PROCEDURE addOrder(IN itemIds VARCHAR(255), IN orderIds VARCHAR(255)) // ----- SQL Equivalent of ----- // for (int

我需要构造一个事务/存储过程,它接收两个外键列表,并从这些外键向表中插入新行

具体地说,我有一个表,它具有与订单对应的订单ID和项目ID。我需要在提交订单时添加到此表

为了用代码进行总结,我想做以下几点:

DELIMITER ##
BEGIN
CREATE STORED PROCEDURE addOrder(IN itemIds VARCHAR(255), IN orderIds VARCHAR(255))
// ----- SQL Equivalent of -----
// for (int i = 0; i < itemIds.length; ++i)
// INSERT INTO Items_Ordered(item_id, order_id) VALUES(itemIds[i], order_ids[i]);
// -----------------------------
END ##
DELIMITER ;
有什么想法吗

编辑#1:

我真的,真的,真的不喜欢这个老套的解决方案:

编辑#2:


我考虑的另一个解决方案是在存储过程中使用输入创建一个临时表,但我也不知道如何做到这一点。

创建一个字符串拆分函数,如下所示:


然后,您可以将逗号分隔的字符串拆分为离散值进行插入。

您必须在存储过程中执行此操作吗?您考虑过直接从Java插入吗?我正在开发一个Web服务/API,它不需要(几乎不需要)了解它所使用的底层数据库。它只需要知道存储过程名称及其所需的参数。那么,我必须这么做吗?不,我想去吗?是的,有充分的理由。我觉得这个设计仍然有缺陷。如果确实要实现“存储过程”模型,请创建一个插入单个对的过程,然后在事务中多次调用该过程。这样,您就可以更好地控制和管理您的否定测试用例。这不是过程中发生的唯一一件事,但即使是这样,也必须立即添加所有项,否则就不添加。因此,这一切都必须在一个事务中完成。如果我不是MySQL noob,这可能是可行的。谢谢。亲爱的,我在这里找到了一个好的,简单的字符串拆分器:谢谢你的建议。。。我想我现在可以解决它了。
String listOfItems = '1, 2, 6, 7, 8';
String listOfOrders = '2, 1, 99, 82, 7';
PreparedStatement ps = connection.prepareCall("CALL addOrder(" + listOfItems + ", " + listOfOrders + ")");
ps.executeUpdate();