English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
УчącJDBC-запросыВ то время как мы изучали, как использовать хранимые процедуры в JDBC, в этой главе мы рассмотрим аналогичную тему, но предоставим вам больше информации о SQL-эскапации в JDBC.
Как и объект Connection, создающий объекты Statement и PreparedStatement, он также создает объект CallableStatement, который будет использоваться для выполнения вызовов хранимых процедур в базе данных.
Предположим, что вам нужно выполнить следующую хранимую процедуру Oracle-
CREATE OR REPLACE PROCEDURE getEmpName (EMP_ID IN NUMBER, EMP_FIRST OUT VARCHAR) AS BEGIN SELECT first INTO EMP_FIRST FROM Employees WHERE ID = EMP_ID; END;
Заметка: Указанная хранимая процедура была написана для Oracle, но мы используем базу данных MySQL, поэтому давайте напишем такую же хранимую процедуру для MySQL, как показано ниже, чтобы создать её в базе данных EMP-
DELIMITER $$ DROP PROCEDURE IF EXISTS `EMP`.`getEmpName` $$ CREATE PROCEDURE `EMP`.`getEmpName` (IN EMP_ID INT, OUT EMP_FIRST VARCHAR(255)) BEGIN SELECT first INTO EMP_FIRST FROM Employees WHERE ID = EMP_ID; END $$ DELIMITER ;
Существует три типа параметров: IN, OUT и INOUT. Объект PreparedStatement использует только параметры IN. Объект CallableStatement может использовать все три типа.
Это определение каждого из них-
Область | Описание |
---|---|
IN | Параметры, значения которых неизвестны при создании SQL-запроса. Значения можно привязать к параметрам IN с помощью методов setXXX(). |
OUT | Значение предоставляется параметром SQL, возвращаемым в результате выполнения SQL-запроса. Значения можно извлечь из параметров OUT с помощью методов getXXX(). |
INOUT | Одновременно предоставляются параметры с входными и выходными значениями. Значения можно привязать с помощью методов setXXX(), а значения можно извлечь с помощью методов getXXX(). |
Следующий фрагмент кода показывает, как использовать этот метод для создания объекта на основе предыдущей хранимой процедуры-Connection.prepareCall()CallableStatement
CallableStatement cstmt = null; try { String SQL = "{call getEmpName (?, ?)}"; cstmt =conn.prepareCall(SQL); . . . } catch (SQLException e) { . . . } finally { . . . }
Строка переменной SQL represents the stored procedure with parameter placeholders.
Использование объекта CallableStatement очень похоже на использование объекта PreparedStatement. Вы должны привязать значения ко всем параметрам перед выполнением этой строки, иначе вы получите SQLException.
Если есть параметры IN, следуйте тем же правилам и технологиям, применяемым к объектам PreparedStatement; используйте методы setXXX() для привязки значений, соответствующие绑аемому типу данных Java.
При использовании параметров OUT и INOUT необходимо использовать дополнительный метод CallableStatement registerOutParameter(). Метод registerOutParameter() привязывает тип данных JDBC к ожидаемому типу данных, возвращаемому хранимой процедурой.
После вызова хранимой процедуры можно использовать соответствующие методы getXXX() для извлечения значений из параметров OUT. Этот метод преобразует полученные значения типа SQL в типы Java.
Как и при закрытии других объектов Statement, по той же причине, вы должны закрыть объект CallableStatement.
Достаточно просто вызвать метод close(). Если сначала закрыть объект Connection, он также закроет объект CallableStatement. Однако, вы должны всегда явно закрывать объект CallableStatement, чтобы обеспечить правильную очистку.
CallableStatement cstmt = null; try { String SQL = "{call getEmpName (?, ?)}"; cstmt =conn.prepareCall(SQL); . . . } catch (SQLException e) { . . . } finally { cstmt.close(); }
研究我们在可调用示例代码中研究了更多的细节。
Escape 语法使您能够灵活地使用标准 JDBC 方法和属性所不能使用的数据库特定特性。
通用的SQL转义语法格式如下-
{keyword 'parameters'}
以下是以下转义序列,在执行JDBC编程时您会发现它们非常有用-
它们可以帮助标识日期、时间和时间戳的文本。如您所知,没有两个 dbms 以相同的方式表示时间和日期。这种转义语法告诉驱动程序以目标数据库的格式呈现日期或时间。例如:
{d 'yyyy-mm-dd'}
где yyyy = год, mm = месяц; dd = день. Использование этой грамматики {d'2009-09-03'} является 9 марта 2009 года.
Это простая демонстрация того, как вставлять даты в таблицу-
//Создание объекта Statement stmt = conn.createStatement(); //Insert data ==> ID, First Name, Last Name, DOB String sql = "INSERT INTO STUDENTS VALUES" + "(100,'Zara','Ali', {d '2001-12-16'})"; stmt.executeUpdate(sql);
Таким же образом, вы можете использовать одну из следующих двух грамматик:tилиts:
{t 'hh:mm:ss'}
где hh = час; mm = минута; ss = секунда. Использование этой грамматики {t '13:30:29'} в 1:30:29 PM.
{ts 'yyyy-mm-dd hh:mm:ss'}
Это комбинация вышеуказанных синтаксисов, где 'd' и 't' представляют собой timestamps.
Этот ключевой символ указывает на управляющий символ, используемый в предложении LIKE.非常に有用です。Этот символ подстановки % соответствует одному или нескольким символам. Например:
String sql = "SELECT symbol FROM MathSymbols" WHERE symbol LIKE '\%' {escape '\'}; stmt.execute(sql);
Если символ обратной косой черты () используется в качестве символа escaping, то также необходимо использовать две обратные косые черты в строке Java String literal, так как обратная косая черта также является символом escaping в Java.
Этот ключевой символ обозначает скалярные функции, используемые в DBMS. Например, вы можете использовать SQL-функцииlengthЧтобы получить длину строки-
{fn length('Hello World')}
Это вернет 11, то есть длину строки «Hello World».
Этот ключевой символ используется для вызова хранимых процедур. Например, для хранимых процедур, требующих параметров IN, используйте следующий синтаксис-
{call my_procedure(?)};
Для хранимых процедур, требующих параметров IN и возвращающих параметры OUT, используйте следующий синтаксис-
{? = call my_procedure(?)};
Этот ключевой символ используется для обозначения внешнего JOIN. Грамматика такова-
{oj outer-join}
Внешний JOIN = таблица {LEFT | RIGHT | FULL} OUTER JOIN {table | условие поиска. Например-
String sql = "SELECT Employees FROM {oj ThisTable RIGHT OUTER JOIN ThatTable ON id = '100'; stmt.execute(sql);