Подобно тому, как объект подключения создает операторы и объекты подготовленного Statatement, он также создает объекты CallableStatement, которые будут использоваться для выполнения хранимой процедуры базы данных.
Создайте объект CallableStatement:
Предположим, необходимо выполнить следующие хранимые процедуры Oracle:
Создать или заменить процедуру getEmpName (EMP_ID в номере, EMP_FIRST OUT VARCHAR) ASBEGIN Выберите первым в EMP_FIRST от сотрудников, где ID = EMP_ID; END;
Примечание. Выше приведено, написанные Oracle, хранящиеся процедуры, но мы используем базу данных MySQL, написав одни и те же хранимые процедуры для MySQL следующим образом, создавая ее в базе данных EMP:
Delimiter $$ Процедура Drop If существует `emp`.` Getempname` $$ Create Processurure `emp`.` getempname` (в EMP_ID int, out EMP_FIRST VARCHAR (255)) Начните выберите первым в EMP_FIRST от сотрудников, где ID = EMP_ID; END $$ DELIMITER;
Существует три типа параметров: in, out и inout. Объект подготовки используется только в параметре. Объект CallableStatement может использовать все три.
Вот каждое определение:
Следующий фрагмент кода показывает, как создать экземпляр объекта CallableStatement на основе приведенной выше хранимой процедуры с использованием метода Connection.prepareCall ():
CallableStatement cstmt = null; try {string sql = "{call getempName (?,?)}"; cstmt = conn.preparecall (sql); Полем Полем .} Catch (SQLEXCECTION E) {. Полем .} окончательно { . Полем .}SQL строковой переменной представляет хранимую процедуру с использованием заполнителей параметров.
Использование объекта CallableStatement использует объект подготовки. Значение должно быть связано со всеми параметрами перед выполнением оператора, в противном случае будет получено SQLException.
Если есть параметр, просто следуйте теми же правилам и трюкам, которые применяются к объекту подготовленного статации; Используйте метод setxxx (), соответствующий типу данных Java, который будет связан.
При использовании параметров Out and Out, необходимо использовать registeroutparameter () с помощью дополнительного метода CallableStatement. MEDECTOUTPARAMETER () Метод JDBC Тип данных, связанный с хранимой процедурой, возвращаемой типом данных.
После того, как хранящаяся процедура вызвана, значение получается с использованием выходных параметров метода getxxx (). Этот метод отбрасывает значения типа SQL для извлечения типов данных Java.
Закройте объект CallableStatement:
Так же, как закрытие других объектов оператора, объект CallableStatement также должен быть закрыт по той же причине.
Простой призыв к методу Close () выполнит работу. Если объект соединения будет закрыт сначала, он также закроет объект CallableStatement. Тем не менее, объект CallableStatement всегда должен быть явно закрыт, чтобы обеспечить правильное разрешение.
CallableStatement cstmt = null; try {string sql = "{call getempName (?,?)}"; cstmt = conn.preparecall (sql); Полем Полем .} Catch (SQLEXCECTION E) {. Полем .} наконец {cstmt.close ();} PS: экземпляр объекта CallableStatation
Вот пример хранимой процедуры MySQL с использованием callableStatement вместе со следующим GetEmpName ():
Пожалуйста, убедитесь, что хранящаяся процедура была создана в базе данных EMP. Это можно сделать с помощью браузера MySQL запроса.
Delimiter $$ Процедура Drop If существует `emp`.` Getempname` $$ Create Processurure `emp`.` getempname` (в EMP_ID int, out EMP_FIRST VARCHAR (255)) Начните выберите первым в EMP_FIRST от сотрудников, где ID = EMP_ID; END $$ DELIMITER;
Этот код сценария был записан на основе установки среды и базы данных в предыдущей главе.
Скопируйте следующий пример jdbcexample.java, компиляция и запустить, как показано ниже:
// Шаг 1. Импорт Требуемый PackagesImport java.sql.*; Открытый класс jdbcexample {// jdbc имени драйвера и URL -адреса базы данных Static Final String jdbc_driver = "com.mysql.jdbc.driver"; Статическая конечная строка db_url = "jdbc: mysql: // localhost/emp"; // учетные данные базы данных Static Final String user = "username"; статическая конечная строка Pass = "пароль"; public static void main (string [] args) {connection conn = null; CallableStatement stmt = null; try {// Шаг 2: Зарегистрировать JDBC Driver Class.forname ("com.mysql.jdbc.driver"); // Шаг 3: Откройте систему соединения.out.println («Подключение к базе данных ...»); conn = drivermanager.getConnection (db_url, пользователь, Pass); // Шаг 4: Выполнить систему Query.out.println ("Создание оператора ..."); String sql = "{call getEmpname (?,?)}"; stmt = conn.preparecall (sql); // сначала привязать в параметре, затем свяжите параметр int empid = 102; stmt.setint (1, empid); // это установит идентификатор как 102 //, потому что второй параметр вышел, поэтому зарегистрируйте его stmt.registeroutparameter (2, java.sql.types.varchar); // Использование метода выполнения для запуска хранимой процедуры. System.out.println («Выполнение хранимой процедуры ...»); stmt.execute (); // Получить имя сотрудника с помощью метода getXXX string empname = stmt.getString (2); System.out.println («Имя EMP с id:» + empid + » - это» + empname); stmt.close (); conn.close (); } catch (sqlexception se) {// обрабатывать ошибки для jdbc se.printstacktrace (); } catch (Exception e) {// обрабатывать ошибки для class.forname e.printstacktrace (); } наконец {// наконец -то блок используется для закрытия ресурсов, попробуйте {if (stmt! = null) stmt.close (); } catch (sqlexception se2) {} // ничего мы не можем попробовать {if (conn! = null) conn.close (); } catch (sqlexception se) {se.printstacktrace (); } // end Наконец -то попробуйте} // end try system.out.println ("Прощай!"); } // end main} // end jdbcexampleТеперь составьте приведенный выше пример следующим образом:
C:> javac jdbcexample.java
При запуске JDBCEXAMPLE, он дает следующие результаты:
C:> Java Jdbcexample
Подключение к базе данных ... Создание оператора ... Выполнение хранимой процедуры ... Имя ИМТ с идентификатором: 102 - это Zaidgoodbye!
JDBC SQL Escape Syntax:
Синтаксис Escape обеспечивает гибкость использования определенных функций базы данных с помощью стандартных методов и свойств JDBC.
Общий формат синтаксиса Escape SQL выглядит следующим образом:
{ключевое слово 'параметры'}Вот следующие, которые будут найдены очень полезными при этом в программировании JDBC:
D, T, TS Ключевые слова:
Они помогают определить дату, время и марки времени. Как вы знаете, нет двух систем управления базами данных основаны на времени и дате одинаково. Этот синтаксис Escape сообщает водителю формат, дату или время для визуализации в целевую базу данных. Пример реализации:
{d 'yyyy-mm-dd'}где yyyy = год, мм = месяц, dd = день. Использование этого синтаксиса {D '2009-09-03'} 9 марта 2009 г.
Вот простой пример того, как вставить таблицу дат:
// Создание оператора objectStmt = conn.createStatement (); // вставить data ==> id, имя, фамилия, Dobstring sql = "Вставка в значения студентов" + "(100, 'zara', 'ali', {d '2001-12-16'})"; stmt.executeupdate (sql);Аналогично, можно использовать один из следующих двух синтаксисов, будь то T или TS:
{t 'HH: MM: SS'}где HH = часы, мм = минуты, ss = секунды. Использование этого синтаксиса {T '13: 30: 29 '} - 13:30 29 вечера.
{ts 'yyyy-mm-dd HH: MM: SS'}Это два синтаксиса «D» и «T» выше, чтобы представлять синтаксис комбинации TimeStamp.
Escape Keywords:
Это ключевое слово идентифицирует сбежавший символ, используемый в таком предложении. Полезно при использовании подстановочного знака SQL, где ноль или более символов соответствуют. Например:
String sql = "Выберите символ из математики, где символ, подобный '/%' {Escape ''}"; stmt.execute (sql);Если вы используете символ BackSlash () в качестве символа Escape, вы также должны использовать два символа BackSlash в буквальном буквальном языке Java, потому что BackSlash также является символом Java Escape.
Ключевые слова FN:
Это ключевое слово означает использование скалярных функций в СУБД. Например, вы можете использовать функцию длины SQL для расчета длины строки GE:
{fn Length ('Hello World')}Это вернется 11, длину строки «Hello World». Полем
Позвоните в ключевые слова:
Это ключевое слово используется для вызова хранимых процедур. Например, для сохраненной процедуры вам нужен параметр в IN, используйте следующий синтаксис:
{Call my_procedure (?)};Для сохраненной процедуры требуется параметр в инициаторе и возвращается параметр OUT, используя следующий синтаксис:
{? = Call My_Procedure (?)}; OJ Ключевые слова:
Это ключевое слово используется для представления внешнего соединения. Синтаксис выглядит следующим образом:
{OJ Over-Join}Внешнее соединение таблицы = {слева | Справа | Full} Внешнее соединение {Таблица | Внешнее соединение} Критерии поиска. Например:
String sql = "Выберите сотрудников из {oj thistable правого внешнего соединения, что на id = '100'}"; stmt.execute (sql);