Fosdccf.blog.chinaunix.net
sdccf
全部博文(19283)
Linux酷软(214)
tmp(0)
PostgreSQL(93)
Solaris(383)
AIX(173)
SCOUNIX(575)
DB2(1005)
Shell(386)
C/C++(1187)
MySQL(1750)
Sybase(465)
Oracle(3695)
Informix(548)
HP-UX(0)
IBM AIX(2)
Sun Solaris(0)
BSD(1)
Linux(8597)
SCO UNIX(23)
2011年(1)
2009年(125)
2008年(19094)
2007年(63)
clifford
linky521
曾德标
fengzhan
leon_yu
mcuflowe
yt200902
guanyuji
GY123456
snow888
carlos94
丸喵喵
sean229
cxunix
可怜的猪
cqxc413
xzzgege
wb123456
分类: 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
上一篇:数据库-Oracle数据库的入门级基本知识
下一篇:JBuilder+JBOSS+Oracle9i环境配置
登录 注册