如何在春季向 DB 插入一行,仅使用自动生成的值,并返回一个 ID?

Posted

技术标签:

【中文标题】如何在春季向 DB 插入一行,仅使用自动生成的值,并返回一个 ID?【英文标题】:How to insert a row to DB in spring, using only auto-generated values, and return an ID? 【发布时间】:2016-04-20 11:25:47 【问题描述】:

我使用spring框架,并且想在DB中插入一行以获得它的ID,这是进一步处理所需要的。 下面给出了插入查询,这是一个简单的查询,没有参数。但更糟糕的是,如何使用来自SimpleJdbcInsertexecuteAndReturnKey 构建工作调用?这是插入的 SQL 查询。但不知道是否可以在simpleJdbcInsert实例中使用。

insert into sdc_import_run(id_import_run, create_date)
values(nextval('seq_import_run'),now())

我试过了

Number genId = simpleJdbcInsert.withTableName("sdc_import_run")
            .usingGeneratedKeyColumns("id_import_run")
            .executeAndReturnKey(new MapSqlParameterSource());

它不起作用,问题是,他们想要表的所有参数,但我不想要它们中的任何一个,我只想插入自动生成的:id_import_run(主键)和create_date。因此,我希望将插入的 ID 放入变量中。你会怎么做?

编辑 这种方法效果很好。

public Integer persistInsertImportRunForId()
    String queryString = getSql("insertImportRunForId");
    KeyHolder holder = new GeneratedKeyHolder();
    jdbcTemplate.update(con -> 
            return con.prepareStatement(queryString, Statement.RETURN_GENERATED_KEYS);
        , holder
    );

    return CommonUtils.tryOrGet(() -> holder.getKeys().get("id_import_run"), null);

【问题讨论】:

【参考方案1】:

您可以使用JdbcTemplate 运行完整的插入 SQL。您可以在此处提供您想要的任何 SQL,为您的插入定义尽可能少或多的列,只要您的表的 DDL 允许。

This answer 更详细地介绍了这一点。

【讨论】:

以上是关于如何在春季向 DB 插入一行,仅使用自动生成的值,并返回一个 ID?的主要内容,如果未能解决你的问题,请参考以下文章

jtable仅使用链表中的值填充一行

python中pymssql如何向sql server插入数据 插入的值可以用变量替换

插入后如何立即获取唯一主键ID的值[重复]

使用 FireDac TFDCommand 对 autoinc 字段执行插入操作并检索生成的值

如何在 ServiceStack OrmLite 中检索自动递增的 ID?

插入表时,我可以获得自动递增的主索引的值吗?