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


ЛИТЕРАТУРА

		Меградж З. Разработка приложений для электронной коммерции на ORACLE и JAVA. Вильямс, 2000, 328с.

		Пирогов В.П. MS SQL Server 2000.  Управление и программирование. – СПб. БХВ.-2005,-600с.

		Холл М., Браун Л. Программирование для WEB. Вильямс, 2002, - 1280с.