使用JDBC

时间:2018-10-15 19:59:15

标签: java sql jdbc hsqldb

因此,我尝试使用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, ?, ?);

并且表是用这个生成的:

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"}
     ]
   }

我的猜测是它们应该保存在单独的表中,但是我该怎么办?当我需要获取该对象时,又该如何整体上获取它。

1 个答案:

答案 0 :(得分:1)

数据的SQL模型与Java和Java的不同之处在于如何将Plant和PlantParts对象链接在一起。在Java模型中,Plant具有PlantParts对象的集合。在SQL模型中,PlantParts对象引用Plant对象。

因此您需要以下两个表:

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)
);

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