Łączenie z bazą danych – przykładowa klasa infPolaczenie import

Transkrypt

Łączenie z bazą danych – przykładowa klasa infPolaczenie import
Kody do wykładu „Programowanie baz danych – JDBC” – Maria Dems;
Materiały wewnętrzne bez prawa powielania, kopiowania i rozpowszechniania
Łączenie z bazą danych – przykładowa klasa infPolaczenie
import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.SQLException;
public class infPolaczenie {
public static void main(String[] argv) {
System.out.println("Sprawdzanie czy zostal zarejestrowany sterownik ");
tr y {
Class.forName("org.postgresql.Driver");
}
catch (ClassNotFoundException cnfe) {
System.out.println("Nie moge znalezc sterownika!");
System.out.println("Wyswietlam sciezke i wychodze z programu.");
cnfe.printStackTrace();
System.exit(1);
}

Łączenie z bazą danych – przykładowa klasa infPolaczenie (c.d.)
System.out.println("Zarejestrowano sterownik, lacze sie...");
Connection c = null;
try { c = DriverManager.getConnection("jdbc:postgresql://localhost/archiwum","olga",
"olga"); }
catch (SQLException se) {
System.out.println("Blad! Nie moge sie polaczyc");
se.printStackTrace();
System.exit(1);
}
if (c != null)
System.out.println("Ustanowiono polaczenie z baza");
else
System.out.println("Polacznie z baza nie powiodlo sie");
}
}
Metadane w JDBC - przykład
Wykorzystanie metod interfejsu DatabaseMetaData do wypisania informacji o bazie
danych:
Metadane w JDBC – przykład (c.d.)
System.out.print("Nazwa RDBMS: ");
System.out.println(dmd.getDatabaseProductName());
System.out.print("Wersja PostgreSQL: ");
System.out.println(dmd.getDatabaseProductVersion());
System.out.print("Nazwa użytkownika: ");
System.out.println(dmd.getUserName());
System.out.print("Główny numer poprawki sterownika: ");
System.out.println(dmd.getDriverMajorVersion());
System.out.print("Poboczny numer poprawki sterownika: ");
System.out.println(dmd.getDriverMinorVersion());
System.out.print("Nazwa sterownika: ");
System.out.println(dmd.getDriverName());
1
Kody do wykładu „Programowanie baz danych – JDBC” – Maria Dems;
Materiały wewnętrzne bez prawa powielania, kopiowania i rozpowszechniania
System.out.print("Wersja sterownika: ");
System.out.println(dmd.getDriverVersion());
Metadane w JDBC – przykład (c.d.)
System.out.print("Adres URL sterownika JDBC: ");
System.out.println(dmd.getURL());
System.out.print("Używanie plików lokalnych do zapisywania tabel: ");
System.out.println(dmd.usesLocalFiles());
con.close();
}
}
Zapytania do bazy
Connection con = null;
Statement stm = null; ResultSet rs = null;
try {
Class.forName ("org.postgresql.Driver");
con = DriverManager.getConnection("jdbc:postgresql://localhost/archiwum", "olga", "olga");
stm = con.createStatement(); //utworzenie obiektu typu Statement
//wykonanie zapytania
rs = stm.executeQuery("SELECT imie, nazwisko, data_urodzenia,"+ "miejsce_urodzenia, adres
FROM osoby");
//przetworzenie otrzymanych danych
while(rs.next()){
//wypisanie danych za pomocą funkcji println
System.out.println(rs.getString("Nazwisko")
+" , " + rs.getlnt("Wiek")”);
}
Zapytania do bazy
catch(SQLException e){
//obsługa wyjątku
}
finally{
//zamknięcie połączenia z bazą danych
try{
if(null!=con.close();
con = null;
}
catch(Exception ee){
ee.printStackTrace();
}
}
Zapytania do bazy - przykład
import java.sql.*;
import java.util.*;
public class TabelaOsoby{
final static String jdbcDriver = "org.postgresql.Driver";
final static String table = "osoby";
public static void main(String[] args) {
System.out.println("--- Zawartość tabeli osoby---");
2
Kody do wykładu „Programowanie baz danych – JDBC” – Maria Dems;
Materiały wewnętrzne bez prawa powielania, kopiowania i rozpowszechniania
try {
Class.forName(jdbcDriver);
Zapytania do bazy - przykład (c.d.)
Connection con =
DriverManager.getConnection("jdbc:postgresql://localhost/archiwum", "olga", "olga");
Statement stm = con.createStatement();
ResultSet rs = stm.executeQuery("SELECT * FROM "+ table);
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();
for(int kol = 1; kol <= columnCount; kol++) {
System.out.print(rsmd.getColumnLabel(kol));
System.out.print(" (" + rsmd.getColumnTypeName(kol)+")");
if(kol < columnCount)
System.out.print(", ");
}
Zapytania do bazy - przykład (c.d.)
System.out.println();
while(rs.next()) {
for(int col = 1; col <= columnCount; col++) {
System.out.print(rs.getString(col));
if(col < columnCount)
System.out.print(", ");
}
System.out.println();
}
rs.close();
stm.close();
con.close();
}
catch (ClassNotFoundException e) {
System.out.println("Nie można załadować sterownika");
}
catch (SQLException e) {
System.out.println("Wyjątek SQL : " + e.getMessage());
}
}
}
Zapytania do bazy
Connection con = null;
Statement stm = null; ResultSet rs = null;
try {
Class.forName ("org.postgresql.Driver");
con = DriverManager.getConnection("jdbc:postgresql://localhost/archiwum", "olga", "olga");
stm = con.createStatement(); //utworzenie obiektu typu Statement
//wykonanie zapytania
rs = stm.executeQuery("SELECT imie, nazwisko, data_urodzenia,"+ "miejsce_urodzenia, adres
3
Kody do wykładu „Programowanie baz danych – JDBC” – Maria Dems;
Materiały wewnętrzne bez prawa powielania, kopiowania i rozpowszechniania
FROM osoby");
//przetworzenie otrzymanych danych
while(rs.next()){
//wypisanie danych za pomocą funkcji println
System.out.println(rs.getString("Nazwisko")
+" , " + rs.getlnt("Wiek")”);
}
Przewijanie zbioru wyników w JDBC
Możliwe do ustawienia wartości parametrów int resultSetType,
resultSetConcurrency
oraz
int
Aby uzyskać zestaw wyników zapytania z przewijaniem w obie strony, należy
zadeklarować instrukcję:
tr y {
// utworzenie obiektu ResultSet z przewijaniem typu insensitive
Statement stm = connection.createStatement (
// zestaw wyników z przewijaniem
ResultSet.TYPE_SCROLL_INSENSITIVE,
// zestaw wyników tylko do odczytu.
ResultSet.CONCUR_READ_ONLY);
// utworzenie obiektu ResultSet z przewijaniem typu sensitive
stm = connection.createStatement (
ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
}
catch (SQLException e) {
}
Zapytania do bazy
Connection con = null;
Statement stm = null; ResultSet rs = null;
try {
Class.forName ("org.postgresql.Driver");
con = DriverManager.getConnection("jdbc:postgresql://localhost/archiwum", "olga", "olga");
stm = con.createStatement(); //utworzenie obiektu typu Statement
//wykonanie zapytania
rs = stm.executeQuery("SELECT imie, nazwisko, data_urodzenia,"+ "miejsce_urodzenia, adres
FROM osoby");
//przetworzenie otrzymanych danych
while(rs.next()){
//wypisanie danych za pomocą funkcji println
System.out.println(rs.getString("Nazwisko")
+" , " + rs.getlnt("Wiek")”);
}
Aby uzyskać zestaw wyników zapytania z przewijaniem w obie strony, należy
zadeklarować instrukcję:
tr y {
4
Kody do wykładu „Programowanie baz danych – JDBC” – Maria Dems;
Materiały wewnętrzne bez prawa powielania, kopiowania i rozpowszechniania
// utworzenie obiektu ResultSet z przewijaniem typu insensitive
Statement stm = connection.createStatement (
// zestaw wyników z przewijaniem
ResultSet.TYPE_SCROLL_INSENSITIVE,
// zestaw wyników tylko do odczytu.
ResultSet.CONCUR_READ_ONLY);
// utworzenie obiektu ResultSet z przewijaniem typu sensitive
stm = connection.createStatement (
ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
}
catch (SQLException e) {
}
Aktualizowanie zbioru wyników w JDBC
Przykładowo, w celu zmiany danych w bazie można napisać kod:
String query = "SELECT * FROM osoby";
ResultSet rs = stm.executeQuery(query);
while(rs.next()){
if(…){
String nr = …
String adres = rs.getString("adres") + nr;
……..
rs.updateString ("adres", adres) ;
rs.updateRow();
}
}
Zapytania do bazy
Connection con = null;
Statement stm = null; ResultSet rs = null;
try {
Class.forName ("org.postgresql.Driver");
con = DriverManager.getConnection("jdbc:postgresql://localhost/archiwum", "olga", "olga");
stm = con.createStatement(); //utworzenie obiektu typu Statement
//wykonanie zapytania
rs = stm.executeQuery("SELECT imie, nazwisko, data_urodzenia,"+ "miejsce_urodzenia, adres
FROM osoby");
//przetworzenie otrzymanych danych
while(rs.next()){
//wypisanie danych za pomocą funkcji println
System.out.println(rs.getString("Nazwisko")
+" , " + rs.getlnt("Wiek")”);
}
Aby uzyskać zestaw wyników zapytania z przewijaniem w obie strony, należy
zadeklarować instrukcję:
tr y {
// utworzenie obiektu ResultSet z przewijaniem typu insensitive
5
Kody do wykładu „Programowanie baz danych – JDBC” – Maria Dems;
Materiały wewnętrzne bez prawa powielania, kopiowania i rozpowszechniania
Statement stm = connection.createStatement (
// zestaw wyników z przewijaniem
ResultSet.TYPE_SCROLL_INSENSITIVE,
// zestaw wyników tylko do odczytu.
ResultSet.CONCUR_READ_ONLY);
// utworzenie obiektu ResultSet z przewijaniem typu sensitive
stm = connection.createStatement (
ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
}
catch (SQLException e) {
}
Aktualizowanie zbioru wyników w JDBC
Przykładowo, w celu zmiany danych w bazie można napisać kod:
String query = "SELECT * FROM osoby";
ResultSet rs = stm.executeQuery(query);
while(rs.next()){
if(…){
String nr = …
String adres = rs.getString("adres") + nr;
……..
rs.updateString ("adres", adres) ;
rs.updateRow();
}
}
Operacje na zbiorze wyników w JDBC

Pokazuje to przykład:
Zapytania do bazy
Connection con = null;
Statement stm = null; ResultSet rs = null;
try {
Class.forName ("org.postgresql.Driver");
con = DriverManager.getConnection("jdbc:postgresql://localhost/archiwum", "olga", "olga");
stm = con.createStatement(); //utworzenie obiektu typu Statement
//wykonanie zapytania
rs = stm.executeQuery("SELECT imie, nazwisko, data_urodzenia,"+ "miejsce_urodzenia, adres
FROM osoby");
//przetworzenie otrzymanych danych
while(rs.next()){
//wypisanie danych za pomocą funkcji println
System.out.println(rs.getString("Nazwisko")
+" , " + rs.getlnt("Wiek")”);
}
Aby uzyskać zestaw wyników zapytania z przewijaniem w obie strony, należy
zadeklarować instrukcję:
6
Kody do wykładu „Programowanie baz danych – JDBC” – Maria Dems;
Materiały wewnętrzne bez prawa powielania, kopiowania i rozpowszechniania
tr y {
// utworzenie obiektu ResultSet z przewijaniem typu insensitive
Statement stm = connection.createStatement (
// zestaw wyników z przewijaniem
ResultSet.TYPE_SCROLL_INSENSITIVE,
// zestaw wyników tylko do odczytu.
ResultSet.CONCUR_READ_ONLY);
// utworzenie obiektu ResultSet z przewijaniem typu sensitive
stm = connection.createStatement (
ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
}
catch (SQLException e) {
}
Aktualizowanie zbioru wyników w JDBC
Przykładowo, w celu zmiany danych w bazie można napisać kod:
String query = "SELECT * FROM osoby";
ResultSet rs = stm.executeQuery(query);
while(rs.next()){
if(…){
String nr = …
String adres = rs.getString("adres") + nr;
……..
rs.updateString ("adres", adres) ;
rs.updateRow();
}
}
Operacje na zbiorze wyników w JDBC

Zasady użycia metod: executeOuery(), executeUpdate() i execute(), umożliwiających
wykonanie poleceń SQL na rzecz obiektu Statement:
Ten sam obiekt Statement może zostać wielokrotnie wykorzystany do wykonania różnych
instrukcji SQL.
Przykładowy kod, wstawiający do tabeli dwa rekordy za pomocą dwóch obiektów
ResultSet ma postać:
import java.sql.*;
import java.io.*;
public class DodawanieRekordow {
public static DodawanieRekordow dodawanieRekordow;
protected Connection connection = null;
public DodawanieRekordow(){
try{
connect();
writeRecord();
close();
}
7
Kody do wykładu „Programowanie baz danych – JDBC” – Maria Dems;
Materiały wewnętrzne bez prawa powielania, kopiowania i rozpowszechniania
catch(SQLException e){
System.out.println("Błąd: " + e);
while((e = e.getNextException()) != null){
} }
}
public static void main(String args[]){
dodawanieRekordow = new DodawanieRekordow();
public void connect()throws SQLException{
try{
Class.forName("org.postgresql.Driver");
}
}
catch(ClassNotFoundException e){
System.out.println("Błąd załadownaia sterownika: " + e);
System.exit(-1);
}
connection =
DriverManager.getConnection("jdbc:postgresql://localhost/archiwum", "olga", "olga");
System.out.println("\nPołączenie zostało nawiązane\n");
}
public void close()throws SQLException{
connection.close();
System.out.println("\nPołączenie zostało zamknięte\n");
}
public void writeRecord()throws SQLException{
Statement statement = connection.createStatement();
int liczba = statement.executeUpdate("INSERT INTO osoby VALUES (1,'Olga', ‘Kowalska',
'01/01/1980', 'Warszawa', ‘Nowa 27/11')");
System.out.println("Liczba dodanych rekordów: " + liczba);
}
}
Operacje na zbiorze wyników w JDBC
//połączenie jest nawiązane i utworzony obiekt Statement statement
String sql;
//do typu String przypisano zmienną reprezentującą polecenia SQL
//...
//wykonanie metody execute()
boolean b = statement.execute(sql);
if(b){
//sprawdzamy zwróconą wartość b == true
//obsługa danych
ResultSet rs = statement.getResultSet();
8
Kody do wykładu „Programowanie baz danych – JDBC” – Maria Dems;
Materiały wewnętrzne bez prawa powielania, kopiowania i rozpowszechniania
while(rs.next()){
//...
System.out.println(rs.getlnt("nazwa_pola"));
// inna obsługa danych
//...
}
}
else{
// zwrócona wartość b == false
//sprawdzenie ilości zmienionych rekordów
int liczba = statement.getUpdateCount();
System.out.println("Liczba zmienionych rekordów: "+ liczba);
}
//zamknięcie połączenia
ResultSet rs = stm.executeQuery("…");
//….
ResultSetMetaData rsmd = rs.getMetaData();
Connection con
DriverManager.getConnection("jdbc:postgresql://localhost/
archiwum","olga", "olga");
void wypisz(String args){
System.out.println(args); }
String query = "SELECT imie, nazwisko, adres FROM osoby";
try{
Statement stm = con.createStatement();
ResultSet rs = stm.executeQuery(query);
ResultSetMetaData rsmd = rs.getMetaData();
int liczba = rsmd.getColumnCount();
//liczba kolumn
for(int i = 1; i<=liczba; i++) {
wypisz('\n' rsmd.getColumnName(i));
//nazwa
wypisz(' ' rsmd.getColumnDisplaySize(i)); //szerokość
wypisz(' ' rsmd.getColumnClassName(i)); //klasa Javy
wypisz(' ' rsmd.getColumnType(i));
//typ SQL
wypisz(' ' rsmd.getColumnTypeName(i));
//typ RDBMS
}
stm.close();
con.close();
}
catch(SQLException e){
System.out.println(e.getMessage());
}
9
Kody do wykładu „Programowanie baz danych – JDBC” – Maria Dems;
Materiały wewnętrzne bez prawa powielania, kopiowania i rozpowszechniania
//połączenie zostało już nawiązane przez obiekt Connection con
try{
con.setAutoCommit(false);
//wyłączenie trybu autocommit
Statement stm = con.createStatement(); //utworzenie ob. Statement
//wywołanie polecenia SQL
stm.executeUpdate("UPDATE osoby"+
”SET adres = ‘Nowa 27‘”+
"WHERE Nazwisko LIKE '%ska';");
stm.executeUpdate("DELETE FROM osoby"+
"WHERE adres = ‘Nowa 27'");
con.commit(); //zatwierdzenie transakcji w przypadku braku błędów
}
catch(Exception e){
con.rollback(); } //odwołanie transakcji przy wystąpieniu błędów
//zamknięcie połączenia
Connection con = DriverManager.getConnection
("jdbc:postgresql://localhost/archiwum","olga", "olga");
Statement stm = con.createStatement();
Savepoint sp;
stm.executeUpdate(("INSERT INTO osoby VALUES
(1,'Olga', ‘Kowalska', '01/01/1980', 'Warszawa', ‘Nowa 27/11')");
sp = con.setSavepoint(safety);
stm.executeUpdate("INSERT INTO akta_studenckie
(id_osoby, nr_albumu) VALUES (2, 22780)");
try{
stm.executeUpdate("UPDATE osoby SET akta_studenckie = 2 WHERE id = 1");
catch(SQLException e){
con.rollback(sp);
}
con.commit();
Transakcje w JDBC - przykładowy program
import java.sql.* ;
public class Transakcja1 {
public static void main(String [ ] args)
throws SQLException {
int kod_bledu ;
Connection conn = null ;
try { //Załadowanie i rejestracja sterownika Oracle
DriverManager.registerDriver (new
oracle.jdbc.driver.OracleDriver( ));
//ustanawiamy połączenie
conn = DriverManager.getConnection („jdbc:oracle:thin:@training: 1521:Oracle”,
„oratest”, oratest”) ;
Transakcje w JDBC - przykładowy program
//W
Wyłączamy tryb automatycznego zatwierdzania
conn = setAutoCommit( false) ;
10
Kody do wykładu „Programowanie baz danych – JDBC” – Maria Dems;
Materiały wewnętrzne bez prawa powielania, kopiowania i rozpowszechniania
String sql1 = „SELECT nr FROM tabela WHERE nr=? ” ;
String sql2 = „INSERT INTO tabela VALUES (?.?.?) ” ;
PreparedStatement pstmt1 = conn. prepareStatement (sql1) ; PreparedStatement pstmt2 =
conn. prepareStatement (sql2) ;
pstmt1.setInt(1, 9999);
ResultSet rset = pstmt1.executeQuery( ) ;
if (rset.next( ) ) { System.out.println(”nr 9999 istnieje”) ;
rset.close ( ) ; }
else
{ pstmt2.setInt(1, 9999);
pstmt2.setString(2, „Adam”) ;
pstmt2.setString(3, „Kowalski”) ; }
Transakcje w JDBC - przykładowy program
pstmt1.close ( ) ;
pstmt2.close( ) ;
//zzatwierdzamy efekt instrukcji INSERT
conn.commit( ) ;
conn.close( )
}
catch (SQLException e)
//w
wycofujemy zmiany, aby anulować efekt instrukcji INSERT
{ conn. Rollback ( ) ;
kod_bledu = e.getErrorCode( ) ;
System.err.println(kod_bledu + e.getMessage( ) ) ;
}
}
}
Connection con = null;
try{
//wywołanie funkcji powodujących wyjątek:
// połączenie z bazą danych, polecenia SQL
}
catch(SQLException e){
//przechwycenie wyjątku i wyświetlenie go na konsoli
System.out.println(e.getMessage());
//pobranie referencji do kolejnych wyjątków,
//do momentu otrzymania wartości null
while(null!=(e=e.getNextException()){
//wyświetlenie informacji o kolejnych wyjątkach
System.out.println(e.getMessage());
}
}
Connection con = null;
try{
11
Kody do wykładu „Programowanie baz danych – JDBC” – Maria Dems;
Materiały wewnętrzne bez prawa powielania, kopiowania i rozpowszechniania
//połączenie i wykonanie transakcji
}
catch(SQLException e) {
//obsługa wyjątku
}
final {
if(con!= null){
try {con.close();}
catch(SQLException e){ }
}
}
Mapowanie typów danych w JDBC

Przykład wywołania funkcji wyzej z konwertowaniem dostarczonych argumentów
znakowych na wielkie litery
//utworzono i zainicjowano obiekt Connection con
//utworzenie obiektu CallableStatement, z podaniem w argumencie
// funkcji 'prepareCall' składni wywołania funkcji przechowywanej
CallableStatement wyzej =
con.prepareCall("{?=call wyzej(?)}");
//rejestracja par. wyjściowego funkcji którym jest znacznik "?"
wyzej.registerOutParameter(1, Types.VARCHAR);
//przypisanie pierwszemu znacznikowi '?' wartości
wyzej.setString(2, "Konwertuj z małych liter na duże");
//wywołanie wykonania funkcji przechowywanej
wyzej.execute();
String wyzejPobierz = wyzej.getString(1);
wyzej.close();
Przykład zwracania wartości funkcji jako refcursor
//ustawiono wywołanie funkcji.
Statement stm = con.createStatement();
stm.execute("CREATE OR REPLACE FUNCTION refKursorFunkcja()"
+"RETURNS refcursor AS’ DECLARE kursor refcursor ; "
+ " BEGIN OPEN kursor FOR SELECT 1 UNION SELECT 2; "
+ " RETURN kursor ; END ;' language plpgsql");
stm.close();
//należy być wewnątrz transakcji dla kursorów, by pracować z nimi
con.setAutoCommit(false);
//wywołanie procedury
CallableStatement proc = con.prepareCall("{?=call refKursorFunkcja()}");
proc.registerOutParameter(1, Types.Other);
proc.execute();
ResultSet rs = (ResultSet)proc.getObject(1);
while (rs.next()) {
//działania na rezultatach
}
rs.close();
12
Kody do wykładu „Programowanie baz danych – JDBC” – Maria Dems;
Materiały wewnętrzne bez prawa powielania, kopiowania i rozpowszechniania
proc.close();
Przykład zwracania wartości funkcji jako typ danych SETOF
Statement stm = con.createStatement();
stm.execute("CREATE OR REPLACE FUNCTION setOfFunkcja()"
+"RETURNS SETOF int AS 'SELECT 1 UNION SELECT 2; ' language sql");
ResultSet rs = stm.executeQuery("SELECT * FROM setOfFunkcja()");
while (rs.next()) {
// jakies operacje na danych
}
rs.close();
stm.close();
Funkcje przechowywane w JDBC





Wartości zwracane przez refcursor można potraktować jako nazwę kursora; w tym celu
należy użyć metody getString() obiektu ResultSet.
W kursorze można również używać takich poleceń jak FETCH i MOVE.
Obsługa dużych obiektów w JDBC
JDBC umożliwia obsługę stosunkowo dużych obiektów za pomocą metod getBytes()
i getString(), należących do interfejsu java.sql.ResultSet.
Często jednak znajdujące się w bazie obiekty mogą być tak duże, że zastosowanie
powyższych metod nie będzie możliwe.
JDBC udostępnia metody operujące na strumieniach:






getBinaryStream(),
getAsciiStream(),
getUnicodeStream()
setBinaryStream(),
setAsciiStream()
setUnicodeStream().

W celu zapisania w bazie danych znajdującego się na dysku twardym zdjęcia należy
napisać kod:
//utworzono połączenie, stworzono i zainicjowano obiekt
// Connection con i utworzono obiekt File dla pliku zdjecia
File zdjecie = new File("olga.gif");
int wielkoscPliku = zdjecie.length(); //odczytanie wielkości pliku
//utworzenie strumienia wejściowego z pliku
InputStream is = new FileInputStream(zdjecie);
//przygotowanie poleceń wstawiania do bazy
PreparedStatement pstm =
13
Kody do wykładu „Programowanie baz danych – JDBC” – Maria Dems;
Materiały wewnętrzne bez prawa powielania, kopiowania i rozpowszechniania
con.prepareStatement("UPDATE PORTRETY SET zdjecie = ?" + "WHERE nazwisko =
‘Kowalska'");
//przypisanie strumienia wejściowego z pliku
//do strumienia danych, przesyłanych do bazy
pstm.setBinaryStream(1, is, wielkoscPliku);
pstm.execute();
//wywołanie wykonania polecenia

W celu uzyskania pliku z bazy danych należy napisać kod:
//utworzono połączenie, stworzono i zainicjowano obiekt
// Connection con i utworzono obiekt Statement w postaci:
Statement stm =
con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
String query = "SELECT zdjecia FROM osoby" + //utworzenie polecenia SQL
"WHERE Nazwisko = ‘Kowalska'";
//wykonanie zapytania- otrzymanie referencji do obiektu ResultSet
ResultSet rs = stm.executeQuery(query);
byte() bufor = new byte[2048]; //utworzenie buforu dla danych wypisanych z bazy
//ustawienie kursora obiektu ResultSet przed pierwszym rekordem rs.beforeFirst();
while(rs.next()){
//przypisanie do zmiennej is strumienia wejściowego z bazy
InputStream is = rs.getBinaryStream("zdjecie");
int rozmiar = 0;
//odczytanie danych ze strumienia
while((rozmiar = in.read(bufor)) > 0){
//...
}
//operacja na danych pobranych z bazy
}

Sposób obsługi struktur w JDBC ilustruje przykład:
import java.sql.*;
public Class DodatkoweInformacje implements SQLData {
//deklarowanie zmiennej określającej nazwę struktury
private String sql_type;
//deklarowanie zmiennych, odpowiadających polom struktury
public int wzrost;
public String dodatkowe_dane;
//konstruktor bez paramertów, inicjujący obiekt przez JDBC
public DodatkoweInformacje(){ }
//drugi konstruktor, niezbędny do utworzenia i zapisu obiektu do bazy
public DodatkoweInformacje(String sql_type, int wzrost,
String dodatkowe_dane) {
this.sql_type = sql_type;
this.wzrost = wzrost;
this.dodatkowe_dane = dodatkowe_dane;
}
14
Kody do wykładu „Programowanie baz danych – JDBC” – Maria Dems;
Materiały wewnętrzne bez prawa powielania, kopiowania i rozpowszechniania
//implementowanie funkcji z interfejsu SQLData zwracającej sql_type
public String getSQLTypeName() throws SQLException{
return sql_type;
}
public void readSQL(SQLInput stream, String typeName) throws SQLException{
//podstawienie do zmiennej sql_type wartości przekazanej
//w argumencie typeName
sql_type = typeName;
//odczytanie ze strumienia wartości pól struktury
//w kolejności określonej w definicji struktury w bazie danych
wzrost = stream.readlnt();
dodatkowe_dane = stream.readString();
}
public void writeSQL(SQLOutput stream) throws SQLException{
//zapisanie do strumienia wartości zmiennych obiektu
//w kolejności określonej w definicji struktury w bazie danych
stream.writeInt(wzrost);
stream.writeString(dodatkowe_dane);
}
}
//nawiązano połączenie z bazą danych oraz stworzono
// i zainicjowano obiekt Connection con
//pobranie referencji do obiektu Map zawierającego zmapowane typy
//SQL do klas Javy
java.util.Map map = con.getTypeMap();
//mapowanie struktury do zaimplementowanej klasy map.put("informacje",
Class.forName("DodatkoweInformacje"));
//utworzenie obiektu Statement
Statement stm =
con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
RsultSet.CONCUR_READ_ONLY)
//wykonanie zapytania
ResultSet rs = stm.executeQuery("SELECT informacje FROM osoby”
+"WHERE nazwisko = ‘Kowalska'");
//w tabeli jest jeden taki rekord, więc rezultat zapytania został
//zapisany dla pierwszego wyniku
rs.first();
//pobranie obieku
DodatkoweInformacje inf = (DodatkoweInformacje)rs.getObject("informacje");
//przetwarzanie zwróconych danych
System.out.println("Waga: "+inf.waga);
System.out.println("dodatkowe_dane: "+inf. dodatkowe_dane);
Struktury w JDBC

Sposób dodania nowych wartości do bazy danych do tabeli osoby z wykorzystaniem
uprzednio zdefiniowanego obiektu DodatkoweInformacje ilustruje kod:
15
Kody do wykładu „Programowanie baz danych – JDBC” – Maria Dems;
Materiały wewnętrzne bez prawa powielania, kopiowania i rozpowszechniania
//utworzenie obiektu PreparedStatement i przypisanie do niego
//polecenia SQL modyfikującego dane w kolumnie informacje, jeśli
//zostanie spełniony warunek WHERE
PreparedStatement pstm = con.prepareStatement("UPDATE osoby " + "SET informacje = ?"+
"WHERE nazwisko = ‘Kowalska'");
//utworzenie obiektu klasy DodatkoweInformacje
DodatkoweInformacje inf = new DodatkoweInformacje(196, "Polka, dwie specjalizacje:
informatyka, elektrotechnika");
//przypisanie zmiennej inf do znacznika ?
pstm.setObject(1, daneOs, Types.STRUCT);
//wykonanie polecenia UPDATE
pstm.execute();
//...
Wywoływanie procedur przechowywanych
Javy w JDBC - przykładowy program
import java.sql.* ;
public class JavaProcPrzyklad {
public static void main(String [ ] args)
throws SQLException {
int kod_bledu ;
Connection conn = null ;
try { //Załadowanie i rejestracja sterownika Oracle
DriverManager.registerDriver (new
oracle.jdbc.driver.OracleDriver( ));
//ustanawiamy połaczenie
conn = DriverManager.getConnection („jdbc:oracle:thin:@training: 1521:Oracle”,
„oratest”, oratest”) ;
//P
Procedura usuwa rekordy z tabeli, w których nr = 20
int i_nr = 20 ;
CallableStatement pstmt = conn.prepareCall(”{call proc_nazwa (?) }” ) ;
pstmt.setInt (1, i_nr) ;
pstmt.executeUpdate ( ) ;
pstmt.close ( ) ;
conn.close( )
}
catch (SQLException e)
{ kod_bledu = e.getErrorCode( ) ;
System.err.println(kod_bledu + e.getMessage( ) ) ;
conn.close( ) ; }
}
}
16

Podobne dokumenty