当Spring遇到了Oracle

来源:天极网 作者:来自网络 2008-05-21 出处:pcdog.com

  • access
  • oracle
  • spring
  • 数据库
  • 这次项目,我可以被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+"'"

    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;
                }
                }

    更多内容请看PCdog.com--Spring开发技术篇专题
    上一篇:通过编程管理windows 防火墙
    下一篇:hibernate3二级缓存的配置及测试