存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL语句集,存储在数据库中,经过第一次编译后调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它,使用JDBC(Java Database Connectivity)连接和调用存储过程是一种常见的操作方式,以下是详细的步骤和示例代码:
1、导入JDBC驱动程序:确保已导入相应的JDBC驱动程序,对于MySQL数据库,需要导入mysql-connector-java
驱动程序,可以通过添加Maven依赖或者手动下载jar文件的方式进行导入。
Maven依赖示例:
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.26</version> </dependency>
2、配置数据库连接参数:配置数据库连接需要提供数据库URL、用户名和密码,以下是一个配置数据库连接的示例代码:
String jdbcUrl = "jdbc:mysql://localhost:3306/mydatabase"; String username = "root"; String password = "password";
1、建立数据库连接:通过DriverManager
类获取数据库连接。
Connection connection = null; try { connection = DriverManager.getConnection(jdbcUrl, username, password); } catch (SQLException e) { e.printStackTrace(); }
2、创建CallableStatement对象:使用Connection
对象的prepareCall
方法创建CallableStatement
对象,并传入存储过程的调用语句,假设有一个存储过程名为getEmployeeDetails
,接受一个输入参数employeeId
,并返回一个结果集:
CallableStatement callableStatement = null; try { callableStatement = connection.prepareCall("{call getEmployeeDetails(?)}"); } catch (SQLException e) { e.printStackTrace(); }
3、设置输入参数:通过CallableStatement
对象的set
方法设置存储过程的输入参数,设置employeeId
参数:
try { callableStatement.setInt(1, 1234); // 假设employeeId为1234 } catch (SQLException e) { e.printStackTrace(); }
4、执行存储过程:调用executeQuery
方法执行存储过程,并处理结果集。
ResultSet resultSet = null; try { resultSet = callableStatement.executeQuery(); } catch (SQLException e) { e.printStackTrace(); }
5、处理结果集:如果存储过程返回结果集,可以通过ResultSet
对象进行处理,遍历结果集并输出每行数据:
try { while (resultSet.next()) { int id = resultSet.getInt("id"); String name = resultSet.getString("name"); System.out.println("ID: " + id + ", Name: " + name); } } catch (SQLException e) { e.printStackTrace(); }
6、关闭资源:在完成存储过程的调用后,需要关闭CallableStatement
和Connection
对象,以释放资源。
finally { if (callableStatement != null) { try { callableStatement.close(); } catch (SQLException e) { e.printStackTrace(); } } if (connection != null) { try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } }
以下是一个完整的示例代码,展示如何使用JDBC连接数据库、调用存储过程,并处理输入输出参数和结果集:
import java.sql.*; public class StoredProcExample { public static void main(String[] args) { String jdbcUrl = "jdbc:mysql://localhost:3306/mydatabase"; String username = "root"; String password = "password"; Connection connection = null; CallableStatement callableStatement = null; ResultSet resultSet = null; try { // 建立数据库连接 connection = DriverManager.getConnection(jdbcUrl, username, password); // 创建CallableStatement对象 callableStatement = connection.prepareCall("{call getEmployeeDetails(?)}"); // 设置输入参数 callableStatement.setInt(1, 1234); // 假设employeeId为1234 // 执行存储过程 resultSet = callableStatement.executeQuery(); // 处理结果集 while (resultSet.next()) { int id = resultSet.getInt("id"); String name = resultSet.getString("name"); System.out.println("ID: " + id + ", Name: " + name); } } catch (SQLException e) { e.printStackTrace(); } finally { // 关闭资源 if (callableStatement != null) { try { callableStatement.close(); } catch (SQLException e) { e.printStackTrace(); } } if (connection != null) { try { connection.close(); } catch (SQLException e) { e.printStackTrace(); } } } } }
1、问:如何在JDBC中调用没有返回值的存储过程?
答:在JDBC中调用没有返回值的存储过程与调用有返回值的存储过程类似,只是不需要处理返回值,可以使用CallableStatement
对象的execute
方法来执行存储过程。
CallableStatement cs = conn.prepareCall("{call proc_Ins_Dept(?,?,?)}"); cs.setObject(1, 76); cs.setObject(2, "技术部"); cs.setObject(3, "zhengzhou"); cs.execute(); cs.close(); conn.close();
2、问:如何在JDBC中注册和使用输出参数?
答:在JDBC中注册和使用输出参数需要使用CallableStatement
对象的registerOutParameter
方法来注册输出参数的类型,并在执行存储过程后使用get
方法来获取输出参数的值。
CallableStatement cs = conn.prepareCall("{call pro_Ins_Dept2(?,?,?,?)}"); cs.setObject(1, 76); cs.setObject(2, "市场部"); cs.setObject(3, "luoyang"); cs.registerOutParameter(4, java.sql.Types.VARCHAR); // 注册返回类型(sql类型) cs.execute(); Object objRtn = cs.getObject(4); // 得到返回值 System.out.println(objRtn); cs.close(); conn.close();