Chamando procedimentos armazenados do MySQL a partir do JDBC

Resumo : Neste tutorial, você aprenderá como chamar um procedimento armazenado MySQL a partir de JDBC usando CallableStatementobject.

Antes que você comece

Para fins de demonstração, criaremos um novo procedimento armazenado chamado get_candidate_skillque aceita candidate_idcomo INparâmetro e retorna um conjunto de resultados que contém as habilidades do candidato:

DELIMITER $$
CREATE PROCEDURE get_candidate_skill(IN candidate_id INT)
BEGIN
	SELECT candidates.id, first_name,last_name, skills.name AS skill 
	FROM candidates
	INNER JOIN candidate_skills ON candidates.id = candidate_skills.candidate_id
	INNER JOIN skills ON skills.id = candidate_skills.skill_id
	WHERE candidates.id = candidate_id;
    END$$
DELIMITER ;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Vamos chamar esse procedimento armazenado para o candidato idcom o valor 122.

CALL get_candidate_skill(122);Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )
procedimento armazenado jdbc mysql

Apresentando CallableStatement e sintaxe de chamada de procedimento armazenado

Para chamar procedimentos armazenados ou funções armazenadas no MySQL a partir do JDBC, você usa CallableStatementobject, que herda de PreparedStatement object .

A sintaxe básica para chamar um procedimento armazenado é a seguinte:

{?= call procedure_name(param1,param2,...)}Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Nesta sintaxe, você agrupa a chamada do procedimento armazenado entre colchetes ( {}).

Se o procedimento armazenado retornar um valor, será necessário adicionar o ponto de interrogação e igual ( ?=) antes da callpalavra-chave.

Se um procedimento armazenado não retornar nenhum valor, basta omitir o ?=sinal.

Caso o procedimento armazenado aceite algum parâmetro, liste-os entre parênteses de abertura e fechamento ()após o nome do procedimento armazenado.

A seguir estão exemplos de uso da sintaxe para chamar procedimentos armazenados em diferentes contextos:

Sintaxe Procedimentos de Lojas
{chamar nome_do_procedimento() } Aceite um parâmetro e retorne um valor
{chamar nome_do_procedimento(?,?) } Aceite dois parâmetros e não retorne nenhum valor
{?= chamar nome_procedimento() } Não aceite nenhum parâmetro e retorne um valor
{?= chamar nome_do_procedimento(?) } Aceite um parâmetro e retorne um valor

Observe que o espaço reservado para ponto de interrogação ( ?) pode ser usado para os parâmetros IN, OUT e INOUT. Para obter informações detalhadas sobre diferentes tipos de parâmetros em procedimentos armazenados, confira Tutorial de parâmetros de procedimentos armazenados do MySQL .

Exemplo de procedimento armazenado JDBC MySQL

Primeiro, abra uma conexão com o servidor MySQL criando um novo Connectionobjeto.

Connection conn = DriverManager.getConnection();Linguagem de código:  Java  ( java )

Em seguida, prepare uma chamada de procedimento armazenado e crie um CallableStatementobjeto chamando prepareCall()o método do Connectionobjeto.

String query = "{CALL get_candidate_skill(?)}";
CallableStatement stmt = conn.prepareCall(query)Linguagem de código:  Java  ( java )

Em seguida, passe todos os parâmetros para o procedimento armazenado. Neste caso, o get_candidate_skillprocedimento armazenado aceita apenas um parâmetro IN.

stmt.setInt(1, candidateId);Linguagem de código:  Java  ( java )

Depois disso, execute o procedimento armazenado chamando o executeQuery()método do CallableStatementobjeto. Ele retorna um conjunto de resultados neste caso.

ResultSet rs = stmt.executeQuery();Linguagem de código:  Java  ( java )

Por fim, percorra o ResultSetpara exibir os resultados.

while (rs.next()) {
   System.out.println(String.format("%s - %s",
                      rs.getString("first_name") + " "
                      + rs.getString("last_name"),
                      rs.getString("skill")));
}Linguagem de código:  Java  ( java )

A seguir está um exemplo completo de chamada do procedimento armazenado MySQL do JDBC.

package org.mysqltutorial;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.CallableStatement;

/**
 *
 * @author tutorials.acervolima.com
 */
public class Main {

    /**
     * Get skills by candidate id
     *
     * @param candidateId
     */
    public static void getSkills(int candidateId) {
        // 
        String query = "{ call get_candidate_skill(?) }";
        ResultSet rs;

        try (Connection conn = MySQLJDBCUtil.getConnection();
                CallableStatement stmt = conn.prepareCall(query)) {

            stmt.setInt(1, candidateId);

            rs = stmt.executeQuery();
            while (rs.next()) {
                System.out.println(String.format("%s - %s",
                        rs.getString("first_name") + " "
                        + rs.getString("last_name"),
                        rs.getString("skill")));
            }
        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
        }
    }

    /**
     *
     * @param args
     */
    public static void main(String[] args) {
        getSkills(122);
    }
}Linguagem de código:  Java  ( java )

Vamos executar o programa.

exemplo de procedimento armazenado jdbc mysql

O programa funciona conforme o esperado.

Resumo

  • Use o objeto JDBC CallableStatementpara chamar um procedimento armazenado no banco de dados MySQL.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *