您现在的位置: 网页制作教程网 >> 数据库教程 >> oracle 教程 >> 文章正文

当Spring遇到了Oracle,该怎么办

作者:赛迪网

来源:赛迪网

热度:

2006-10-6 13:39:55

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

好了,说问题吧。

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

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

以下是spring中的配置。

<bean id="oracleLobHandler" class="org.springFramework.JDBC.support.lob.OracleLobHandler"
 singleton="false">
<property name="nativeJdbcExtractor" ref="nativeJdbcExtractor"/>
     </bean>
<bean id="nativeJdbcExtractor" 
class="org.springframework.jdbc.support.nativejdbc.C3P0NativeJdbcExtractor"
            lazy-init="true"/>

以下是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);
}
}
}
);
                 }

前一个方法是写blob,后一个读blob。后面一个在业务方法中,这样用。

public void getBlobContent(HttpServletRequest request,
HttpServletResponse response) {
try {
serviceDisplayDAO.getBlobContent(request.getParameter("id"),response.getOutputStream());
} catch (DataAccessException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
            }

在页面中只需要做个链接:href="/blob.do?action=getBlogContent&id='"+id+"'"

[1] [2] 下一页

我来说两句:

1分 2分 3分 4分 5分
姓名: *


* 请各位网友遵纪守法并注意语言文明。
网站简介 | 联系方式 | 意见建议 | 版权说明
Copyright © 2007 All rights reserved
滇ICP备06006992号