生活随笔
收集整理的這篇文章主要介紹了
spring storedProcedure 使用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
http://blog.csdn.net/xiao_jun_0820/article/details/7268219
?
StoredProcedure是一個抽象類,必須寫一個子類來繼承它,這個類是用來簡化JDBCTemplate執行存儲過程操作的。
首先我們寫一個實現類:
[java] view plaincopyprint?
package ?com.huaye.framework.dao;???? import ?java.sql.Types;??import ?java.util.HashMap;??import ?java.util.Map;???? import ?org.springframework.jdbc.core.RowMapper;??import ?org.springframework.jdbc.core.SqlOutParameter;??import ?org.springframework.jdbc.core.SqlParameter;??import ?org.springframework.jdbc.core.SqlReturnResultSet;??import ?org.springframework.jdbc.object.StoredProcedure;???? ? ? ? ?? public ?class ?StoredProcedureTemplate?extends ?StoredProcedure?{???? ????private ?HashMap<String,?Object>?map?=?new ?HashMap<String,?Object>();?? ?? ????public ?StoredProcedureTemplate()?{?? ????????super ();?? ?? ????}?? ?? ?????? ????public ?HashMap?getMap()?? ????{?? ????????return ?this .map;?? ????}?? ?????? ????public ?void ?setValue(String?key,?Object?obj)?{?? ????????map.put(key,?obj);?? ????}?? ?? ????public ?Map?execute()?{?? ????????if ?(this .getSql()?==?null ?||?this .getSql().equals("" ))?? ????????????return ?null ;?? ????????this .compile();?? ????????return ?execute(map);?? ????}?? ?? ????public ?void ?setVarcharParam(String?param)?{?? ????????this .declareParameter(new ?SqlParameter(param,?Types.VARCHAR));?? ????}?? ?? ????public ?void ?setDoubleParam(String?param)?{?? ????????this .declareParameter(new ?SqlParameter(param,?Types.DOUBLE));?? ????}?? ?? ????public ?void ?setIntegerParam(String?param)?{?? ????????this .declareParameter(new ?SqlParameter(param,?Types.INTEGER));?? ????}?? ?? ????public ?void ?setVarcharOutParam(String?param)?{?? ????????this .declareParameter(new ?SqlOutParameter(param,?Types.VARCHAR));?? ????}?? ?? ????public ?void ?setDoubleOutParam(String?param)?{?? ????????this .declareParameter(new ?SqlOutParameter(param,?Types.DOUBLE));?? ????}?? ?? ????public ?void ?setIntegerOutParam(String?param)?{?? ????????this .declareParameter(new ?SqlOutParameter(param,?Types.INTEGER));?? ????}?? ?? ?? ????public ?void ?setInParam(String?param,int ?valueType)?? ????{?? ????????this .declareParameter(new ?SqlParameter(param,?valueType));?? ?????????? ????}?? ?????? ????public ?void ?setOutParam(String?param,int ?valueType)?? ????{?? ????????this .declareParameter(new ?SqlOutParameter(param,?valueType));?? ?????????? ????}?? ?????? ????public ?void ?setReturnParam(String?param,?RowMapper?rowMapper)?{?? ????????this .declareParameter(new ?SqlReturnResultSet(param,rowMapper));?? ????}?? ?? }??
package com.huaye.framework.dao;import java.sql.Types;
import java.util.HashMap;
import java.util.Map;import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.SqlOutParameter;
import org.springframework.jdbc.core.SqlParameter;
import org.springframework.jdbc.core.SqlReturnResultSet;
import org.springframework.jdbc.object.StoredProcedure;/*** Name:StoredProcedureTemplate User: HP Date: 2007-7-21 Time: 7:40:01* Description:*/
public class StoredProcedureTemplate extends StoredProcedure {private HashMap<String, Object> map = new HashMap<String, Object>();public StoredProcedureTemplate() {super();}public HashMap getMap(){return this.map;}public void setValue(String key, Object obj) {map.put(key, obj);}public Map execute() {if (this.getSql() == null || this.getSql().equals(""))return null;this.compile();return execute(map);}public void setVarcharParam(String param) {this.declareParameter(new SqlParameter(param, Types.VARCHAR));}public void setDoubleParam(String param) {this.declareParameter(new SqlParameter(param, Types.DOUBLE));}public void setIntegerParam(String param) {this.declareParameter(new SqlParameter(param, Types.INTEGER));}public void setVarcharOutParam(String param) {this.declareParameter(new SqlOutParameter(param, Types.VARCHAR));}public void setDoubleOutParam(String param) {this.declareParameter(new SqlOutParameter(param, Types.DOUBLE));}public void setIntegerOutParam(String param) {this.declareParameter(new SqlOutParameter(param, Types.INTEGER));}public void setInParam(String param,int valueType){this.declareParameter(new SqlParameter(param, valueType));}public void setOutParam(String param,int valueType){this.declareParameter(new SqlOutParameter(param, valueType));}public void setReturnParam(String param, RowMapper rowMapper) {this.declareParameter(new SqlReturnResultSet(param,rowMapper));}}
寫一個測試:
[java] view plaincopyprint?
public ?void ?test2()?{??????????ApplicationContext?context?=?new ?ClassPathXmlApplicationContext(?? ????????????????"classpath:spring/applicationContext-base.xml" );?? ????????JdbcTemplate?jdbc?=?(JdbcTemplate)?context.getBean("jdbcTemplate" );?? ?? ????????StoredProcedureTemplate?template?=?new ?StoredProcedureTemplate();?? ?????????? ????????template.setJdbcTemplate(jdbc);?? ????????template.setSql("testproc" );?? ?????????? ????????template.setReturnParam("rows" ,?new ?FirstReportRowMapper());?? ?????????? ????????template.setIntegerParam("@parama" );?? ?????????? ????????template.setValue("@parama" ,?9 );?? ?????????? ????????Map?map?=?template.execute();?? ????????Object?o?=?map.get("rows" );?? ????????List<FirstReportVO>?list?=?(List<FirstReportVO>)o;?? ????????for ?(FirstReportVO?vo?:?list)?{?? ????????????System.out.println(vo.getSortID()+"," +vo.getSortName());?? ????????}?? ????}??
public void test2() {ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-base.xml");JdbcTemplate jdbc = (JdbcTemplate) context.getBean("jdbcTemplate");StoredProcedureTemplate template = new StoredProcedureTemplate();template.setJdbcTemplate(jdbc);template.setSql("testproc");//注意有返回結果集的時候,第一個參數必須設置為返回結果集參數,不然會報錯。template.setReturnParam("rows", new FirstReportRowMapper());template.setIntegerParam("@parama");template.setValue("@parama", 9);Map map = template.execute();Object o = map.get("rows");List<FirstReportVO> list = (List<FirstReportVO>)o;for (FirstReportVO vo : list) {System.out.println(vo.getSortID()+","+vo.getSortName());}}
唯一要注意的地方就是測試里備注的地方,我測試了好久才發現,郁悶的一塌糊涂,老是莫名其妙的錯,原來將參數互換一下位置就OK了,比如你把
template.setIntegerParam("@parama");寫在前面然后再寫template.setReturnParam("rows", new FirstReportRowMapper());的話,就會報空指針錯誤。
這個“rows”可以隨便取名字,不過下面map.get("rows")要和你取的名字一致,因為StoredProcedureTemplate會將結果集以這個名字保存在map中返回。
還有要注意的就是設置sqlparamter的順序要和存儲過程中參數的順序要一致,不然也會報錯.
=======
http://www.w3china.org/blog/more.asp?name=hongrui&id=5156
[java語言]spring對oracle的clob和StoredProcedure 的處理 原創空間
邢紅瑞 發表于 2005-4-21 9:16:20
使用spring后發現和oracle的驅動有了不解之緣,最初是spring的jdbc存取oracle的clob字段,出現
org.springframework.transaction.TransactionSystemException: Could not roll back JDBC transaction; nested exception is java.sql.SQLException: Io 異常: Software caused connection abort: socket write error
問了Juergen Hoeller幾次,也沒有知道原因所在。只有加入了hibernate解決此問題,hibernate如何解決oracle的clob字段,看我以前的帖子(http://blogger.org.cn/blog/more.asp?name=hongrui&id=1171)。
后來看到agilejava也遇到這類問題,原來是ojdbc14.jar驅動的問題,改為9.2.0.5.0,一切OK了。相關blog(http://agilejava.blogbus.com/logs/2005/02/1031034.html)
因為現在大量用到存儲過程,打算使用spring的StoredProcedure 進行操作,發現運行到SQLErrorCodes loaded: [DB2, HSQL, MS-SQL, MySQL, Oracle, Informix, PostgreSQL, Sybase] 就停了,沒有辦法,問了Thomas Risberg,他說程序沒有錯誤,我當時就暈了,后來聽說虎子做過類似的工作,代碼給虎子看,也說沒錯,而且在它那里運行正常,我生氣了。聽從他的建議,加入spring源碼調試,也不知道問題所在。認為是數據庫的問題,換了臺數據庫還是不行。最后把防火墻撤掉,讓虎子直接訪問數據庫,他那里一切正常。問題明朗了,數據庫一樣的,代碼一樣的,唯一不同的是jdk和oracle驅動,他的jdk1.425,我得1.421,差別不大,那就是驅動的問題,我換了以前用的ojdbc14.jar,現在用的版本10.1.0.2.0,換到9.0.2.0.0,一切OK,此時,我已經出離憤怒了,建議oracle驅動最好是自己命名,把文件名加上版本信息,要不會死人的。
下面是我作測試的PLSQL代碼
CREATE OR REPLACE package chapter_13 as ?TYPE rs IS REF CURSOR ; procedure founder(oFields out rs);
end; /CREATE OR REPLACE package body chapter_13 as
PROCEDURE founder(oFields out rs) IS BEGIN ? open oFields for ?? select * from dept; END founder; end; java代碼
package springtest;
import java.sql.*; import java.util.*;
import javax.sql.*; import oracle.jdbc.driver.OracleTypes; import org.springframework.jdbc.core.*; import org.springframework.jdbc.datasource.*; import org.springframework.jdbc.object.*;
public class TestDao { ??? public static void main(String[] args) throws Exception { ??????? new TestDao().execute(); ??? }
??? public void execute() throws Exception { ??????? DataSource ds = new DriverManagerDataSource( ??????????????? "oracle.jdbc.driver.OracleDriver", ??????????????? "jdbc:oracle:thin:@localhost:1521:mydb", ??????????????? "scott", "tiger");
??????? DemoStoredProcedure proc = new DemoStoredProcedure(ds); ??????? Map params = new HashMap();
??????? proc.execute(params);
??? }
??? private class DemoStoredProcedure extends StoredProcedure { ??????? public static final String SQL = "chapter_13.founder";
??????? public DemoStoredProcedure(DataSource ds) { ??????????? setDataSource(ds); ??????????? setSql(SQL); ??????????? setFunction(false);
??????????? declareParameter( ??????????????????? new SqlOutParameter( ??????????????????????????? "obrief", OracleTypes.CURSOR, new RowMapper() { ??????????????? public Object mapRow(ResultSet rs, int rowNum) throws ??????????????????????? SQLException { ??????????????????? System.out.println(rs.getString(1));
??????????????????? return rs.getString(1); ??????????????? } ??????????? } ??????????? ));
??????????? compile(); ??????? } ??? }
}
?
總結
以上是生活随笔 為你收集整理的spring storedProcedure 使用 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。