我的一亩三分地 我就喜欢!
13fen  设为主页
 收藏本站
 
当前位置: > 一亩三分地:首页 > 网络学院 > 数据库 > oracle > 当Spring遇到了Oracle,该怎么办
热门文章排行
热门文章排行 Oracle的客户端工具--sql*plus(二(10-18)
如何将Access和Excel导入到Mysql中之(11-16)
用SQL进行函数查询(12-15)
Oracle 9i 数据库WITH查询语法小议(12-15)
优化Oracle库表设计的若干方法(12-15)
精采文章排行
精采文章排行 用代码打开Access文件的两种方法(11-17)
SQL Server 2000企业版安装教程(1)(11-16)
SQL数据操作基础(初级1)(11-16)
SQL数据操作基础(中级1)(11-16)
mssql 数据库的备份与恢复(11-16)
技术专题推荐
网管论坛交流
 

当Spring遇到了Oracle,该怎么办 

作者:佚名   来源:Linux 宝库   点击:   日期:2006-12-22

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



(T114)






文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【论坛讨论

   相关文章:
·Oracle数据库的安全策略分析(三) ·Oracle数据库的安全策略分析(二)
·SCO unix 下定时备份 Oracle dmp 文件 ·Oracle 9i密码策略--密码重用规则
·Oracle SQL 内置函数的使用方法及结果 ·WindowsXP下安装Oracle9i问题二则

   文章评论:(条)
  
 请留名: 匿名评论   点击查看所有评论 网管论坛
 

  责任编辑:一分  声明:刊登此文章是为了传递更多信息,文章内容仅供参考,转载请注明出处。