当Spring遇到了Oracle,该怎么办

王朝oracle·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

这次项目,我可以被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;

}

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航