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);
    }

注意:

  1. 在编写参数时,需要正确的顺序,如果不按照参数顺序,调用会出现问题。
  2. 传入参数类型为 ParameterType
  3. 参数的索引不是从0开始,而是从1 开始。
  4. 使用 CallableStatement 获取返回值。
  5. 输出参数的类型这个不同的数据库会不一样,mysql 不支持游标类型,Oracle支持。
    mysql 类型为
    com.mysql.cj.MysqlType
    oracle的类型为
    oracle.jdbc.OracleTypes
文档更新时间: 2021-06-26 23:44   作者:zyg