日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

spring storedProcedure 使用

發布時間:2024/4/17 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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;??
  • ??
  • /**?
  • ?*?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));??
  • ????}??
  • ??
  • }??
  • 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 使用的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。