Работа с базами данных в JAVA на основе соединения JDBC
Вызов хранимой процедуры выполняется посредством класса CallableStatement. Инструкция по вызову процедуры предварительно подготавливается в команде: В отличие от запросов с параметрами здесь используют класс CallableStatement. Таким образом, запрос на вызов хранимой процедуры может иметь такой вид: Первый операнд этой команды задает номер параметра, второй — его значение. Получение значений… Читать ещё >
Работа с базами данных в 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. Инструкция по вызову процедуры предварительно подготавливается в команде:
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с.