从JDBC调用MySQL存储过程
在本教程中,您将学习如何使用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关键字前添加问号和等于(?=)。
如果存储过程不返回任何值,则只需省略?=符号。
如果存储过程接受任何参数,则可以在存储过程名称后的左括号和右括号中列出它们。
以下是使用语法在不同上下文中调用存储过程的示例:
| Syntax | Stores 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存储过程仅接受一个IN参数。
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数据库中的存储过程。

