java调用存储过程

↘锁芯ラ 提交于 2020-01-11 02:43:01

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 接口的相关使用。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!