這次項目,我可以被oralce氣傷了。Oracle 9i怎么會有那么多問題,驅(qū)動怎么會有那么多問題。 好了,說問題吧。 這次的問題集中讀寫oracle的blob、clob字段上。 1,讀寫blob需要一個lobhander,雖然defaultlobhander可以用于大多數(shù)數(shù)據(jù)庫和大多數(shù)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。后面一個在業(yè)務(wù)方法中,這樣用。 
            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+"'" 2,讀寫clob 這個要簡單一些,不過要需要oracle的驅(qū)動不能用class12.zip那個,要從oracle下一個新的版本,具體多少不記得了。             /**      * 基于主鍵的查詢方法 根據(jù)給出的主鍵查詢一個業(yè)務(wù)并返回      *       * @param key      * @return      */public List findByPrimaryKey(String key) {logger.debug("finding service by primary key");try {return getJdbcTemplate().query("SELECT serviceid,contenttype,templatetext FROM table where serviceid='"+key+"'",new RowMapper() {public Object mapRow(ResultSet rs, int rowNum) throws SQLException {String serviceid = rs.getString(1);String contenttype = rs.getString(2);String templatetext = lobHandler.getClobAsString(rs, 3);return new ServConTempBean(serviceid, contenttype, templatetext);}});} catch (RuntimeException re) {logger.warn("finding service by primary key failed", re);throw re;}}     /**      * 根據(jù)業(yè)務(wù)主鍵更新信息      * @param key      * @param params      * @param types      * @return      */public void updateContentByPrimaryKey(final String key,final String templatetext) {logger.debug("update service content by content template primary key");try {getJdbcTemplate().execute( "update table set templatetext=? where serviceid=?",new AbstractLobCreatingPreparedStatementCallback(this.lobHandler) {protected void setValues(PreparedStatement ps,LobCreator lobCreator) throws SQLException {lobCreator.setClobAsString(ps, 1, templatetext);ps.setString(2, key);}});} catch (RuntimeException re) {logger.warn("update service by service primary key failed", re);throw re;}      }