杰瑞科技汇

Java如何调用MySQL存储过程?

Java 调用 MySQL 存储过程

在 Java 中调用 MySQL 存储过程可以通过 JDBC 实现,下面我将介绍几种常见的方法和示例代码。

Java如何调用MySQL存储过程?-图1
(图片来源网络,侵删)

准备工作

首先确保你已经:

  • 添加了 MySQL JDBC 驱动依赖(如 mysql-connector-java
  • 建立了数据库连接

调用无参数的存储过程

import java.sql.*;
public class CallStoredProcedureExample {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/your_database";
        String user = "username";
        String password = "password";
        try (Connection conn = DriverManager.getConnection(url, user, password)) {
            // 调用存储过程
            CallableStatement cstmt = conn.prepareCall("{call your_storedProcedure()}");
            // 执行存储过程
            cstmt.execute();
            // 如果存储过程有结果集,可以获取
            ResultSet rs = cstmt.getResultSet();
            while (rs.next()) {
                // 处理结果集
                System.out.println(rs.getString("column_name"));
            }
            rs.close();
            cstmt.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

调用带参数的存储过程

1 IN 参数

try (Connection conn = DriverManager.getConnection(url, user, password)) {
    // 调用带IN参数的存储过程
    CallableStatement cstmt = conn.prepareCall("{call your_storedProcedure(?)}");
    // 设置IN参数
    cstmt.setInt(1, 100); // 假设第一个参数是整数类型
    // 执行存储过程
    cstmt.execute();
    // 处理结果(如果有)
    // ...
} catch (SQLException e) {
    e.printStackTrace();
}

2 OUT 参数

try (Connection conn = DriverManager.getConnection(url, user, password)) {
    // 调用带OUT参数的存储过程
    CallableStatement cstmt = conn.prepareCall("{call your_storedProcedure(?, ?)}");
    // 设置IN参数
    cstmt.setInt(1, 100);
    // 注册OUT参数
    cstmt.registerOutParameter(2, Types.INTEGER); // 假设第二个参数是整数类型
    // 执行存储过程
    cstmt.execute();
    // 获取OUT参数的值
    int result = cstmt.getInt(2);
    System.out.println("Result: " + result);
    // 处理结果(如果有)
    // ...
} catch (SQLException e) {
    e.printStackTrace();
}

3 INOUT 参数

try (Connection conn = DriverManager.getConnection(url, user, password)) {
    // 调用带INOUT参数的存储过程
    CallableStatement cstmt = conn.prepareCall("{call your_storedProcedure(?)}");
    // 设置INOUT参数的初始值
    cstmt.setInt(1, 100);
    // 注册INOUT参数
    cstmt.registerOutParameter(1, Types.INTEGER);
    // 执行存储过程
    cstmt.execute();
    // 获取INOUT参数的返回值
    int result = cstmt.getInt(1);
    System.out.println("Result: " + result);
    // 处理结果(如果有)
    // ...
} catch (SQLException e) {
    e.printStackTrace();
}

处理多个结果集

如果存储过程返回多个结果集,可以使用以下方式:

try (Connection conn = DriverManager.getConnection(url, user, password)) {
    CallableStatement cstmt = conn.prepareCall("{call your_storedProcedure()}");
    boolean hasResult = cstmt.execute();
    while (hasResult) {
        ResultSet rs = cstmt.getResultSet();
        while (rs.next()) {
            // 处理当前结果集
            System.out.println(rs.getString("column_name"));
        }
        rs.close();
        // 检查是否有更多结果集
        hasResult = cstmt.getMoreResults();
    }
    cstmt.close();
} catch (SQLException e) {
    e.printStackTrace();
}

使用 Spring Data 调用存储过程

如果你使用 Spring Boot,可以更简单地调用存储过程:

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.SqlOutParameter;
import org.springframework.jdbc.core.SqlParameter;
import org.springframework.jdbc.core.simple.SimpleJdbcCall;
import org.springframework.stereotype.Repository;
import java.sql.Types;
import java.util.HashMap;
import java.util.Map;
@Repository
public class UserRepository {
    private final JdbcTemplate jdbcTemplate;
    public UserRepository(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }
    public Map<String, Object> callStoredProcedure() {
        SimpleJdbcCall jdbcCall = new SimpleJdbcCall(jdbcTemplate)
                .withSchemaName("your_schema")
                .withProcedureName("your_storedProcedure")
                .declareParameters(
                        new SqlParameter("in_param", Types.INTEGER),
                        new SqlOutParameter("out_param", Types.INTEGER)
                );
        Map<String, Object> inParams = new HashMap<>();
        inParams.put("in_param", 100);
        return jdbcCall.execute(inParams);
    }
}

注意事项

  1. 确保存储过程在数据库中已存在
  2. 参数索引从1开始,不是0
  3. 对于OUT参数,必须先注册才能获取值
  4. 处理完所有结果集和参数后,记得关闭CallableStatement
  5. 考虑使用连接池(如HikariCP)提高性能

希望这些示例能帮助你在Java中成功调用MySQL存储过程!

Java如何调用MySQL存储过程?-图2
(图片来源网络,侵删)
分享:
扫描分享到社交APP
上一篇
下一篇