java和ibatis调用存储过程并取得返回值

时间:2021-10-05 13:54:03

http://blog.csdn.net/jiandanfeng2/article/details/6609623


由于存储过程的一系列好处,比如减少sql语句的网络传输等等。使得很多开发人员喜欢用存储过程,笔者也喜欢啊。下面分别介绍下java调用存储过程和ibatis调用存储过程并取得返回值,由于笔者最近开始接触ibatis,所以选了ibatis作为例子说明。

      虽然存储过程不像function有返回值,但是可以通过out参数,返回所需要的值,声明一下:笔者采用的数据库时oracle 10g。

       java调用存储过程并取得返回值:(代码)

       

[java] view plain copy
  1. package com.oracle;  
  2.   
  3. import java.sql.CallableStatement;  
  4. import java.sql.Connection;  
  5. import java.sql.DriverManager;  
  6. import java.sql.ResultSet;  
  7.   
  8. /** 
  9.  * 带分页的存储过程,传入表名、每页的记录数、当前页,返回总记录数、总页数、结果集 
  10.  * @author Administrator 
  11.  * 
  12.  */  
  13. public class TestOraclePro4 {  
  14.   
  15.     /** 
  16.      * @param args 
  17.      */  
  18.     public static void main(String[] args) {  
  19.         // TODO Auto-generated method stub  
  20.         try{  
  21.             Class.forName("oracle.jdbc.driver.OracleDriver");  
  22.             Connection ct = DriverManager.getConnection("jdbc:oracle:thin:@172.17.40.227:1521:orcl","scott","tiger");  
  23.             //参数说明:表名、每页显示记录数、当前页,总记录数、总页数、结果集  
  24.             CallableStatement cs = ct.prepareCall("{call paging_pro(?,?,?,?,?,?)}");  
  25.             //以下三个都是in类型的参数  
  26.             //给第一个参数赋值  
  27.             cs.setString(1"emp");  
  28.             //给第二个参数注册  
  29.             cs.setInt(210);  
  30.             //给第三个参数注册  
  31.             cs.setInt(31);  
  32.             //以下三个是out类型的参数,必须在java中进行注册  
  33.             cs.registerOutParameter(4, oracle.jdbc.OracleTypes.INTEGER);  
  34.             cs.registerOutParameter(5, oracle.jdbc.OracleTypes.INTEGER);  
  35.             cs.registerOutParameter(6, oracle.jdbc.driver.OracleTypes.CURSOR);  
  36.             //执行存储过程  
  37.             cs.execute();  
  38.             System.out.println("表名:emp,每页显示记录数:10,当前页:1");  
  39.             System.out.println("总记录数:"+cs.getInt(4)+" 总页数"+cs.getInt(5));  
  40.             //通过getObject方法获得cursor中的数据集,强制转换为ResultSet  
  41.             ResultSet rs = (ResultSet)cs.getObject(6);  
  42.             while(rs.next()){  
  43.                 System.out.println(rs.getInt(1)+"  "+rs.getString(2)+" "+rs.getFloat(6));  
  44.             }  
  45.         }catch(Exception e){  
  46.             e.printStackTrace();  
  47.         }finally{  
  48.             //关闭资源  
  49.             。。。。  
  50.         }  
  51.     }  
  52.   
  53. }  

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


ibatis中的xml代码如下:

[html] view plain copy
  1. xml 代码  
  2. <parameterMap class="map" id="swapParameters">    
  3.     <parameter property="namestr"  javaType="java.lang.String" jdbcType="varchar" mode="IN"/>    
  4.     <parameter property="returnid"  javaType="java.lang.Integer" jdbcType="int" mode="OUT"/>    
  5. </parameterMap>    
  6. <procedure id="insertNameByProcedure" parameterMap="swapParameters">    
  7.     {call UP_GETINSERTEDIDENTITY_TT(?,?)}     
  8. </procedure>  

存储过程代码:
  1. CREATE PROCEDURE `UP_GETINSERTEDIDENTITY_TT`(inname VARCHAR(20), OUT returnid INTEGER(11))     
  2.     NOT DETERMINISTIC     
  3.     SQL SECURITY INVOKER     
  4.     COMMENT ''    
  5. BEGIN    
  6.      insert into `tt`(NAMEvalues(inname);     
  7.      select LAST_INSERT_ID() into returnid ;     
  8. END;    

java代码:
[java] view plain copy
  1. Integer returnid = null;     
  2. HashMap<String,Object> paramMap = new HashMap<String,Object>();     
  3. paramMap.put("namestr", insertname);     
  4. paramMap.put("returnid", returnid);     
  5. this.getSqlMapClientTemplate().queryForObject("insertNameByProcedure", paramMap);     
  6. return (Integer)paramMap.get("returnid");  

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