Assim como um objeto de conexão cria objetos de instrução e preparado, ele também cria objetos de callablestatement que serão usados para executar o procedimento armazenado do banco de dados.
Crie um objeto CallableStatement:
Suponha que os seguintes procedimentos armazenados do Oracle precisem ser executados:
Crie ou substitua o procedimento getempName (EMP_ID em número, EMP_FIRST OUT VARCHAR) ASBEGIN SELECT PRIMEIRO EM EMP_FIRST FRORM DO FUNCIONÁRIO WHEN ID = EMP_ID; END;
NOTA: O exposto acima escreveu procedimentos armazenados do Oracle, mas estamos usando o banco de dados MySQL, escrevendo os mesmos procedimentos armazenados para o MySQL da seguinte maneira, criando -o no banco de dados EMP:
Delimitador $$ PROCEDIMENTO DE DESLIGADO Se existir `Emp`.
Existem três tipos de parâmetros: In, Out and Inout. O objeto PreparedStatement usa apenas no parâmetro. O objeto Callablestatement pode usar os três.
Aqui estão cada definição:
O snippet de código a seguir mostra como instanciar um objeto Callablestatement com base no procedimento armazenado acima usando o método Connection.Preparecall ():
Callablestatement cstmt = null; tente {string sql = "{ligue para getempName (?,?)}"; cstmt = Conn.Preparecall (SQL); . . .} Catch (sqLexception e) {. . .} finalmente { . . .}O SQL da variável String representa um procedimento armazenado, usando espaços reservados para parâmetros.
O uso de um objeto CallableStatement está usando um objeto preparado. O valor deve estar vinculado a todos os parâmetros antes de executar a instrução, caso contrário, uma SQLEXCECCO será recebida.
Se houver um parâmetro no parâmetro, basta seguir as mesmas regras e truques que se aplicam ao objeto preparado; Use o método setxxx () correspondente ao tipo de dados Java a ser vinculado.
Ao usar parâmetros de saída e inout, registroOUTParameter () com o método adicional de callablestatements deve ser usado. Método RegisteroutParameter () JDBC Tipo de dados ligado ao procedimento armazenado retornado pelo tipo de dados.
Depois que o procedimento armazenado é chamado, o valor é recuperado usando os parâmetros de saída do método getxxx (). Este método lança valores de tipo SQL para recuperar tipos de dados Java.
Feche o objeto CallableStatement:
Assim como o fechamento de outros objetos de declaração, o objeto CallableStatement também deve ser fechado pelo mesmo motivo.
Uma chamada simples para o método Close () fará o trabalho. Se o objeto de conexão estiver fechado primeiro, ele também fechará o objeto Callablestatement. No entanto, o objeto CallableStatement deve sempre ser explicitamente fechado para garantir a liberação correta.
Callablestatement cstmt = null; tente {string sql = "{ligue para getempName (?,?)}"; cstmt = Conn.Preparecall (SQL); . . .} Catch (sqLexception e) {. . .} finalmente {cstmt.close ();} PS: Instância do objeto Callablestatement
Aqui está um exemplo de um procedimento armazenado MySQL usando o CallableStatement junto com o seguinte getempName ():
Verifique se o procedimento armazenado foi criado no banco de dados EMP. Isso pode ser feito usando o navegador de consulta MySQL.
Delimitador $$ PROCEDIMENTO DE DESLIGADO Se existir `Emp`.
Esse código de script foi escrito com base na instalação do ambiente e do banco de dados no capítulo anterior.
Copie o seguinte exemplo jdbcexample.java, compilar e execute como mostrado abaixo:
// Etapa 1. Importar pacotes necessários String final estática db_url = "jdbc: mysql: // localhost/empp"; // credenciais de banco de dados estático final string user = "nome de usuário"; estático final string pass = "senha"; public static void main (string [] args) {conexão conn = null; Callablestatement stmt = null; tente {// Etapa 2: Registre JDBC Driver Class.ForName ("com.mysql.jdbc.driver"); // Etapa 3: abra um sistema de conexão.out.println ("conectando ao banco de dados ..."); Conn = DriverManager.getConnection (db_url, usuário, passa); // Etapa 4: execute um sistema de consulta.out.println ("criando declaração ..."); String sql = "{ligue para getempName (?,?)}"; stmt = Conn.Preparecall (SQL); // liga -se primeiro no parâmetro e depois vincula o parâmetro int empid = 102; stmt.setInt (1, empid); // Isso definiria ID como 102 // porque o segundo parâmetro está disponível, então registre -o stmt.RegisterOutParameter (2, java.sql.types.varchar); // Use o método Execute para executar o procedimento armazenado. System.out.println ("Execução do procedimento armazenado ..."); stmt.execute (); // recuperar o nome do funcionário com o método getxxx string empname = stmt.getString (2); System.out.println ("Nome emp com ID:" + empid + "é" + empname); stmt.close (); Conn.Close (); } catch (sqlexception se) {// manipula erros para jdbc SE.printStackTrace (); } catch (Exceção e) {// manipula erros para class.ForName E.PrintStackTrace (); } finalmente {// Finalmente o bloco usado para fechar os recursos tente {if (stmt! = null) stmt.close (); } catch (sqLexception SE2) {} // nada que possamos fazer tente {if (conn! = null) conn.close (); } catch (sqLexception SE) {SE.printStackTrace (); } // Finalmente, finalmente tente} // End Try System.out.println ("Adeus!"); } // END PRINCIPAL} // END JDBCEXAMPLEAgora compile o exemplo acima da seguinte forma:
C:> javac jdbcexample.java
Ao executar o JDBCExample, ele produz os seguintes resultados:
C:> Java Jdbcexample
Conectando ao banco de dados ... Criando declaração ... Execução do procedimento armazenado ... Nome Emp com ID: 102 é Zaidgoodbye!
JDBC SQL Escape Sintaxe:
A sintaxe do Escape permite a flexibilidade de usar certos recursos do banco de dados usando métodos e propriedades JDBC padrão.
O formato geral de sintaxe do SQL Escape é o seguinte:
{Keyword 'Parâmetros'}Aqui estão o seguinte que será considerado muito útil ao fazê -lo na programação JDBC:
D, T, TS Palavras -chave:
Eles ajudam a determinar o texto da data, hora e carimbo. Como você sabe, não há dois sistemas de gerenciamento de banco de dados baseados em tempo e data da mesma maneira. Essa sintaxe de fuga informa ao driver o formato, data ou hora para renderizar para o banco de dados de destino. Exemplo de implementação:
{D 'AAAA-MM-DD'}onde sim = ano, mm = mês, dd = dia. Usar esta sintaxe {d '2009-09-03'} é 9 de março de 2009.
Aqui está um exemplo simples de como inserir uma tabela de data:
// Crie uma instrução objectStmt = Conn.Createstatement (); // Insira dados ==> id, primeiro nome, sobrenome, Dobstring sql = "inserir nos valores dos alunos" + "(100, 'zara', 'ali', {d '2001-12-16'}"; stmt.execupdate (sql);Da mesma forma, uma das duas sintaxes a seguir pode ser usada, seja t ou ts:
{t 'hh: mm: ss'}onde hh = horas, mm = minutos, ss = segundos. Usando esta sintaxe {T '13: 30: 29 '} é 13:30 14:00.
{ts 'yyyy-mm-dd hh: mm: ss'}Estas são as duas sintaxes 'd' e 't' acima para representar a sintaxe da combinação de registro de data e hora.
Escape Palavras -chave:
Essa palavra -chave identifica o caractere escapado usado na cláusula semelhante. Útil ao usar o SQL Wildcard %, onde zero ou mais caracteres são correspondentes. Por exemplo:
String sql = "Selecione símbolo de matem símbolos onde símbolo como '/%' {escape ''}"; stmt.execute (sql);Se você usar o caractere de barragem () como o personagem Escape, também deverá usar dois caracteres de barra de barragem no literal de String Java, porque a barra de barriga também é um personagem Java Escape.
FN Palavras -chave:
Essa palavra -chave significa usar funções escalares no DBMS. Por exemplo, você pode usar a função de comprimento SQL para calcular o comprimento de uma string ge:
{FN Length ('Hello World')}Isso retornará 11, a duração da string 'Hello World'. .
Ligue para palavras -chave:
Essa palavra -chave é usada para chamar procedimentos armazenados. Por exemplo, para um procedimento armazenado, você precisa de um parâmetro, use a seguinte sintaxe:
{Call my_procedure (?)};Para um procedimento armazenado, é necessário um parâmetro no parâmetro e um parâmetro out é retornado, usando a seguinte sintaxe:
{? = ligue para my_procedure (?)}; OJ Palavras -chave:
Essa palavra -chave é usada para representar uma junção externa. A sintaxe é a seguinte:
{OJ Outer-Join}Tabela de junção externa = {esquerda | À direita | Full} junção externa {tabela | junção externa} Critérios de pesquisa. Por exemplo:
String sql = "Selecione funcionários de {oj thistable direito de junção direita à direita que tabela em id = '100'}"; stmt.execute (sql);