Resumo : Neste tutorial, você aprenderá como chamar um procedimento armazenado MySQL a partir de JDBC usando CallableStatement
object.
Antes que você comece
Para fins de demonstração, criaremos um novo procedimento armazenado chamado get_candidate_skill
que aceita candidate_id
como IN
parâ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 id
com o valor 122
.
CALL get_candidate_skill(122);
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
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 CallableStatement
object, 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 call
palavra-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 Connection
objeto.
Connection conn = DriverManager.getConnection();
Linguagem de código: Java ( java )
Em seguida, prepare uma chamada de procedimento armazenado e crie um CallableStatement
objeto chamando prepareCall()
o método do Connection
objeto.
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_skill
procedimento 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 CallableStatement
objeto. Ele retorna um conjunto de resultados neste caso.
ResultSet rs = stmt.executeQuery();
Linguagem de código: Java ( java )
Por fim, percorra o ResultSet
para 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.
O programa funciona conforme o esperado.
Resumo
- Use o objeto JDBC
CallableStatement
para chamar um procedimento armazenado no banco de dados MySQL.