四、存储过程调用

日常操作中我们可能会经常需要调用存储过程,下面我们先来看看以往我们是如何调用存储过程的:

  1. //加载驱动
  2. DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver());
  3. //获得连接
  4. Connection conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");
  5. //创建存储过程的对象
  6. CallableStatement c=conn.prepareCall("{call getsum(?,?)}");
  7. //给存储过程的第一个参数设置值
  8. c.setInt(1,100);
  9. //注册存储过程的第二个参数
  10. c.registerOutParameter(2,java.sql.Types.INTEGER);
  11. //执行存储过程
  12. c.execute();
  13. //得到存储过程的输出参数值
  14. System.out.println (c.getInt(2));
  15. conn.close();

也许你已经习惯了,但是对于我来说这是一个麻烦无比的操作哦,我要简化它,我要简化,我要简,我要,我…..

我们再来看看 Voovan ORM 是如何调用存储过程的:

  1. List<Object> callWithMap = jOperate.call("{call getsum(::1,::2)}", new CallType[]{CallType.IN,CallType.INOUT}, 1,2);

一条代码的事情为什么非要那么复杂呢?

好了言归正传,我们来说说如何都是什么意思。我们闲来看一下存储过程调用方法:

  1. public List<Object> call(String sqlText)
  1. public List<Object> call(String sqlText, CallType[] callTypes, Map<String, Object> maps)
  1. public List<Object> call(String sqlText, CallType[] callTypes, Object arg)
  1. public List<Object> call(String sqlText, CallType[] callTypes, Object ... args)
  • 参数说明:
    • sqlText: 存储过程调用脚本,类似:{call test(::arg1)}
    • callTypes: 参数类型
    • maps/arg/args: SQL脚本的参数
  • 其中 CallType(org.voovan.db.CallType) 用来说明参数的传入传出类型,即:INOUTINOUT是不是和查询、更新的模型很相似呢?当然相似了都是一种设计思路么。

我们重点说一下第二个参数CallType[] callTypes,这个参数的存在就是为了解决原生调用中c.registerOutParameter(2,java.sql.Types.INTEGER);的问题,什么问题呢?注册参数的类型。由于我们在编写存储过程中有一个特点就是要指定参数的类型:INOUTINOUT三种类型.我们现在调用的时候同样也需要指定,否则我们就无法获取存储过程返回的数据了.

返回的数据类型是一个 List,里面存储的数据是你在CallType[] callTypes指定的带有OUT类型的参数返回的数据,顺序是存储过程定义的参数顺序,请自行过滤IN参数.