根据PostgreSQL tutorial on storing binary data,您可以使用pstm.setBinaryStream()将二进制数据传输到数据库.使用您的示例代码,这将按如下方式工作:
private void writeToDB(Connection conn, String fileName, InputStream is, String description)
throws SQLException {
String sql = "Insert into Attachment(Id,File_Name,File_Data,Description) "
+ " values (?,?,?,?)";
try (PreparedStatement pstm = conn.prepareStatement(sql)) {
Long id = this.getMaxAttachmentId(conn) + 1;
pstm.setLong(1, id);
pstm.setString(2, fileName);
pstm.setBinaryStream(3, is);
pstm.setString(4, description);
pstm.executeUpdate();
}
}
请注意,我已将PreparedStatement包装在try-with-resources statement中,这是自Java 7以来的首选方式,因为它确保即使发生异常也能正确关闭JDBC资源.
如果PostgreSQL JDBC驱动程序不接受没有显式长度参数的pstm.setBinaryStream(),则需要将用于创建输入流的File对象的length()传递给该方法.另一种方法是在方法和用途内的read the stream fully into a byte array
pstm.setBytes(3, myByteArray);
代替.