РефератыИнформатикаРаРабота с базами данных в JAVA на основе соединения JDBC

Работа с базами данных в JAVA на основе соединения JDBC

БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ИНФОРМАТИКИ И РАДИОЭЛЕКТРОНИКИ



кафедра информационных технологий и автоматизированных систем


РЕФЕРАТ


на тему:


«Работа с базами данных в 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. Инструкция по вызову процедуры предварительно подготавливается в команде:<

/p>

CallableStatement cst= db.prepareCall("{call proc1(?)}");


Знак вопроса в скобках определяет место для параметра. В нашем примере используется один выходной параметр. Каждый выходной параметр должен быть зарегистрирован. Это выполняет команда:


cst.registerOutParameter(1, Types.VARCHAR,16);


Первый операнд данной команды определяет номер параметра (нумерация начинается с 1). Второй операнд соответствует типу параметра (VARCHAR), третий операнд устанавливает размер параметра. Типы параметров прописываются в пакете java.sql.*. Другие типы параметров приведены в таблице 1, где указано таккже их соответствие типам Java.


Таблица 1






























































JDBC -тип


Java - тип


CHAR


String


VARCHAR


String


LONGVARCHAR


String


NUMERIC


java.math.BigDecimal


DECIMAL


java.math.BigDecimal


BIT


boolean


TINYINT


byte


SMALLINT


short


INTEGER


int


BIGINT


long


REAL


float


FLOAT


double


DOUBLE


double


BINARY


byte[]


VARBINARY


byte[]


LONGVARBINARY


byte[]


DATE


java.sql.Date


TIME


java.sql.Time


TIMESTAMP


java.sql.Timestamp



Выполнение процедуры реализуется командой


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с.

Сохранить в соц. сетях:
Обсуждение:
comments powered by Disqus

Название реферата: Работа с базами данных в JAVA на основе соединения JDBC

Слов:1267
Символов:13091
Размер:25.57 Кб.