БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ИНФОРМАТИКИ И РАДИОЭЛЕКТРОНИКИ
кафедра информационных технологий и автоматизированных систем
РЕФЕРАТ на тему: «Работа с базами данных в JAVA на основе соединения JDBC»
Минск, 2008 Как мы знаем, SQL-запросы предварительно компилируются по месту исполнения. Следовательно, чтобы ускорить их выполнение следует компиляцию запросов выполнять предварительно. Это реализуется командой prepareStatement класса PreparedStatement. Данная команда позволяется использовать SQL-запросы с параметрами. Параметры вставляются в запросы как знак вопроса. Сначала рассмотрим, как использовать инструкцию prepareStatement на следующем примере:
try{ Connection db=DriverManager.getConnection(url); String sq_str="SELECT * FROM stud"; //Строка запроса на выборку PreparedStatement prst= db.prepareStatement(sq_str); ResultSet rs= prst.executeQuery(); //Переменная rs получает набор выбранных записей
while(rs.next()){ //Выполняем просмотр записей набора String s=rs.getString("name")+ " "+ rs.getInt("groupp");
//Получаем содержимое полей name и // groupp текущей записи System.out.println("my-"+s);}//выводим запись на экран System.out.println("OK"); // db.close(); //Закрываем БД. } catch(Exception er) {System.out.println("Error has arised here:"+er);}
} Инструкция на выборку создается в строке PreparedStatement prst= db.prepareStatement(sq_str);
Скомпилированный заапрос выполняется обычным образом: ResultSet rs= prst.executeQuery()
Теперь предположим, что мы хотим выполнить выборку студентов, чей возраст превосходит 19 лет. В этой связи нам надлежит ввести в запрос параметр. Делается это таким образом: try{ Connection db=DriverManager.getConnection(url); String sq_str="SELECT * FROM stud where age> ?"; //Строка запроса на //выборку с параметром PreparedStatement prst= db.prepareStatement(sq_str); prst.setInt(1,23); //установка значения параметра ResultSet rs= prst.executeQuery(); //Переменная rs получает набор выбранных записей
while(rs.next()){ //Выполняем просмотр записей набора String s=rs.getString("name")+ " "+ rs.getInt("groupp");
//Получаем содержимое полей name и // groupp текущей записи System.out.println("my-"+s);}//выводим запись на экран System.out.println("OK"); // db.close(); //Закрываем БД. } catch(Exception er) {System.out.println("Error has arised here:"+er);}
} }
Сначала создается запрос на выборку: String sq_str="SELECT * FROM stud where age> ?"; //Строка запроса на //выборку с параметром В этом запросе место параметра отмечено знаком вопроса. Установка значения параметра реализуется следующим образом: prst.setInt(1,23);
Параметрами метода setInt являются: номер вставляемого параметра (в нашем примере – 1) и значение вставляемого параметра (23) для поля age. Текстовые значения вставляются с помощью метода setString. Обратимся к вызову хранимых процедур. В отличие от запросов с параметрами здесь используют класс CallableStatement. Таким образом, запрос на вызов хранимой процедуры может иметь такой вид:
CallableStatement cs = db.prepareStatement(“call proc1(?,?)”); cs.setSting(1,”hello”); cs.setInt(2,10);
В создаваемом запросе указывается имя вызываемой процедуры proc1 и обозначаются позиции для параметров знаком ?. Установка значений параметров производится уже знакомым нам образом. Теперь для иллюстрации приведем код приложения, которое соединяется с сервером SQL Server 2000 и вызывает хранимую процедуру на сервере. Эта процедура имеет следующий вид.
CREATE PROCEDURE [dbo].proc1 @s varchar(16) OUTPUT AS Begin SELECT @s="Hello From SQL Server" END RETURN 0 GO В этой процедуре имеется выходной параметр типа varchar. В теле процедуры он получает значение текстовой строки "Hello From SQL Server". Таким образом, наша задача состоит в том, чтобы правильно соединиться с сервером SQL Server, создать в приложении вызов процедуры на сервере и установить выходной параметр. Этот параметр мы должны будем прочитать. Приведем текст готового приложения и дадим к нему пояснения.
import java.awt.*; import java.net.*; import java.sql.*; import java.io.*;
public class lab6 { public static void main(String args[]) { String url="jdbc:odbc:sqlsource2"; try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");}
catch(Exception e) {System.out.println("Classdefnotfound"+e); }
try{
Connection db=DriverManager.getConnection(url); CallableStatement cst= db.prepareCall("{call proc1(?)}"); cst.registerOutParameter(1, Types.VARCHAR,16); cst.execute(); String str=cst.getString(1); System.out.println(str);// выводим ответ процедуры на экран System.out.println("OK"); db.close(); //Закрываем соединение. } catch(Exception er) {System.out.println("Error has arised here:"+er);}
} }
Вызов хранимой процедуры выполняется посредством класса CallableStatement. Инструкция по вызову процедуры предварительно подготавливается в команде: CallableStatement cst= db.prepareCall("{call proc1(?)}");
Знак вопроса в скобках определяет место для параметра. В нашем примере используется один выходной параметр. Каждый выходной параметр должен быть зарегистрирован. Это выполняет команда: cst.registerOutParameter(1, Types.VARCHAR,16); Первый операнд данной команды определяет номер параметра (нумерация начинается с 1). Второй операнд соответствует типу параметра (VARCHAR), третий операнд устанавливает размер параметра. Типы параметров прописываются в пакете java.sql.*. Другие типы параметров приведены в таблице 1, где указано таккже их соответствие типам Java. Таблица 1
Выполнение процедуры реализуется командой cst.execute();
Для получения значения, возвращаемого процедурой или функций следует использовать такой синтаксис определения вызова:
{? = call procedure_name[(?, ?, ...)]}
При передаче входных параметров в хранимую процедуру их следует предварительно установить. Это делается с помощью метода setXXX. Рассмотрим следующую хранимую процедуру.
CREATE PROCEDURE [dbo].proc2 @nomer int , @name char(30) OUTPUT, @group int OUTPUT AS BEGIN DECLARE @mycur CURSOR SET @mycur=CURSOR SCROLL STATIC FOR SELECT * from we Open @mycur IF (@@CURSOR_ROWS<@nomer) BEGIN SET @name="#" SET @group=-1 RETURN 1 END ELSE BEGIN FETCH ABSOLUTE @nomer FROM @mycur INTO @name,@group
RETURN 0 END END GO
Заголовок этой процедуры имеет такой вид:
CREATE PROCEDURE [dbo].proc2 @nomer int , @name char(30) OUTPUT, @group int OUTPUT
Из него видно, что процедура получает один входной параметр – nomer (номер записи) и возвращает два выходных параметра – name (имя) и group (группу).
Теперь приведем текст java-приложения, которое вызывает данную хранимую процедуру.
import java.awt.*; import java.net.*; import java.sql.*; import java.io.*;
public class lab6 { public static void main(String args[]) { String url="jdbc:odbc:sqlsource2"; try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");}
catch(Exception e) {System.out.println("Classdefnotfound"+e); }
try{
Connection db=DriverManager.getConnection(url); CallableStatement cst= db.prepareCall("{call proc2(?,?,?)}"); cst.setInt(1,1); cst.registerOutParameter(2, Types.VARCHAR,16); cst.registerOutParameter(3, Types.INTEGER); cst.execute(); String str=cst.getString(2)+" =="+cst.getInt(3); System.out.println(str);// выводим ответ процедуры на экран System.out.println("OK"); db.close(); //Закрываем соединение. } catch(Exception er) {System.out.println("Error has arised here:"+er);}
} }
Обратим внимание на установку единственного входного параметра:
cst.setInt(1,1);
Первый операнд этой команды задает номер параметра, второй – его значение. Получение значений возвращаемых процедурой, выполняется командой
String str=cst.getString(2)+" =="+cst.getInt(3);
Здесь формируется строка, состоящая из двух выходных параметров, получаемых с помощью метода getXXX(n) , где n – номер параметра. В заключение отметим, что параметры могут иметь тип INOUT, т.е. быть одновременно входными и выходными. Параметр такого типа перед вызовом процедуры должен получить значение и быть зарегистрированным. ЛИТЕРАТУРА 1. Меградж З. Разработка приложений для электронной коммерции на ORACLE и JAVA. Вильямс, 2000, 328с. 2. Пирогов В.П. MS SQL Server 2000. Управление и программирование. – СПб. БХВ.-2005,-600с. 3. Холл М., Браун Л. Программирование для WEB. Вильямс, 2002, - 1280с.
Популярное: Почему человек чувствует себя несчастным?: Для начала определим, что такое несчастье. Несчастьем мы будем считать психологическое состояние... Почему люди поддаются рекламе?: Только не надо искать ответы в качестве или количестве рекламы... Почему стероиды повышают давление?: Основных причин три... ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (178)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |