1.概述
在有些情况下,在数据提交或保存时,需要在后台进行复杂的运算,这种情况下通过SQL语句实现起来比较复杂,效率不高,这种情况下可以通过存储过程来解决,只需要修改存储过程,不用修改应用代码。但是存储过程问题是不好移植。如果只是针对某一类型的数据库是可以的。
2.平台实现
在平台中提供了调用存储过程的代码,相关代码在模块 jpaas-db-spring-boot-starter
接口代码说明
接口类为:
com.redxun.db.process.ProcedureHepler
2.1 调用存储过程无参数
方法定义
void callProc(String procName)
参数为存储过程名称,这个方法的作用是调用当前数据源的存储过程。
2.2 调用存储过程只有输入参数
方法定义
void callProc(String procName, List<ProcParameter> parameterList)
参数
参数 | 说明 |
---|---|
procName | 存储过程名称 |
parameterList | 参数里列表,这里只用输入参数 |
2.3 调用存储过程只有输入参数
方法定义
void callProc(String dbAlias, String procName,List<ProcParameter> parameterList)
参数定义
参数 | 说明 |
---|---|
dbAlias | 数据源别名 |
procName | 存储过程名称 |
parameterList | 参数里列表,这里只用输入参数 |
2.4 调用存储过程有返回值
方法定义
Object callProc(String procName, List<ProcParameter> parameterList, IReturnData returnData)
参数定义
参数 | 说明 |
---|---|
procName | 存储过程名称 |
parameterList | 参数里列表,这里只用输入参数 |
returnData | 这是个接口,用来获取存储过程的返回值 |
2.5 调用存储过程有返回值,可以指定数据源
方法定义
Object callProc(String dbAlias, String procName, List<ProcParameter> parameterList, IReturnData returnData)
参数定义
参数 | 说明 |
---|---|
dbAlias | 数据源别名 |
procName | 存储过程名称 |
parameterList | 参数里列表,这里只用输入参数 |
returnData | 这是个接口,用来获取存储过程的返回值 |
2.6 数据类型定义
public enum ParameterType{
STRING,
DATE,
INT,
LONG,
DOUBLE,
TEXT
}
3. 使用方法
3.1 只有传入参数无返回值
- 编写存储过程如下
本存储过程为mysql的存储过程
CREATE PROCEDURE `demo_insert`(in name varchar(60), in address varchar(60))
BEGIN
insert into demo (name,address) values (name,address);
END
这里只是为了说明问题,我们做最简单的存储过程。此存储过程有两个输入参数。
- 调用代码如下
@Resource
ProcedureHepler procedureHepler;
@Test
public void testInParameter() throws Exception {
ParameterHelper helper=new ParameterHelper();
helper.addInParameter(ParameterType.STRING,"ray")
.addInParameter(ParameterType.STRING,"guangzhou");
List<ProcParameter> parameterList = helper.getParameterList();
procedureHepler.callProc("demo_insert",parameterList);
}
这段代码相关信息如下:
1.构建输入参数
2.调用存储过程
3.2 有入参出参有返回值
在有些情况下,调用存储过程需要有返回值。在这里ORACLE和mysql 的使用方法会有些许的不同。
- 编写存储过程如下
-- 本存储过程有两个输入参数,有连个输出参数
CREATE PROCEDURE `proc_addNum`(in x int,in y int,out sum int,out sum2 int)
BEGIN
SET sum= x + y;
set sum2 =x +10;
end
– 调用代码如下
@Test
public void testInOutParameter() throws Exception {
ParameterHelper helper=new ParameterHelper();
//增加输入参数
helper.addInParameter(ParameterType.INT,1)
.addInParameter(ParameterType.INT,1)
//添加输入参数
.addOutParameter(MysqlType.FIELD_TYPE_INT24)
.addOutParameter(MysqlType.FIELD_TYPE_INT24);
List<ProcParameter> parameterList = helper.getParameterList();
JSONObject rtn= (JSONObject) procedureHepler.callProc( "proc_addNum", parameterList, new IReturnData() {
//处理返回值
@Override
public Object handStatement(CallableStatement statement) throws SQLException {
JSONObject result=new JSONObject();
result.put("p1",statement.getInt(3));
result.put("p2",statement.getInt(4));
return result;
}
});
System.err.println(rtn);
}
注意:
- 在编写参数时,需要正确的顺序,如果不按照参数顺序,调用会出现问题。
- 传入参数类型为
ParameterType
。 - 参数的索引不是从0开始,而是从1 开始。
- 使用 CallableStatement 获取返回值。
- 输出参数的类型这个不同的数据库会不一样,mysql 不支持游标类型,Oracle支持。
mysql 类型为com.mysql.cj.MysqlType
oracle的类型为oracle.jdbc.OracleTypes