java调用存储过程
注意:以下分析,只基于 mysql 数据库。
存储过程简介
此部分参考于《java程序员面试宝典》
存储过程:SQL 语句在执行时要先编译,然后再被执行。在大型数据库系统中,为了提高效率,将为了完成特定功能的 SQL 语句集进行编译优化后,存储在数据库服务器中,用户通过指定存储过程的名字来调用执行。
使用存储过程可以增强 SQL 语言的功能和灵活性,由于可以用流程控制语句编写存储过程,有很强的灵活性,因此可以完成复杂的判断和运算,并且可以保证数据的安全性和完整性,同时,存储过程可以使没有权限的用户在控制之下间接地存储取数据库,也保证了数据的安全。
最基本语法:
create procedure sp_name([参数名][参数类型]...)
begin
...
end;
最简单实例:
显示当前数据库所有表
-- 创建一个无参数的存储过程,名字为 showTables
create PROCEDURE showTables()
BEGIN
show tables;
END;
-- 调用存储过程
call showTables();
-- 删除指定存储过程
drop PROCEDURE showTables;
CallableStatement 接口
接口定义
public interface CallableStatement extends PreparedStatement {
...
}
该接口用于执行 SQL 存储过程。
入门案例
存储过程语句
先在数据库中创建一个存储过程:给表 employee 中插入一条数据。
create PROCEDURE insertEmp
(lastName_0 varchar(50),
email_0 varchar(50),
gender_0 int(1),
department_id_0 int(11)
)
BEGIN
insert into
employee (lastName, email, gender, department_id)
values
(lastName_0, email_0, gender_0, department_id_0);
END;
java 代码
package org.feng.mysql;
import com.mysql.cj.jdbc.Driver;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/**
* Created by Feng on 2020/1/7 16:17
* CurrentProject's name is java8
* @author Feng
*/
public class ProcedureDemo {
public static void main(String[] args) throws SQLException {
// 加载驱动
new Driver();
String url = "jdbc:mysql://localhost:3306/springboot_crud?serverTimezone=UTC";
String username = "root";
String password = "root";
// 获取连接对象
try(Connection connection = DriverManager.getConnection(url, username, password);
CallableStatement callableStatement = connection.prepareCall("call insertEmp(?,?,?,?)")
){
// 设置参数
callableStatement.setString(1, "小王坡");
callableStatement.setString(2, "dwiodq@163.com");
callableStatement.setInt(3, 1);
callableStatement.setInt(4, 102);
callableStatement.execute();
System.out.println("执行结束!");
} catch(Exception e){
e.printStackTrace();
}
}
}
其中,输入的参数设置是继承自 PreparedStatement
接口的,并且所有输出的参数的类型必须在执行存储过程之前进行注册;
一个 CallableStatement
可以返回一个 ResultSet
对象或多个该对象。
我这个案例中,只涉及到插入一条数据,不存在返回值的问题。
但是从其源代码中可以看到:其中有大量重载的注册输出参数的方法。其中,第一个参数是输出的参数索引,从1开始;第二个参数是数据类型,还得参考一下java.sql.Types
类。
void registerOutParameter(int parameterIndex, int sqlType)throws SQLException;
Types
类:
public class Types {
public final static int BIT = -7;
public final static int TINYINT = -6;
public final static int SMALLINT = 5;
public final static int INTEGER = 4;
...
}
至于其他大部分使用方式与普通的 JDBC 差异就不大了;可以参考 PreparedStatement
接口的相关使用。
来源:CSDN
作者:你家宝宝
链接:https://blog.csdn.net/FBB360JAVA/article/details/103885175