1. 步骤:
    JDBC调用存储过程和函数
    步骤:
    ①:通过Connection对象的prepareCall()方法创建一个CallableStatement对象的实例,在使用Connection对象的preparedCall()方法时,需要传入一个String类型的字符串,该字符串指明如何调用存储过程。
    函数: [? = call [(,, … )]]
    存储过程: [call [(,, … )]]
    ②:通过CallableStatement对象reisterOutParameter方法注册OUT参数
    ③:通过CallableStatement对象setXxx()方法设定IN或IN OUT参数,若想把参数设为null,使用setNull()方法

④:通过CallableStatement对象的execute()方法执行存储过程。

⑤:如果调用的是带返回值的存储过程,还需要CallableStatement对象的getXxx()方法获取其返回值。
注:通过数据字典查看存储过程或函数的定义。

2 .示例代码
java调用存储过程

/**
     * 调用存储过程
     */
    @Test
    public void testCallableStatement(){
        Connection conn = null;
        CallableStatement callablestatement = null;
        try {
            conn = TestTools.getConnection();
            String sql = "{ call add0 (?, ?, ?) }";
            //1.获取CallableStatement类是对象
            callablestatement = conn.prepareCall(sql);
            //2.注册OUT参数
            callablestatement.registerOutParameter(3, Types.NUMERIC);
            //3.通过setXxx()方法设定IN或OUT参数值
            callablestatement.setInt(1, 10);
            callablestatement.setInt(2, 20);
            //4.执行存储过程
            callablestatement.execute();
            //5.若有返回值,需要使用getXxx()接收
            int sum = callablestatement.getInt(3);
            System.out.println("结果:"+sum);//结果:30
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            TestTools.release(callablestatement, conn);
        }
    }

创建存储过程的SQL语句

#定义有返回值的存储过程,大小写无所谓,功能:计算两个数的值
#注意:过程名不能使用add

CREATE PROCEDURE add0(IN a INT,IN b INT,OUT result INT)
BEGIN
    IF a IS NULL THEN SET a = 0;
    END IF;
    IF b IS NULL THEN SET b = 0;
    END IF;
    SET result = a + b;
    SELECT result AS SUM;
END;

#调用存储过程

call add0 (10, 20, @result); 

##定义无返回值的存储过程,大小写无所谓,功能:计算两个数的值

CREATE PROCEDURE add1( a INT, b INT)
BEGIN
    DECLARE result INT;
    IF a IS NULL THEN SET a = 0;
    END IF;
    IF b IS NULL THEN SET b = 0;
    END IF;
    SET result = a + b;
    SELECT result AS SUM;
END;

#调用存储过程

call add1 (10, 20);

java调用函数

/**
     * 调用函数
     */
    @Test
    public void testCallableStatement1(){
        Connection conn = null;
        CallableStatement callablestatement = null;
        try {
            conn = TestTools.getConnection();
            String sql = "{? = call add_fun (?, ?) }";
            //1.获取CallableStatement类是对象
            callablestatement = conn.prepareCall(sql);
            //2.注册OUT参数,其中1表示第一个问号,表示输出
            callablestatement.registerOutParameter(1, Types.NUMERIC);
            //3.通过setXxx()方法设定IN或OUT参数值,2,3表示第二个和第三个问号,表述输入。
            callablestatement.setInt(2, 10);
            callablestatement.setInt(3, 20);
            //4.执行存储过程
            callablestatement.execute();
            //5.若有返回值,需要使用getXxx()接收
            int sum = callablestatement.getInt(1);
            System.out.println("结果:"+sum);
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            TestTools.release(callablestatement, conn);
        }
    }

创建函数的mysql语句:

#创建有返回值的函数,注意分号不要少

create function add_fun(a int, b int)
returns int 
begin

        declare c int;
        set c = a + b;
        return c;
end;

#调用函数

select add_fun(10,10) as sum