【问题标题】:Different ways or efficient ways of inserting records from JTable to Database将记录从 JTable 插入数据库的不同方式或有效方式
【发布时间】:2016-12-20 16:59:15
【问题描述】:

我正在做一个项目,我使用了几个 JTable 来接受和显示数据。我现在需要将记录插入到 3 个相关表中。

学费

id PK
gradelevel_id 
schoolyear_id

费用

id PK
title
amount
description
feetype_id

学费

id PK
tuition_id
fees_id

所以我想我会创建一个存储过程并将所有插入语句放在一个事务中。

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

第三步: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:在将所有记录插入数据库中的 MANY 表时,如何使用 JTables

问题 5: 我的桌子设计不好吗?有什么建议吗?

这是我创建的 GUI。

如果描述冗长,请见谅。如果有任何帮助,我将不胜感激。

提前致谢!

【问题讨论】:

  • “问题 5:” SO 是一个问答网站,而不是帮助台!当每个主题有一个明确、具体的问题时,它的效果最好。

标签: java mysql jdbc database-design jtable


【解决方案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)
      ;

【讨论】:

    猜你喜欢
    • 2011-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-23
    • 2016-10-14
    • 1970-01-01
    相关资源
    最近更新 更多