MySQL 什么是存储过程?
存储过程(Stored Procedure)是一组预定义好的SQL语句集合,它们组成了一个可重复执行的程序,可以被存储在数据库中,供其他程序或者用户使用。存储过程不仅具有SQL语句的所有功能,而且可以使用流程控制、变量定义、异常处理等高级语言的特性,可以大大提高数据库的执行效率和数据的安全性。另外,存储过程还可以批量处理数据,降低了网络传输的开销。
举个例子,我们可以创建一个计算员工薪资的存储过程:
CREATE PROCEDURE calculate_salary(IN employee_id INT)
BEGIN
DECLARE basic_salary INT;
DECLARE bonus INT;
DECLARE total_salary INT;
SELECT basic_salary INTO basic_salary FROM employee WHERE id = employee_id;
SELECT sum(amount) INTO bonus FROM bonus WHERE employee_id = employee_id;
SET total_salary = basic_salary + bonus;
SELECT total_salary;
END
这个存储过程接受一个员工ID作为参数,然后查询员工的基本工资和奖金,计算出总工资并返回。
阅读更多:MySQL 教程
如何使用JDBC程序调用存储过程?
JDBC是Java连接数据库的标准API,它提供了一系列的接口和类,可以让Java程序连接到不同的数据库,并且执行SQL语句。
要使用JDBC程序调用存储过程,首先需要准备好数据库的连接信息。
import java.sql.*;
public class Main {
private static final String DB_URL = "jdbc:mysql://localhost:3306/test";
private static final String USER = "root";
private static final String PASS = "123456";
public static void main(String[] args) {
try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);
CallableStatement stmt = conn.prepareCall("{call calculate_salary(?)}")) {
stmt.setInt(1, 1);
boolean hasResult = stmt.execute();
if (hasResult) {
ResultSet rs = stmt.getResultSet();
if (rs.next()) {
int total_salary = rs.getInt(1);
System.out.println("Total salary: " + total_salary);
}
}
} catch (SQLException e) {
System.err.println("SQLException: " + e.getMessage());
}
}
}
这个JDBC程序接受一个员工ID(这里是1)作为参数,然后调用存储过程calculate_salary,获取计算结果并打印输出。
需要注意的是,调用存储过程可以使用PreparedStatement或者CallableStatement,后者是用于调用存储过程的特殊语句,使用“{call 存储过程名(参数列表)}”的格式。在执行CallableStatement之前需要先设置参数,然后执行stmt.execute()方法,返回值表示是否有返回结果集。
结论
存储过程是一组预定义好的SQL语句集合,可以大大提高数据库的执行效率和数据的安全性。JDBC程序可以调用存储过程,使用CallableStatement来执行特定的存储过程语句,设置参数并获取返回结果。
极客笔记