从JDBC调用MySQL存储过程

时间:2019-11-20 08:52:37  来源:igfitidea点击:

在本教程中,您将学习如何使用CallableStatement对象从JDBC调用MySQL存储过程。

在你开始之前

为了演示,我们将创建一个名为get_candidate_skill的新存储过程,该存储过程接受候选人ID作为IN参数并返回包含候选人技能的结果集。

DELIMITER $$
CREATE PROCEDURE get_candidate_skill(IN candidate_id INT)
BEGIN
	SELECT candidates.id, first_name,last_name, skills.name AS skill 
	FROM candidates
	INNER JOIN candidate_skills ON candidates.id = candidate_skills.candidate_id
	INNER JOIN skills ON skills.id = candidate_skills.skill_id
	WHERE candidates.id = candidate_id;
    END$$
DELIMITER ;

我们将此存储过程称为值为122的候选ID。

CALL get_candidate_skill(122);

CallableStatement和存储过程调用语法简介

要从JDBC在MySQL中调用存储过程或存储函数,请使用CallableStatement对象,该对象继承自PreparedStatement对象。
调用存储过程的一般语法如下:

{?= call procedure_name(param1,param2,...)}

您将存储过程调用包装在大括号({})中。
如果存储过程返回值,则需要在call关键字前添加问号和等于(?=)。
如果存储过程不返回任何值,则只需省略?=符号。
如果存储过程接受任何参数,则可以在存储过程名称后的左括号和右括号中列出它们。

以下是使用语法在不同上下文中调用存储过程的示例:

SyntaxStores Procedures
{ call procedure_name() }Accept no parameters and return no value
{ call procedure_name(?,?) }Accept two parameters and return no value
{?= call procedure_name() }Accept no parameter and return value
{?= call procedure_name(?) }Accept one parameter and return value

注意,问号占位符(?)可以用于IN,OUT和INOUT参数。
有关存储过程中不同参数类型的详细信息,请查看MySQL存储过程参数教程。

JDBC MySQL存储过程示例

首先,通过创建一个新的Connection对象打开与MySQL服务器的连接。

Connection conn = DriverManager.getConnection();

然后,准备存储过程调用,并通过调用Connection对象的prepareCall()方法创建一个CallableStatement对象。

String query = "{CALL get_candidate_skill(?)}";
CallableStatement stmt = conn.prepareCall(query)

接下来,将所有参数传递给存储过程。
在这种情况下,get_candidate_skill存储过程仅接受一个I​​N参数。

stmt.setInt(1, candidateId);

之后,通过调用CallableStatement对象的executeQuery()方法执行存储过程。
在这种情况下,它将返回结果集。

ResultSet rs = stmt.executeQuery();

最后,遍历ResultSet以显示结果。

while (rs.next()) {
   System.out.println(String.format("%s - %s",
                      rs.getString("first_name") + " "
                      + rs.getString("last_name"),
                      rs.getString("skill")));
}

以下是从JDBC调用MySQL存储过程的完整示例。

package org.theitroad;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.CallableStatement;

/**
 *
 * @author theitroad.local
 */
public class Main {

    /**
     * Get skills by candidate id
     *
     * @param candidateId
     */
    public static void getSkills(int candidateId) {
        // 
        String query = "{ call get_candidate_skill(?) }";
        ResultSet rs;

        try (Connection conn = MySQLJDBCUtil.getConnection();
                CallableStatement stmt = conn.prepareCall(query)) {

            stmt.setInt(1, candidateId);

            rs = stmt.executeQuery();
            while (rs.next()) {
                System.out.println(String.format("%s - %s",
                        rs.getString("first_name") + " "
                        + rs.getString("last_name"),
                        rs.getString("skill")));
            }
        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
        }
    }

    /**
     *
     * @param args
     */
    public static void main(String[] args) {
        getSkills(122);
    }
}

让我们运行程序。

该程序将按预期工作。

在本教程中,我们向您展示了如何使用JDBC CallableStatement对象从Java程序调用MySQL数据库中的存储过程。