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

Dropwizard JDBI插入数据时自动生成主键问题咨询

在Dropwizard + JDBI中实现带自动主键生成的Insert方法重写

嘿,你已经找对了核心方向——用@GetGeneratedKeys注解获取插入后生成的主键,这是JDBI处理自增主键的标准操作。如果要以@Override的形式重写这个insert方法,我们可以通过继承JDBI的AbstractDAO来实现,既能满足你要的重写形式,还能灵活添加自定义逻辑。

首先假设你的DAO接口定义如下:

public interface DatasetDAO {
    @GetGeneratedKeys
    @SqlUpdate("INSERT INTO DATASET (XAXIS, YAXIS) VALUES (:xaxis,:yaxis)")
    long insert(@Bind("xaxis") String xaxis, @Bind("yaxis") String yaxis);
}

接下来创建实现类,继承AbstractDAO并实现接口,在这里重写insert方法:

public class DatasetDAOImpl extends AbstractDAO<Dataset> implements DatasetDAO {

    // 构造方法传入JDBI的Handle,Dropwizard会自动注入该实例
    public DatasetDAOImpl(Handle handle) {
        super(handle);
    }

    @Override
    @GetGeneratedKeys
    @SqlUpdate("INSERT INTO DATASET (XAXIS, YAXIS) VALUES (:xaxis,:yaxis)")
    public long insert(@Bind("xaxis") String xaxis, @Bind("yaxis") String yaxis) {
        // 这里可以添加自定义逻辑,比如参数校验、日志打印
        if (xaxis == null || yaxis == null) {
            throw new IllegalArgumentException("X轴和Y轴数据不能为空");
        }
        // 调用父类方法执行实际插入操作,返回生成的主键值
        return super.insert(xaxis, yaxis);
    }
}

关键细节说明:

  • 继承AbstractDAO:这个类是JDBI提供的基础DAO抽象类,封装了数据库连接(Handle)的管理,不用我们手动处理连接的创建与关闭。
  • @Override注解:因为我们实现了DatasetDAO接口中的insert方法,添加这个注解既符合语法规范,也能让编译器帮你检查方法签名是否匹配。
  • 保留核心注解:@GetGeneratedKeys和@SqlUpdate绝对不能丢——前者告诉JDBI执行插入后要返回生成的主键值,后者定义了具体的插入SQL语句。
  • 表结构要求:务必确保你的dataset表的id字段是自增类型(比如MySQL的AUTO_INCREMENT,PostgreSQL的SERIAL或GENERATED AS IDENTITY),否则@GetGeneratedKeys无法获取到主键。

如果你的项目用的是JDBI 3.x及以上版本,也可以在DAO接口里写默认方法,但用AbstractDAO实现类的方式扩展性更强,适合后续添加更多复杂的自定义逻辑。

内容的提问来源于stack exchange,提问作者A.Dumas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:39:59