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
相关产品推荐
相关产品推荐

