想在spring中使用jdbctemplate将字节数组插入到oid类型的postgres列中

时间:2014-11-14 10:36:50

标签: java spring postgresql jdbctemplate

我正在使用Spring框架中的JdbcTemplate。

数据库是Postgres。

问题是我在java中读取.cer文件,并希望将此证书的内容存储到列类型OID的postgress数据库并使用jdbctemplate但是获取异常是

列" cert_file"是oid类型但表达式是bytea

以下是代码

final String sql1 = "INSERT INTO sp_certificate_detail " +
                            "(public_key,cert_file)values(?,?)";

                    status = jdbcTemplate.update(new PreparedStatementCreator() {

                        @Override
                        public PreparedStatement createPreparedStatement(
                                Connection connection) throws SQLException {

                            PreparedStatement ps = connection.prepareStatement(
                                    sql1, new String[] { "cert_id" });                                
                            ps.setString(1, spreg.getPublicKey());
                            ps.setBytes(2, spreg.getCertFileContent());//This is byte[] of type
                           return ps;
                        }
                    }, keyHolder);
To get certiticate content am using below code
cfb = CertificateFactory.getInstance("X.509");
X509Certificate certb = (X509Certificate) cfb.generateCertificate(fileInputStream);
spreg.setCertFileContent(certb.getEncoded());

请有人建议解决方案

我尝试将byte []转换为LOB,然后获得不同的异常

大对象可能无法在自动提交模式下使用。嵌套异常是org.postgresql.util.PSQLException:大对象可能无法使用 d在自动提交模式下。

代码低于

ps.setBlob(10, (new SerialBlob(spreg.getCertFileContent())));

2 个答案:

答案 0 :(得分:0)

我已将列类型更改为bytea现在正在使用

答案 1 :(得分:0)

将下面的代码集成到您的代码中,应该可以正常工作。

import org.postgresql.largeobject.LargeObject;
import org.postgresql.largeobject.LargeObjectManager;

(postgresql jdbc jar中提供的包)

LargeObjectManager largeObjectManager = null;

LargeObject largeObject = null;

Long largeObjectRef = null;

largeObjectManager = ((org.postgresql.PGConnection) connection).getLargeObjectAPI();

largeObjectRef = largeObjectManager.createLO(LargeObjectManager.READ |    LargeObjectManager.WRITE);

largeObject = largeObjectManager.open(largeObjectRef, LargeObjectManager.WRITE);

largeObject.write("string/file content to write into oid column".getBytes());

largeObject.close();

包含您需要设置的其余代码/参数,以及下面的

ps.setLong(2, largeObjectRef);

ps.executeUpdate();