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

Java8+MariaDB5.6:插入Blob时如何获取自增主键值

当然有办法!其实你完全可以用PreparedStatement同时搞定Blob插入和自增主键获取——之前的问题大概率是你没用到它的正确用法而已。让我给你一步步讲清楚怎么做:

解决方案:用PreparedStatement同时插入Blob并获取自增主键

首先明确:PreparedStatement本身就支持这两个操作,你之前遇到的插入Blob失败的问题,应该是没有正确设置Blob参数导致的。下面是完整的实现步骤和代码示例:

1. 正确初始化PreparedStatement

在创建PreparedStatement的时候,要传入第二个参数Statement.RETURN_GENERATED_KEYS,告诉JDBC驱动我们需要返回生成的自增主键:

String myinsert = "INSERT INTO 你的表名(imagen) VALUES (?)";
PreparedStatement sentence = mariaConn.prepareStatement(myinsert, Statement.RETURN_GENERATED_KEYS);

2. 设置Blob参数

不要直接赋值null,而是用setBlob()方法来传入Blob数据。你可以通过几种方式传入:

  • 从InputStream传入(比如读取本地文件的输入流):
// 假设你有一个InputStream对象用来读取图片数据
InputStream imageStream = new FileInputStream("path/to/your/image.jpg");
sentence.setBlob(1, imageStream);
  • 从Blob对象传入:
// 如果已经有java.sql.Blob对象
Blob imageBlob = ...;
sentence.setBlob(1, imageBlob);

3. 执行插入并获取自增主键

执行更新后,调用getGeneratedKeys()方法拿到包含自增主键的结果集,从中提取rowid:

int affectedRows = sentence.executeUpdate();
if (affectedRows > 0) {
    ResultSet generatedKeys = sentence.getGeneratedKeys();
    if (generatedKeys.next()) {
        int newRowId = generatedKeys.getInt(1); // 这里的1对应主键列的位置,因为只有一个自增列
        System.out.println("插入成功,新行的rowid是:" + newRowId);
    }
    generatedKeys.close();
}
sentence.close();

为什么之前的PreparedStatement插入Blob失败?

大概率是你没有使用setBlob()方法,而是尝试用setObject()或者直接赋值null,导致Blob列没有被正确填充。只要用setBlob()方法传入有效的数据,就能正常插入Blob内容。

关于CallableStatement的补充

如果一定要用CallableStatement的话,其实也能实现,但需要在存储过程中显式返回自增主键,相对麻烦很多。比如创建一个存储过程,插入数据后返回689723,但显然PreparedStatement的方式更简洁直接。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:15:27