You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从Java DAO中获取H2数据库的自增ID

解决H2自增ID的获取问题

一、查询时将自增ID映射到Person对象

你当前的核心问题是查询PEOPLE表时,未读取自增ID列的值并映射到Person对象,同时你误用了JPA注解(@Id、@GeneratedValue)——因为你用的是原生JDBC,这些注解仅在JPA框架(如Hibernate、Spring Data JPA)中生效,直接添加不会起作用,需要移除。

步骤1:修改Person类

添加id字段,补充包含id的构造方法和getter:

public class Person {
    private int id;
    private String name;
    
    // 用于查询时初始化带ID的对象
    public Person(int id, String name) {
        this.id = id;
        this.name = name;
    }
    
    // 保留原有构造方法(用于插入前创建对象)
    public Person(String name) {
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }
}

步骤2:修改DAO的getPeopleList方法

从ResultSet中读取ID列值,传入新的Person构造方法:

public static ObservableList<Person> getPeopleList(ResultSet rs) throws SQLException {
    ObservableList<Person> peopleList = FXCollections.observableArrayList();
    while (rs.next()) {
        Person person = new Person(
            rs.getInt("ID"),
            rs.getString("NAME")
        );
        peopleList.add(person);
    }
    return peopleList;
}

修改后,查询得到的Person对象就会包含数据库中实际的自增ID。

二、插入新记录后获取自增ID

如果需要在插入新Person后立即获取数据库生成的自增ID,需修改insertPerson方法,借助JDBC的RETURN_GENERATED_KEYS参数实现:

修改PeopleDAO的insertPerson方法

public static int insertPerson(String name) throws SQLException, ClassNotFoundException {
    String sql = "INSERT INTO PEOPLE (NAME) VALUES (?)";
    try (Connection conn = getConnection();
         // 传入参数告知JDBC返回生成的自增键
         PreparedStatement statement = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS)) {
        statement.setString(1, name);
        statement.executeUpdate();
        
        // 提取生成的自增ID
        try (ResultSet generatedKeys = statement.getGeneratedKeys()) {
            if (generatedKeys.next()) {
                return generatedKeys.getInt(1);
            } else {
                throw new SQLException("插入失败,未获取到自增ID");
            }
        }
    } catch (SQLException | ClassNotFoundException e) {
        throw e;
    }
}

调用该方法时可直接获取新记录的ID,用于初始化Person对象:

int newId = PeopleDAO.insertPerson("张三");
Person newPerson = new Person(newId, "张三");

三、额外注意

  • 若你的DBHelpers类封装了通用的executeUpdate方法,插入场景下不能直接复用,需单独实现支持返回生成键的逻辑,或修改DBHelpers提供对应重载方法。

内容的提问来源于stack exchange,提问作者avalc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 09:01:14