分享
 
 
 

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

}

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有