当Spring遇到了Oracle,该怎么办
[作者]:菩提树下的杨过 [来源]:互联网 [收录时间]:2007-7-29 21:26:38

这次项目,我可以被oralce气伤了。oracle 9i怎么会有那么多问题,驱动怎么会有那么多问题。

好了,说问题吧。

这次的问题集中读写oracle的blob、clob字段上。

1,读写blob需要一个lobhander,虽然defaultlobhander可以用于大多数数据库和大多数oracle的版本,却不能用过oracle 9i。我需要一个oraclelobhander。

以下是spring中的配置。





     

以下是dao中的片段

/**

      * 更新指定的blob

      * @param key

      * @param contentStream

      * @param contentLength

      */

public void updateBlog(final String key, final InputStream contentStream,

final int contentLength) {

logger.debug("update content");

try {

getJdbcTemplate().execute(

"update table set content = ? where id = ?",

new AbstractLobCreatingPreparedStatementCallback(

this.lobHandler) {

protected void setValues(PreparedStatement ps,

LobCreator lobCreator) throws SQLException {

lobCreator.setBlobAsBinaryStream(ps, 1,

contentStream, contentLength);

ps.setString(2, key);

}

});

} catch (RuntimeException re) {

                 logger.warn("update content fail");

                 throw re;

           }

     }

     /**

      * 取得指定的blob

      * @param name

      * @param contentStream

      * @throws DataAccessException

      */

     public void getBlobContent(final String id, final OutputStream 

contentStream) throws DataAccessException {

getJdbcTemplate().query(

"SELECT content FROM table WHERE id=?", new String[] {id},

new AbstractLobStreamingResultSetExtractor() {

protected void handleNoRowFound() throws LobRetrievalFailureException {

throw new IncorrectResultSizeDataAccessException(

"Image with id '" + id + "' not found in database", 1, 0);

}

public void streamData(ResultSet rs) throws SQLException, IOException {

InputStream is = lobHandler.getBlobAsBinaryStream(rs, 1);

if (is != null) {

FileCopyUtils.copy(is, contentStream);

}

}

}

);

           }