返回列表 发帖

急:Spring调用mysql存储过程

我采用的是Spring+JDBC
请问Spring怎么调用mysql存储过程?
用JdbcTemplate的什么方法可以呀?

[ 本帖最后由 rsljava 于 2010-5-21 18:19 编辑 ]

生命没有假期!
如果生命只剩下最后一秒,你可会想到我?

TOP

回复 2# kongyeeku 的帖子

不好意思!
不太懂你的意思,也没有找到那个方法!

[ 本帖最后由 rsljava 于 2010-5-22 08:41 编辑 ]

TOP

TOP

《轻量级Java EE企业应用实战》
P514有如何在hbm.xml文件中定义命名SQL查询调用存储过程的示例。
P701有关键findByNamedQuery方法的介绍,或者直接查Spring API文档都可以看到。
生命没有假期!
如果生命只剩下最后一秒,你可会想到我?

TOP

原帖由 rsljava 于 2010-5-21 18:03 发表
我采用的是Spring+JDBC
请问Spring怎么调用mysql存储过程?
用JdbcTemplate的什么方法可以呀?

  1.   conn=getSession().connection();  
  2.    String procedure = "{call PRO_VIEWALLOCATETRUCKBROAD(?,?)}";
  3.    cstmt=conn.prepareCall(procedure);
  4.    cstmt.registerOutParameter(1,OracleTypes.CURSOR); //设置输出参数
  5.    cstmt.setString(2, sql);
  6.    cstmt.execute(); //执行
  7.    rs=(ResultSet)cstmt.getObject(1); //获得统计结果集
复制代码


上面是我用项目中,jdbc调用 oracle的存储过程  PRO_VIEWALLOCATETRUCKBROAD 的部分代码的写法
希望能帮上楼主
倚楼听风雨,笑看江湖路。。。

TOP

哦,我没看仔细啊。

我看成了使用Spring+Hiberante调用存储过程。
原来是要用Spring+JDBC调用存储过程,
用下面方法肯定可以。
  1. Map call(CallableStatementCreator csc,  List declaredParameters)
复制代码
代码就这样写
  1.     //jt就是JdbcTemplate
  2.     jt.call(new CallableStatementCreator()
  3.      {
  4.           public CallableStatement createCallableStatement(Connection con)  
  5.           {
  6.         return con.prepareCall({call ....});
  7.           }
  8.      },
  9.     argsList);// 其中argList就用于为存储过程的传入参数设置参数值。
复制代码
生命没有假期!
如果生命只剩下最后一秒,你可会想到我?

TOP

TOP

原帖由 kongyeeku 于 2010-5-22 16:40 发表
哦,我没看仔细啊。

我看成了使用Spring+Hiberante调用存储过程。
原来是要用Spring+JDBC调用存储过程,
用下面方法肯定可以。
Map call(CallableStatementCreator csc,  List declaredParameters)
代码就这样写
    // ...


哦,站长的这个好象不能返回记录集吧。。如果要返回记录集的话,应该不是返回Map了,而是List才对啊

好象heyitang那种写法就是可以返回记录集ResultSet了。。

[ 本帖最后由 crazyit 于 2010-5-24 13:09 编辑 ]
成功的人不是赢在起点,而是赢在转折点!

TOP

汗,今天也在搞存储过程,用的是Spring + Hibernate 来调用Oracle中的存储过程
Oracle中的存储过程为
create or replace procedure ProcDyDd(strFcorpcode in list_tz.fcorpcode%type, strSynf in cs_hz.synf%type) is
cursor c1(theFcorpcode cs_hz.fcorpcode%type,theSynf cs_hz.synf%type)
is
select Fcorpcode,Synf,dm,bh,xm,jsdw,dddx,dddx_Min,dddx_Max,bz,bz_1,bz_2,bz_3,bz_4,rjszdl,sb,dy,dy_1,dy_2,dy_3,dy_
  …………
…………
  return;
end ProcDyDd;

hbm配置文件片段
<sql-query name="ProcDyDd" callable="true">
        {call ProcDyDd(?,?)}
</sql-query>

调用存储过程的方法
  1. public List callProcedure(final String procNamed, final Object... args)
  2. {
  3.         //通过一个HibernateCallback对象来执行查询
  4.     List list = getHibernateTemplate()
  5.             .executeFind(new HibernateCallback()
  6.         {
  7.             //实现HibernateCallback接口必须实现的方法
  8.             public Object doInHibernate(Session session)
  9.                 throws HibernateException, SQLException
  10.             {
  11.                 Query query = session.getNamedQuery(procNamed);
  12.                 for (int i = 0; i < args.length; i++)
  13.                 {
  14.                     query.setParameter(i, args);
  15.                 }
  16.                 return query.list();
  17.             }
  18.         });
  19.         return list;
  20. }
复制代码


搞了一中午都不行,下面是错误提示:
1.jpg
2010-5-25 16:20


后来查了下《轻量级JavaEE企业应用实战》P515 写到
对于Oracle有如下规则:
存储过程的第一个参数必须是OUT,它返回一个结果集。

难道没解决的办法?或者只能用JdbcTemplate来解决?


[ 本帖最后由 leeyohn 于 2010-5-26 12:59 编辑 ]
万里独行多陌路,一诗好赏便知音。

TOP

返回列表