БЕЛОРУССКИЙ
ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ИНФОРМАТИКИ И РАДИОЭЛЕКТРОНИКИ
кафедра информационных технологий и
автоматизированных систем
РЕФЕРАТ
на тему:
«Работа с базами данных в 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.r
Первый операнд данной команды определяет номер параметра
(нумерация начинается с 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с.