Java和Ibatis调用存储过程并取得返回值详解

数据库 Oracle
本文主要介绍了Java和Ibatis调用存储过程的方法,并给出了详细的代码,希望能对读者有所帮助。

存储过程可以减少sql语句的网络传输,使得很多开发人员喜欢用存储过程,但是如果想把存储过程用好,用灵活还是需要花费一定的时间和努力的。本文主要java调用存储过程和ibatis调用存储过程并取得返回值的实现,并给出了详细的代码。本实例采用的数据库是Oracle 10g。

java调用存储过程并取得返回值如下:

package com.oracle;    
 
import java.sql.CallableStatement;    
 
import java.sql.Connection;    
 
import java.sql.DriverManager;    
 
import java.sql.ResultSet;   
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
public static void main(String[] args) {    
 
// TODO Auto-generated method stub     
 
try{    
 
Class.forName("oracle.jdbc.driver.OracleDriver");    
 
Connection ct = DriverManager.getConnection("jdbc:oracle:thin:@172.17.40.227:1521:orcl","scott","tiger");    
 
//参数说明:表名、每页显示记录数、当前页,总记录数、总页数、结果集     
 
CallableStatement cs = ct.prepareCall("{call paging_pro(?,?,?,?,?,?)}");    
 
//以下三个都是in类型的参数     
 
//给第一个参数赋值     
 
cs.setString(1, "emp");    
 
//给第二个参数注册     
 
cs.setInt(2, 10);    
 
//给第三个参数注册     
 
cs.setInt(3, 1);   
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.

//以下三个是out类型的参数,必须在java中进行注册   

cs.registerOutParameter(4, oracle.jdbc.OracleTypes.INTEGER);    
 
cs.registerOutParameter(5, oracle.jdbc.OracleTypes.INTEGER);    
 
cs.registerOutParameter(6, oracle.jdbc.driver.OracleTypes.CURSOR);   
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

//执行存储过程   

cs.execute();    
 
System.out.println("表名:emp,每页显示记录数:10,当前页:1");    
 
System.out.println("总记录数:"+cs.getInt(4)+" 总页数"+cs.getInt(5));   
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

//通过getObject方法获得cursor中的数据集,强制转换为ResultSet   

ResultSet rs = (ResultSet)cs.getObject(6);    
 
while(rs.next()){    
 
System.out.println(rs.getInt(1)+"  "+rs.getString(2)+" "+rs.getFloat(6));    
 
}    
 
}catch(Exception e){    
 
e.printStackTrace();    
 
}finally{    
 
//关闭资源     
 
。。。。    
 
}    
 
}    
 
}   
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.

下面介绍ibatis调用存储过程并取得返回值,该部分来自论坛:http://www.iteye.com/topic/84224

ibatis中的xml代码如下:

xml 代码:

<parameterMap class="map" id="swapParameters"> 
 
<parameter property="namestr"  javaType="java.lang.String" jdbcType="varchar" mode="IN"/> 
 
<parameter property="returnid"  javaType="java.lang.Integer" jdbcType="int" mode="OUT"/> 
 
</parameterMap> 
 
<procedure id="insertNameByProcedure" parameterMap="swapParameters"> 
 
{call UP_GETINSERTEDIDENTITY_TT(?,?)}  
 
</procedure>   
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.

存储过程代码:

CREATE PROCEDURE `UP_GETINSERTEDIDENTITY_TT`(inname VARCHAR(20), OUT returnid INTEGER(11))  
 
NOT DETERMINISTIC   
 
SQL SECURITY INVOKER  
 
COMMENT ''  
 
BEGIN  
 
insert into `tt`(NAME) values(inname);  
 
select LAST_INSERT_ID() into returnid ;  
 
END; 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.

java代码:

Integer returnid = null;  
 
HashMap<String,Object> paramMap = new HashMap<String,Object>();  
 
paramMap.put("namestr", insertname);  
 
paramMap.put("returnid", returnid);  
 
this.getSqlMapClientTemplate().queryForObject("insertNameByProcedure", paramMap);  
 
return (Integer)paramMap.get("returnid");   
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

以上,要注意paramMap这个map中java、xml和sql中的关系就行了。

本文就介绍到这里,如果您想了解更多Oracle数据库的知识,可以看一下这里的文章:http://database.51cto.com/oracle/,您的收获就是我们最大的快乐!

【编辑推荐】

  1. C#利用ODP.net连接Oracle数据库
  2. Oracle数据库中Rank等函数的比较与选择
  3. 利用Sql Server将Excel中的数据导入Oracle
  4. Oracle跟踪文件分析工具TKPROF使用简介
  5. 如何配置Oracle 10g oem中的主机身份证明
责任编辑:赵鹏 来源: CSDN博客
点赞
收藏

51CTO技术栈公众号