当前位置: 首页 > 知识库问答 >
问题:

JavaFX Sqlite Insert with Foreign Key

白学
2023-03-14

目前正在学习JavaFX和Sqlite。

我有一个用MySQL manager构建的Sqlite数据库,已经有外键规则等。

例如用户和地址:

CREATE TABLE "Benutzer" ("Benutzername" TEXT PRIMARY KEY  NOT NULL , "Vorname" VARCHAR, "Nachname" VARCHAR, "Email" TEXT UNIQUE , "Passwort" TEXT, "AdresseID" INTEGER, FOREIGN KEY(AdresseID) REFERENCES Adresse(AdresseID))

CREATE TABLE "Adresse" ("AdresseID" INTEGER PRIMARY KEY  NOT NULL , "Land" VARCHAR, "Stadt" VARCHAR, "Straße" TEXT, "Hausnr." INTEGER)

我将数据库连接到我的JavaFX应用程序,现在我正在尝试创建寄存器函数,因此新用户在fxml模板上,他可以填写“Benutzername”,“Vorname”等,以及他的地址“Land”,“Stadt”等。

以下是表格:

将这些值添加到数据库中是可行的,但是我不知道如何告诉javaFX被插入的这个当前用户必须将被插入的当前地址(它的地址ID)作为外键。

我在研究发现了这样的东西

mysql_insert_id返回当前使用的数据库连接生成的最后一个自动增量值。

但我不知道如何访问它。

这是我用来将数据填入数据库的模型:

public class RegisterModel {
Connection conection;

// Konstruktor
public RegisterModel() {
    conection = SqliteConnection.Connector();

    // Wenn die Verbindung nicht erfolgreich ist, dann App schließen
    if (conection == null) {
        System.out.println("connection not successful");
        System.exit(1);
    }
}

public boolean isDbConnected() {
    try {
        return !conection.isClosed();
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        return false;
    }
}

public boolean RegisterUser(String user_benutzername, String user_vorname, String user_nachname, String user_email,
        String user_passwort, String adress_land, String adress_stadt, String adress_strasse,
        String adress_hausnummer) throws SQLException {

    PreparedStatement preparedStatement = null;
    PreparedStatement preparedStatement_for_adress = null;

    // or ignore besprechen
    String query = "insert or ignore into Benutzer (Benutzername, Vorname, Nachname, Email, Passwort) values(?,?,?,?,?)";
    String query_adress = "insert into Adresse (Land, Stadt, Straße, 'Hausnr.') values(?,?,?,?)";

    try {
        preparedStatement = conection.prepareStatement(query);

        preparedStatement.setString(1, user_benutzername);
        preparedStatement.setString(2, user_vorname);
        preparedStatement.setString(3, user_nachname);
        preparedStatement.setString(4, user_email);
        preparedStatement.setString(5, user_passwort);
        System.out.println("Benutzer wurde eingefuegt");

        preparedStatement_for_adress = conection.prepareStatement(query_adress);

        preparedStatement_for_adress.setString(1, adress_land);
        preparedStatement_for_adress.setString(2, adress_stadt);
        preparedStatement_for_adress.setString(3, adress_strasse);
        preparedStatement_for_adress.setString(4, adress_hausnummer);
        System.out.println("Adresse wurde eingefügt");

        preparedStatement.executeUpdate();
        preparedStatement_for_adress.executeUpdate();
        return true;

    } catch (Exception e) {
        e.printStackTrace(); 
        return false;
    } finally {
        preparedStatement.close();
        preparedStatement_for_adress.close();

    }
}

}

我想一定有第三个查询,它获取当前地址的AdressID并将其分配给当前用户作为他的地址?这是最有趣的部分:

String query = "insert or ignore into Benutzer (Benutzername, Vorname, Nachname, Email, Passwort) values(?,?,?,?,?)";
    String query_adress = "insert into Adresse (Land, Stadt, Straße, 'Hausnr.') values(?,?,?,?)";

共有1个答案

鞠侯林
2023-03-14
  1. 您应该首先插入地址,并带有准备语句
  2. 检索地址的ID(最后插入的ID),请参见检索最后插入的ID的准备语句Java
  3. 现在插入步骤2中声明的AddressIdUser。因此,您必须在userINSERT INTO语句中包含AddressId列。

您的用户插入查询应该变成:

String query = "insert or ignore into Benutzer (Benutzername, Vorname, Nachname, Email, Passwort, AddressId) values(?,?,?,?,?,[put last_inserted_id here)";
 类似资料:

相关问答

相关文章

相关阅读