Chinaunix首页 | 论坛 | 博客
  • 博客访问: 92491229
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: Oracle

2008-04-30 21:32:18

本来我应该把标题起名为“当spring遇到了oracle”这样才符合网络文章命名贯例。不过我的blog一般只有我自己看,所以就不自乎了。
这次项目,我可以被oralce气伤了。oracle 9i怎么会有那么多问题,驱动怎么会有那么多问题。
好了,说问题吧。
这次的问题集中读写oracle的blob、clob字段上。
1,读写blob需要一个lobhander,虽然defaultlobhander可以用于大多数数据库和大多数oracle的版本,却不能用过oracle 9i。我需要一个oraclelobhander。
以下是spring中的配置。

           
     

                 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+"'"

2,读写clob
这个要简单一些,不过要需要oracle的驱动不能用class12.zip那个,要从oracle下一个新的版本,具体多少不记得了。
     /**
      * 基于主键的查询方法 根据给出的主键查询一个业务并返回
      *
      * @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;
           }
     }

     /**
      * 根据业务主键更新信息
      * @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;
           }
     }

贴到这里,格式全乱了,将就着看吧。

 

原文:http://lanxincao.blog.ccidnet.com/blog-htm-itemid-88069-do-showone-type-blog-uid-2307.html

阅读(522) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~