我正在开展一个项目,在那里我使用了几个JTable来接受和显示数据。我现在处于需要将记录插入3个相关表的位置。
学费
id PK
gradelevel_id
schoolyear_id
费
id PK
title
amount
description
feetype_id
tuition_fee
id PK
tuition_id
fees_id
所以我想我创建了一个存储过程并将所有insert语句放在一个事务中。
CREATE DEFINER=`root`@`localhost` PROCEDURE `createTuition`(aFeeTitle VARCHAR(100),aFeeAmount DECIMAL, aFeeDescription TEXT, aFeeTypeId INT, aGradeLevelId INT, aSchoolYearId INT)
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK; RESIGNAL;
END;
DECLARE tuition_idVariable INT;
DECLARE fees_idVariable INT;
START TRANSACTION;
-- INSERT statement 1
INSERT INTO tuition(gradelevel_id,schoolyear_id)
VALUES(aGradeLevelId, aSchoolYearId);
SELECT LAST_INSERT_ID() INTO tuition_idVariable;
-- INSERT statement 2
-- this insert on `fees` I'm not sure if I can put within the transaction -- together with the insert on tuition table because I will need to do an -- iterated call on this procedure to get the records on JTable
INSERT INTO fees(title,amount,description,feetype_id)
VALUES(aFeeTitle,aFeeAmount,aFeeDescription,aFeeTypeId);
SELECT LAST_INSERT_ID() INTO fees_idVariable;
-- INSERT statement 3
INSERT INTO tuition_fee(tuition_id,fees_id)
VALUES(tuition_idVariable,fees_idVariable);
COMMIT;
END
因此,如果每1学费收取很多费用,我就需要在存储过程中存在的事务中执行以下操作。
START TRANSACTION;
步骤1:将1条记录插入tuition
表
步骤1.1:SELECT LAST_INSERT_ID() INTO tuition_idVariable
第2步:从JTable
到fees
表
步骤2.1:SELECT LAST_INSERT_ID() INTO fees_idVariable
第3步:INSERT INTO tuition_fee(tuition_id, fees_id) VALUES(tuition_idVariable, fees_idVariable);
在第2步,我必须遍历包含费用的JTable
的每一行,这使得我认为可能存在将JTable
批量记录作为参数传递给存储过程。
问题1:这样可能还是我还需要像这样创建一个for循环?
for(int i=0; i<Jtable.getRowCount(); i++){
String value = (String) getValueAt(i,columnNumber);
classname.createTuition(arguments);
}
问题2:此外,如果没有可能的方法在creatTuition()
方法上没有迭代调用的情况下将多行(在步骤2中)插入费用,是否最好创建两个存储过程?
问题3:当我使用JTables
时,我习惯于对存储过程进行迭代调用,就像我for
循环中显示的内容一样来存储记录到数据库。这是一个好习惯吗?是否有更好,更有效的方法?
问题4 :在将所有记录插入数据库中的JTables
表时,如何使用MANY
?
问题5:我的桌面设计不好吗?有什么建议吗?
这是我创建的GUI。
很抱歉,描述很冗长。我一定会感激任何帮助。
提前致谢!
答案 0 :(得分:1)
不要使用存储过程。而是在PHP / Java / VB / etc代码中进行调用,包括任何循环。
您可以构建(但不在SP中)多行INSERT:
INSERT INTO tuition_fee(tuition_id, fees_id)
VALUES
(tuition_idVariable, $fee1),
(tuition_idVariable, $fee2),
(tuition_idVariable, $fee3)
;