从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数据库中的存储过程。