java将记录从JTable插入数据库的不同方法或有效方法
我正在从事一个项目,在这个项目中,我使用了几个JTable来接受和显示数据。我现在需要在3个相关表中插入记录
学费
id PK
gradelevel_id
schoolyear_id
费用
id PK
title
amount
description
feetype_id
学费
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:在tuition
表中插入1条记录
步骤1.1:SELECT LAST_INSERT_ID() INTO tuition_idVariable
步骤2:将许多费用从JTable
表插入fees
表
步骤2.1:SELECT LAST_INSERT_ID() INTO fees_idVariable
第三步: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
表时,如何处理JTables
问题5:我的桌子设计糟糕吗?有什么建议吗
这是我创建的GUI
抱歉,如果描述太长。我非常感谢你的帮助
提前谢谢
# 1 楼答案
不要使用存储过程。而是用PHP/Java/VB/etc代码进行调用,包括任何循环
可以构造(但不能在SP中)多行插入: