四、存储过程调用
日常操作中我们可能会经常需要调用存储过程,下面我们先来看看以往我们是如何调用存储过程的:
//加载驱动
DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver());
//获得连接
Connection conn=DriverManager.getConnection("jdbc:odbc:mydata","sa","");
//创建存储过程的对象
CallableStatement c=conn.prepareCall("{call getsum(?,?)}");
//给存储过程的第一个参数设置值
c.setInt(1,100);
//注册存储过程的第二个参数
c.registerOutParameter(2,java.sql.Types.INTEGER);
//执行存储过程
c.execute();
//得到存储过程的输出参数值
System.out.println (c.getInt(2));
conn.close();
也许你已经习惯了,但是对于我来说这是一个麻烦无比的操作哦,我要简化它,我要简化,我要简,我要,我…..
我们再来看看 Voovan ORM 是如何调用存储过程的:
List<Object> callWithMap = jOperate.call("{call getsum(::1,::2)}", new CallType[]{CallType.IN,CallType.INOUT}, 1,2);
一条代码的事情为什么非要那么复杂呢?
好了言归正传,我们来说说如何都是什么意思。我们闲来看一下存储过程调用方法:
public List<Object> call(String sqlText)
public List<Object> call(String sqlText, CallType[] callTypes, Map<String, Object> maps)
public List<Object> call(String sqlText, CallType[] callTypes, Object arg)
public List<Object> call(String sqlText, CallType[] callTypes, Object ... args)
- 参数说明:
sqlText
: 存储过程调用脚本,类似:{call test(::arg1)}callTypes
: 参数类型maps/arg/args
: SQL脚本的参数
- 其中
CallType
(org.voovan.db.CallType) 用来说明参数的传入传出类型,即:IN
,OUT
,INOUT
是不是和查询、更新的模型很相似呢?当然相似了都是一种设计思路么。
我们重点说一下第二个参数CallType[] callTypes
,这个参数的存在就是为了解决原生调用中c.registerOutParameter(2,java.sql.Types.INTEGER);
的问题,什么问题呢?注册参数的类型。由于我们在编写存储过程中有一个特点就是要指定参数的类型:IN
、OUT
、INOUT
三种类型.我们现在调用的时候同样也需要指定,否则我们就无法获取存储过程返回的数据了.
返回的数据类型是一个 List,里面存储的数据是你在CallType[] callTypes
指定的带有OUT
类型的参数返回的数据,顺序是存储过程定义的参数顺序,请自行过滤IN
参数.