Что такое statement preparedstatement callablestatement

Что такое statement preparedstatement callablestatement

JDBC основан на концепции драйверов, которые позволяют получать соединение с базой данных по специально описанному URL. При загрузке драйвер регистрирует себя в системе и в дальнейшем автоматически вызывается, когда программа требует URL, содержащий протокол, за который этот драйвер отвечает.

В чем заключаются преимущества использования JDBC?

Преимуществами JDBC считают:

Что из себя представляет JDBC URL?

JDBC URL состоит из:

Пример JDBC URL для подключения к MySQL базе данных «Test» расположенной по адресу localhost и ожидающей соединений по порту 3306: jdbc:mysql://localhost:3306/Test

Из каких частей стоит JDBC?

JDBC состоит из двух частей:

JDBC превращает вызовы уровня API в «родные» команды того или иного сервера баз данных.

Перечислите основные классы и интерфейсы JDBC.

Перечислите основные типы данных используемые в JDBC. Как они связаны с типами Java?

JDBC TypeJava Object Type
CHARString
VARCHARString
LONGVARCHARString
NUMERICjava.math.BigDecimal
DECIMALjava.math.BigDecimal
BITBoolean
TINYINTInteger
SMALLINTInteger
INTEGERInteger
BIGINTLong
REALFloat
FLOATDouble
DOUBLEDouble
BINARYbyte[]
VARBINARYbyte[]
LONGVARBINARYbyte[]
DATEjava.sql.Date
TIMEjava.sql.Time
TIMESTAMPjava.sql.Timestamp
CLOBClob
BLOBBlob
ARRAYArray
STRUCTStruct
REFRef
DISTINCTсопоставление базового типа
JAVA_OBJECTбазовый класс Java

Опишите основные этапы работы с базой данных при использовании JDBC.

Как зарегистрировать драйвер JDBC?

Регистрацию драйвера можно осуществить несколькими способами:

Class.forName(«полное имя класса драйвера») ;

Как установить соединение с базой данных?

В качестве параметра может передаваться:

Какие уровни изоляции транзакций поддерживаются в JDBC?

Уровень изолированности транзакций — значение, определяющее уровень, при котором в транзакции допускаются несогласованные данные, то есть степень изолированности одной транзакции от другой. Более высокий уровень изолированности повышает точность данных, но при этом может снижаться количество параллельно выполняемых транзакций. С другой стороны, более низкий уровень изолированности позволяет выполнять больше параллельных транзакций, но снижает точность данных.

Во время использования транзакций, для обеспечения целостности данных, СУБД использует блокировки, чтобы заблокировать доступ других обращений к данным, участвующим в транзакции. Такие блокировки необходимы, чтобы предотвратить:

«грязное» чтение (dirty read) — чтение данных, добавленных или изменённых транзакцией, которая впоследствии не подтвердится (откатится);

неповторяющееся чтение (non-repeatable read) — при повторном чтении в рамках одной транзакции ранее прочитанные данные оказываются изменёнными;

фантомное чтение (phantom reads) — ситуация, когда при повторном чтении в рамках одной транзакции одна и та же выборка дает разные множества строк.

Уровни изоляции транзакций определены в виде констант интерфейса java.sql.Connection :

TRANSACTION_NONE – драйвер не поддерживает транзакции;

TRANSACTION_READ_UNCOMMITTED – позволяет транзакциям видеть несохраненные изменения данных: разрешает грязное, непроверяющееся и фантомное чтения;

TRANSACTION_READ_COMMITTED – любое изменение, сделанное в транзакции, не видно вне неё, пока она не сохранена: предотвращает грязное чтение, но разрешает непроверяющееся и фантомное;

TRANSACTION_REPEATABLE_READ – запрещает грязное и непроверяющееся, фантомное чтение разрешено;

TRANSACTION_SERIALIZABLE – грязное, непроверяющееся и фантомное чтения запрещены.

NB! Сервер базы данных может не поддерживать все уровни изоляции. Интерфейс java.sql.DatabaseMetaData предоставляет информацию об уровнях изолированности транзакций, которые поддерживаются данной СУБД.

При помощи чего формируются запросы к базе данных?

Для выполнения запросов к базе данных в Java используются три интерфейса:

Объекты-носители интерфейсов создаются при помощи методов объекта java.sql.Connection :

Чем отличается Statement от PreparedStatement?

Перед выполнением СУБД разбирает каждый запрос, оптимизирует его и создает «план» (query plan) его выполнения. Если один и тот же запрос выполняется несколько раз, то СУБД в состоянии кэшировать план его выполнения и не производить этапов разборки и оптимизации повторно. Благодаря этому запрос выполняется быстрее.

Суммируя: PreparedStatement выгодно отличается от Statement тем, что при повторном использовании с одним или несколькими наборами параметров позволяет получить преимущества заранее прекомпилированного и кэшированного запроса, помогая при этом избежать SQL Injection.

Как осуществляется запрос к базе данных и обработка результатов?

Выполнение запросов осуществляется при помощи вызова методов объекта, реализующего интерфейс java.sql.Statement :

Как вызвать хранимую процедуру?

Выбор объекта зависит от характеристик хранимой процедуры:

Если неизвестно, как была определена хранимая процедура, для получения информации о хранимой процедуре (например, имен и типов параметров) можно использовать методы java.sql.DatabaseMetaData позволяющие получить информацию о структуре источника данных.

Пример вызова хранимой процедуры с входными и выходными параметрами:

Как закрыть соединение с базой данных?

Соединение с базой данной закрывается вызовом метода close() у соответствующего объекта java.sql.Connection или посредством использования механизма try-with-resources при создании такого объекта, появившегося в Java 7.

NB! Предварительно необходимо закрыть все запросы созданные этим соединением.

Источник

Что такое statement preparedstatement callablestatement

Изучение интерфейсов Statement, PrepareStatement и CallableStatement.

Интерфейсы Statement, PrepareStatement и CallableStatement определяют методы и свойства, позволяющие выдавать запросы и команды в базу данных, а также получать результаты выполнения запросов. Они также предусматривают методы, упрощающие процедуру преобразования типов данных JAVA-SQL. В качестве примера можно привести тип данных integer. В java данные типа integer не могут принимать значение NULL. В базе данных напротив пустые значения любых типов представляются NULL значением.

Первым в иерархии стоит интерфейс Statement. Интерфейс PrepareStatement расширяет интерфейс Statement. Интерфейс CallableStatement в свою очередь расширяет интерфейс PrepareStatement. Производители JDBC драйверов применяют перечисленные выше интерфейсы в классах поставляемых ими драйверов и реализуют соответствующие методы. Таким образом, без регистрации конкретного драйвера невозможно создать объект с использованием перечисленных выше интерфейсов.

Statement интерфейс используют в случае выполнения статических запросов к базе данных. Такие запросы не могут содержать изменяемые параметры.

PrepareStatemet интерфейс используют в случае многократного выполнения одного и того же запроса с динамически меняющимися параметрами.

CallableStatement интерфейс используется для доступа к хранимым в базе данных процедурам. Этот интерфейс тоже может использоваться с динамически изменяемыми параметрами.

Объекты, созданные с использованием данных интерфейсов, имею четыре основных метода для выполнения запросов к базе данных:

Для использования этих методов прежде всего необходимо создать сам объект типа Statement методом createStatement() объекта типа Connection. Метод executeQuery(), равно как и шаги, предшествующие его выполнению, подробно рассмотрены в материалах к занятию №1. Ниже приведен пример использования метода executeUpdate() для дополнения учебной базы данных двумя таблицами и заполнения их небольшим количеством демонстрационных данных.

//Занятие 2, пример 2-1

public static void createTables() throws SQLException <

String operatorsql = «CREATE TABLE операторы_связи «

+ «(ид NUMBER(3) CONSTRAINT ПК_ОС PRIMARY KEY,»

String telefonsql = «CREATE TABLE номера_телефонов «

+ «(ид_л NUMBER(9) CONSTRAINT ВК_Л REFERENCES н_люди(ид),»

+ «ид_ос NUMBER(3) CONSTRAINT ВК_ОС REFERENCES операторы_связи(ид))» ;

st.executeUpdate( «DROP TABLE операторы_связи CASCADE CONSTRAINTS» );

> catch (SQLException se) <

//Игнорировать ошибку удаления таблицы

String msg = se.getMessage();

System.out.println( «Ошибка при удалении таблицы: » +msg);

//Создание таблицы операторы_связи

System.out.println( «Таблица операторы_связи создана. » );

st.executeUpdate( «DROP TABLE номера_телефонов» );

> catch (SQLException se) <

//Игнорировать ошибку удаления таблицы

String msg = se.getMessage();

System.out.println( «Ошибка при удалении таблицы: » +msg);

//Создание таблицы номера_телефонов

System.out.println( «Таблица номера_телефонов создана. » );

public static void insertData() throws SQLException <

//Загрузка данных в таблицу операторы_связи

st.executeUpdate(«INSERT INTO операторы_связи VALUES(1,’Мегафон’)»);

st.executeUpdate(«INSERT INTO операторы_связи VALUES(2,’МТС’)»);

st.executeUpdate(«INSERT INTO операторы_связи VALUES(3,’Би Лайн’)»);

st.executeUpdate(«INSERT INTO операторы_связи VALUES(4,’SkyLink’)»);

//Загрузка данных в таблицу номера_телефонов

st.executeUpdate(«INSERT INTO номера_телефонов VALUES(125704,’9363636′,,1)»);

st.executeUpdate(«INSERT INTO номера_телефонов VALUES(125704,’2313131′,,2)»);

st.executeUpdate(«INSERT INTO номера_телефонов VALUES(125704,’1151515′,,4)»);

st.executeUpdate(«INSERT INTO номера_телефонов VALUES(120848,’4454545′,,3)»);

st.executeUpdate(«INSERT INTO номера_телефонов VALUES(120848,’1161616′,,4)»);

System.out.println(«Загрузка данных закончена. «);

Для изучения примера необходимо создать класс, использующий main метод для регистрации драйвера, создания соединения с базой данных, создания объекта типа Statement и обработки соответствующих исключений. Для создания таблиц и заполнения их данными необходимо использовать отдельные методы (аналогичные приведенным в примере).

При заполнении таблицы номера_телефонов данные о дате регистрации телефона указываются с использованием JDBC SQL escape последовательности, которая имеет следующий формат: <ключевое_слово параметр>. В данном примере ключевым словом является символ d, который сообщает драйверу о необходимости преобразования указанной в качестве параметра даты в формат даты ORACLE.

Statement st = conn.createStatement();

st.execute( любой SQL-запрос );

//Вывести результат запроса

//Вывести количество обработанных строк

Для изучения этого метода необходимо создать класс, в методе main которого выполнить следующий фрагмент кода:

//Занятие 2, пример 2-2

Connection conn = null;

Statement st = null;

ResultSet rs = null;

//Начало блока обработки исключений (try)

//Регистрация драйвера, и создание соединения

String sql = «INSERT INTO номера_телефонов VALUES(121018,’9999999′,,1)»;

sql = «SELECT фамилия, имя, номер_телефона, дата_регистрации, оператор «

+»FROM н_люди л, номера_телефонов т, операторы_связи о «

+»WHERE л.ид = т.ид_л AND т.ид_ос = о.ид»;

>//Блок обработки исключений (catch, finally)

Обработку результатов, полученных методом execute() реализовать отдельным метод:

public static void processExecute(Statement st,

boolean executeResult) throws SQLException <

//Код обработки результатов

>//end of processExecute metod

Использование метода executeBatch() тесно связано с использованием технологии транзакций. Этот метод позволяет выполнить за одно обращение к базе данных группу заранее подготовленных запросов. В случае неудачи выполнения одного из запросов можно отменить (откатить) все изменения, сделанные данной группой запросов с помощью метода rollback(). Ниже приведен фрагмент программного кода, иллюстрирующий данную возможность:

//Занятие 2, пример 2-3

public static void batchInsert() throws SQLException <

//Загрузка данных в таблицу операторы_связи

st.addBatch(«INSERT INTO операторы_связи VALUES(1,’Мегафон’)»);

st.addBatch(«INSERT INTO операторы_связи VALUES(2,’МТС’)»);

st.addBatch(«INSERT INTO операторы_связи VALUES(3,’Би Лайн’)»);

st.addBatch(«INSERT INTO операторы_связи VALUES(4,’SkyLink’)»);

//Загрузка данных в таблицу номера_телефонов

st.addBatch(«INSERT INTO номера_телефонов VALUES(125704,’9363636′,,1)»);

st.addBatch(«INSERT INTO номера_телефонов VALUES(125704,’2313131′,,2)»);

st.addBatch(«INSERT INTO номера_телефонов VALUES(125704,’1151515′,,4)»);

st.addBatch(«INSERT INTO номера_телефонов VALUES(120848,’4454545′,,3)»);

st.addBatch(«INSERT INTO номера_телефонов VALUES(120848,’1161616′,,4)»);

System.out.println(«Пакет загрузки данных подготовлен. «);

int[] count = st.executeBatch();

Формирование пакета запросов осуществляется методом addBatch() с параметром типа String. При необходимости, для аннулирования уже сформированного пакета запросов можно использовать метод clearBatch(). В этом случае весь пакет будет аннулирован и его можно начать формировать заново. Перед выполнением пакета для использования режима транзакций необходимо отменить автоматическое подтверждение изменений в результате выполнения каждого запроса, то есть выполнить метод setAutoCommit(false). После выполнения метода executeBatch() необходимо выполнить метод commit() для подтверждения сделанных в базе изменений. В случае неудачного выполнения одного из запросов будет получено исключение типа SQLException. В блоке обработки исключения можно использовать метод rollback() для отмены (отката) сделанных в базе данных изменений. Для изучения перечисленных выше методов необходимо в созданном для примера 2-1 классе заменить метод insertDate() на метод batchInsert() данного примера и выполнить его.

Для более гибкого управления ходом выполнения транзакций существует возможность установки логических точек отката изменений, сделанных в базе в процессе выполнения последовательности транзакций. Для этого используется метод setSavepoint(String Имя точки отката ). Для аннулирования ранее установленной точки отката можно использовать метод releaseSavepoint(Savepoint svpt). В случае возникновения исключения при выполнении транзакции можно либо отменить все начатые изменения в базе данных с момента последнего выполнения метода setAutoCommit(false), либо отменить их до установленной логической точки отката методом rollback(Savepoint svpt). Ниже приведен фрагмент программного кода, на примере которого необжодимо изучить данную возможность, дополнив его до полноценного класса.

//Занятие 2, пример 2-4

public class RollBackMethod <

public static void main(String[] args) <

//Регистрация драйвера, и создание соединения

if(!conn.getAutoCommit()) System.out.println(«Auto-Commit отменен. «);

String sql = «INSERT INTO операторы_связи VALUES(5,’TELE2′)»;

sql = «INSERT INTO номера_телефонов VALUES(130777,’2223322′,,5)»;

> catch (SQLException se) <

System.out.println(«SQLException сообщение: «+se.getMessage());

System.out.println(«Начнем откат изменений. «);

> catch (SQLException rse) <

System.out.println(«Откат изменений закончен. «);

> catch (SQLException se) <

Существует три типа параметров: IN, OUT и INOUT. Объекты типа PreparedStatemet используют только параметры типа IN. Перед выполнением запроса необходимо установить все параметры методом setXXX(), где XXX заменяется на соответствующее типу данных параметра ключевое слово, например: setInt(), setString(), setDate(), setTime(). Если какой либо из параметров не установлен, то будет выдано исключение типа SQLEception. При установке параметра указывается его номер по порядку, начиная с 1, как он встречается в SQL-предложении, и его значение. Посла выполнения подготовленного таким образом запроса установленные параметры не сбрасываются. Их можно сбросить методом clearParameters() или переустановить упомянутыми выше методами setXXX().

В случае использования метода executeBatch() после каждого утановки каждого полного комплекта параметров выполняется метод addBatch() без аргументов.

Для изучения интерфейса PrepareStatemet и применения его методов необходимо выполнить приведенный ниже пример, дополнив его реализацией необходимых методов:

//Занятие 2, пример 2-5

public class PrepStatDB <

static Connection conn = null;

public static void main(String[] args) <

//Регистрация драйвера, и создание соединения

System.out.println(«Создание базы данных закончено. «);

> catch (SQLException se) <

> catch (SQLException se) <

public static void createTables() throws SQLException <

Statement st = conn.createStatement();

//Программный код создания таблиц базы данных (см. пример 1-1)

public static void insertData() throws SQLException <

//Загрузка данных в таблицу операторы_связи

String sql = «INSERT INTO операторы_связи VALUES(. )»;

PreparedStatement prst = conn.prepareStatement(sql);

prst.setInt(1,1); prst.setString(2,»Мегафон»); count = prst.executeUpdate();

System.out.println(«Запись \»Мегафон\» добавлена»);

prst.setInt(1,2); prst.setString(2,»МТС»); count = prst.executeUpdate();

System.out.println(«Запись \»МТС\» добавлена»);

prst.setInt(1,3); prst.setString(2,»Би Лайн»); count = prst.executeUpdate();

System.out.println(«Запись \»Би Лайн\» добавлена»);

prst.setInt(1,4); prst.setString(2,»SkyLink»); count = prst.executeUpdate();

System.out.println(«Запись \»SkyLink\» добавлена»);

//Загрузка данных в таблицу номера_телефонов

sql = «INSERT INTO номера_телефонов VALUES(. )»;

prst.setInt(1,125704); prst.setString(2,»9363636″); prst.setDate(3,Date.valueOf(«2000-9-15»)); prst.setInt(4,1); prst.addBatch();

prst.setInt(1,125704); prst.setString(2,»2313131″); prst.setDate(3,Date.valueOf(«2001-2-25»)); prst.setInt(4,2); prst.addBatch();

prst.setInt(1,125704); prst.setString(2,»1151515″); prst.setDate(3,Date.valueOf(«2002-6-17»)); prst.setInt(4,4); prst.addBatch();

prst.setInt(1,120848); prst.setString(2,»4454545″); prst.setDate(3,Date.valueOf(«2003-7-30»)); prst.setInt(4,3); prst.addBatch();

prst.setInt(1,120848); prst.setString(2,»1161616″); prst.setDate(3,Date.valueOf(«2004-1-16»)); prst.setInt(4,4); prst.addBatch();

int[] countb = prst.executeBatch();

System.out.println(«\n»+»Загрузка данных закончена. «);

При работе с данными типа CLOB и BLOB значения параметров можно задавать и получать используя потоки ввода и вывода. При этом используются следующие методы:

В качестве параметров методам setXXXStream() указывается номер по порядку, объект типа InputStream и длина объекта. Получение потока данных производится методами getXXXStream(). Ниже приведен пример записи ASCII файла в поле предварительно созданной таблицы readme.

//Занятие 2, пример 2-6

public class StreamMethod <

public static void main(String[] args) <

Connection conn = null;

Statement st = null;

PreparedStatement prst = null;

ResultSet rs = null;

//Регистрация драйвера, и создание соединения

File f = new File(«/etc/passwd»);

long fileLength = f.length();

FileInputStream fis = new FileInputStream(f);

String sql = «INSERT INTO readme VALUES(. )»;

sql = «SELECT * FROM readme WHERE >

InputStream is = rs.getAsciiStream(2);

ByteArrayOutputStream baos = new ByteArrayOutputStream();

> catch (SQLException se) <

> catch (SQLException se) <

public static void createReadmeTable(Statement st) throws Exception <

String sql = «CREATE TABLE readme (id INTEGER, data LONG)»;

st.executeUpdate(«DROP TABLE readme»);

> catch (SQLException se) <

//Игнорировать ошибку удаления таблицы

String msg = se.getMessage();

System.out.println(«Ошибка при удалении таблицы: «+msg);

System.out.println(«Таблица readme создана. «);

Объекты типа CallableStatement создается методом prepareCall() объекта типа Connection и позволяют выполнять хранимые в базе данных процедуры. При этом могу использоваться параметры всех трех типов: IN, OUT и INOUT. SQL-предложение при этом подготавливается в виде JDBC SQL escape последовательности:

call ключевое слово escape-последовательности;

proc_name имя хранимой процедуры;

Ниже приведен пример создания хранимой процедуры, использующей функцию человек учебной базы данных, которая по номеру сотрудника выдает его фамилию и инициалы.

//Занятие 2, пример 2-7

public static void createProc() throws SQLException <

Statement st = conn.createStatement();

String sql = «CREATE PROCEDURE get_fio «

+»(id IN NUMBER, fio OUT VARCHAR) AS «

+»SELECT человек(id, ‘И’, 9) INTO fio FROM DUAL; «

st.executeUpdate(«DROP PROCEDURE get_fio»);

> catch (SQLException se) <

//Игнорировать ошибку удаления процедуры

String msg = se.getMessage();

System.out.println(«Ошибка при удалении процедуры: «+msg);

System.out.println(«Процедура get_fio создана. «);

public static void executeProc() throws SQLException <

CallableStatement cst = conn.prepareCall(sql);

System.out.println(«Результат запроса: «+cst.getString(2));

Для изучения интерфейса CallabeStatement необходимо создать класс использующий main метод для регистрации драйвера и создания соединения с базой данных. Для создания таблицы и заполнения ее данными необходимо использовать отдельные методы (аналогичные приведенным в примере).

Источник

JDBC — Заявления, PreparedStatement и CallableStatement

Как только соединение установлено, мы можем взаимодействовать с базой данных. Интерфейсы JDBC Statement, CallableStatement и PreparedStatement определяют методы и свойства, которые позволяют отправлять команды SQL или PL / SQL и получать данные из вашей базы данных.

Они также определяют методы, которые помогают преодолеть различия типов данных между типами данных Java и SQL, используемыми в базе данных.

В следующей таблице приведены сводные данные о назначении каждого интерфейса для выбора используемого интерфейса.

ИнтерфейсыРекомендуемое использование
утверждениеИспользуйте это для общего доступа к вашей базе данных. Полезно, когда вы используете статические операторы SQL во время выполнения. Интерфейс оператора не может принимать параметры.
Подготовленное заявлениеИспользуйте это, когда вы планируете использовать операторы SQL много раз. Интерфейс PreparedStatement принимает входные параметры во время выполнения.
CallableStatementИспользуйте это, когда вы хотите получить доступ к хранимым процедурам базы данных. Интерфейс CallableStatement также может принимать входные параметры времени выполнения.

Объекты Statement

Создание объекта выписки

Прежде чем вы сможете использовать объект Statement для выполнения оператора SQL, вам необходимо создать его с помощью метода createStatement () объекта Connection, как в следующем примере:

Создав объект Statement, вы можете использовать его для выполнения оператора SQL одним из трех его методов execute.

boolean execute (String SQL) : возвращает логическое значение true, если можно получить объект ResultSet; в противном случае возвращается false. Используйте этот метод для выполнения операторов SQL DDL или когда вам нужно использовать действительно динамический SQL.

int executeUpdate (String SQL) : возвращает количество строк, затронутых выполнением оператора SQL. Используйте этот метод для выполнения операторов SQL, для которых ожидается получение ряда затронутых строк — например, оператора INSERT, UPDATE или DELETE.

ResultSet executeQuery (String SQL) : возвращает объект ResultSet. Используйте этот метод, когда вы ожидаете получить набор результатов, как если бы вы использовали инструкцию SELECT.

boolean execute (String SQL) : возвращает логическое значение true, если можно получить объект ResultSet; в противном случае возвращается false. Используйте этот метод для выполнения операторов SQL DDL или когда вам нужно использовать действительно динамический SQL.

int executeUpdate (String SQL) : возвращает количество строк, затронутых выполнением оператора SQL. Используйте этот метод для выполнения операторов SQL, для которых ожидается получение ряда затронутых строк — например, оператора INSERT, UPDATE или DELETE.

ResultSet executeQuery (String SQL) : возвращает объект ResultSet. Используйте этот метод, когда вы ожидаете получить набор результатов, как если бы вы использовали инструкцию SELECT.

Закрытие объекта выписки

Подобно тому, как вы закрываете объект Connection для сохранения ресурсов базы данных, по той же причине вы также должны закрывать объект Statement.

Простой вызов метода close () сделает эту работу. Если вы сначала закроете объект Connection, он также закроет объект Statement. Тем не менее, вы всегда должны явно закрывать объект Statement, чтобы обеспечить правильную очистку.

Объекты PreparedStatement

Интерфейс PreparedStatement расширяет интерфейс Statement, который дает вам дополнительные функциональные возможности с несколькими преимуществами по сравнению с универсальным объектом Statement.

Это утверждение дает вам гибкость в предоставлении аргументов динамически.

Создание объекта PreparedStatement

Все параметры в JDBC представлены символом ? символ, который известен как маркер параметра. Вы должны предоставить значения для каждого параметра перед выполнением оператора SQL.

Методы setXXX () связывают значения с параметрами, где XXX представляет тип данных Java значения, которое вы хотите связать с входным параметром. Если вы забудете указать значения, вы получите исключение SQLException.

Каждый маркер параметра обозначается своей порядковой позицией. Первый маркер представляет позицию 1, следующую позицию 2 и так далее. Этот метод отличается от метода индексов массива Java, который начинается с 0.

Все методы объекта Statement для взаимодействия с базой данных (a) execute (), (b) executeQuery () и (c) executeUpdate () также работают с объектом PreparedStatement. Однако методы модифицируются для использования операторов SQL, которые могут вводить параметры.

Закрытие объекта PreparedStatement

Подобно тому, как вы закрываете объект Statement, по той же причине вам также следует закрыть объект PreparedStatement.

Простой вызов метода close () сделает эту работу. Если вы сначала закроете объект Connection, он также закроет объект PreparedStatement. Однако вы всегда должны явно закрывать объект PreparedStatement, чтобы обеспечить правильную очистку.

Объекты CallableStatement

Подобно тому, как объект Connection создает объекты Statement и PreparedStatement, он также создает объект CallableStatement, который будет использоваться для выполнения вызова хранимой процедуры базы данных.

Создание объекта CallableStatement

Предположим, вам нужно выполнить следующую хранимую процедуру Oracle:

ПРИМЕЧАНИЕ. Вышеописанная хранимая процедура была написана для Oracle, но мы работаем с базой данных MySQL, поэтому давайте создадим такую ​​же хранимую процедуру для MySQL, как описано ниже, для ее создания в базе данных EMP:

Существуют три типа параметров: IN, OUT и INOUT. Объект PreparedStatement использует только параметр IN. Объект CallableStatement может использовать все три.

Вот определения каждого —

параметрОписание
ВПараметр, значение которого неизвестно при создании оператора SQL. Вы связываете значения с параметрами IN с помощью методов setXXX ().
ИЗПараметр, значение которого предоставляется оператором SQL, который он возвращает. Вы извлекаете значения из параметров OUT с помощью методов getXXX ().
INOUTПараметр, который предоставляет как входные, так и выходные значения. Вы связываете переменные с помощью методов setXXX () и извлекаете значения с помощью методов getXXX ().

В следующем фрагменте кода показано, как использовать метод Connection.prepareCall () для создания экземпляра объекта CallableStatement на основе предыдущей хранимой процедуры.

Строковая переменная SQL представляет хранимую процедуру с параметрами-заполнителями.

Использование объектов CallableStatement очень похоже на использование объектов PreparedStatement. Вы должны привязать значения ко всем параметрам перед выполнением оператора, иначе вы получите исключение SQLException.

Если у вас есть параметры IN, просто следуйте тем же правилам и методам, которые применяются к объекту PreparedStatement; используйте метод setXXX (), который соответствует типу данных Java, который вы привязываете.

Когда вы используете параметры OUT и INOUT, вы должны использовать дополнительный метод CallableStatement, registerOutParameter (). Метод registerOutParameter () связывает тип данных JDBC с типом данных, который ожидается от хранимой процедуры.

После вызова хранимой процедуры вы извлекаете значение из параметра OUT с помощью соответствующего метода getXXX (). Этот метод преобразует извлеченное значение типа SQL в тип данных Java.

Закрытие объекта CallableStatement

Так же, как вы закрываете другой объект Statement, по той же причине вы должны также закрыть объект CallableStatement.

Простой вызов метода close () сделает эту работу. Если вы сначала закроете объект Connection, он также закроет объект CallableStatement. Однако вы всегда должны явно закрывать объект CallableStatement, чтобы обеспечить правильную очистку.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *