使用 JDBC 将 List<Object> 作为变量添加到数据库

Adding List<Object> as a variable to database using JDBC

所以我正在尝试使用 JDBC 和文件中的 HSQLDB 添加到数据库中。我需要将 List<Object> 作为变量插入到数据库中。

这是 Java 对象的样子:

public class Plant {

    private Long id;
    private String plantName;
    private List<PlantParts> plantParts;
    ... 
}

public class PlantParts {
    private String leaves;
    private String pedicle;
    private String petals;
    ...
}

在文件夹 resources 中,我有一个名为 insert_plant.sql 的文件,其中包含以下查询:

INSERT INTO PLANTS (id, plantname, plantparts)
  VALUES (NEXT VALUE FOR sequence, ?, ?);

table 是这样生成的:

CREATE SEQUENCE sequence START WITH 1;

CREATE TABLE PLANTS (
   id BIGINT NOT NULL PRIMARY KEY,
   plantname VARCHAR(255) NOT NULL,
   plantparts VARCHAR(255) NULL,  //No idea what to put here
);

现在 Java 我称之为:

public static void insertIntoOrderTable(BasicDataSource basicDataSource, String plantname, List<PlantParts> plantparts) throws  SQLException{
    Connection conn = null;
    PreparedStatement stmt = null;

    try {
        conn = basicDataSource.getConnection();
        stmt = conn.prepareStatement(Util.readFileFromClasspath("insert_plant.sql"), new String[]{"id"});
        stmt.setString(1, plantname);
        stmt.setString(2, plantparts); //And no idea what to do here
        stmt.executeUpdate();


    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        if (stmt != null) {
            stmt.close();
        }
        if (conn != null) {
            conn.close();
        }
    }

请求通常以 JSON:

的形式出现
   { "id": 5,
     "plantName": "awesome plant",
     "plantParts":[
       {"leaves":"green","pedicle":"yellow","petals":"many"},
       {"leaves":"red","pedicle":"yellow","petals":"few"}
     ]
   }

我的猜测是它们应该保存在单独的 table 中,但我该怎么做,当我需要获取对象时,我如何才能将其作为一个整体获取。

您的数据的 SQL 模型与 Java 的不同之处在于 Plant 和 PlantParts 对象的链接方式。在 Java 模型中,Plant 有一组 PlantParts 对象。在 SQL 模型中,PlantParts 对象引用 Plant 对象。

所以你需要这两个 table:

CREATE TABLE plants (
   id BIGINT NOT NULL PRIMARY KEY,
   plantname VARCHAR(255) NOT NULL,
);

CREATE TABLE plantparts (
   id BIGINT NOT NULL PRIMARY KEY,
   leaves VARCHAR(255) NOT NULL,
   pedicles VARCHAR(255) NOT NULL,
   petals VARCHAR(255) NOT NULL,
   plantid BIGINT NOT NULL,
   FOREIGN KEY (plantid) REFERENCES plants(id)
);

请注意,PlantParts 对象的 plants table 中没有列。 JSON 对象中 PlantParts 的数据进入两行 plantparts table。这两行的 plantid 列将包含 Plant 对象的 ID,即 5。