Wykład 10
JDBC - połączenia z relacyjnymi bazami danych
1. Procedura posługiwania się sterownikiem JDBC-ODBC 1) Utworzenie relacyjnej bazy danych np. w MS Access
np. katalog.mdb zawierającej tabele Tytul i Ksiazka
2) Połączenie bazy danych ze źródłem danych ODBC, które zostanie skojarzone z plikiem katalog.mdb za pomocą administratora ODBC systemu Windows
wywołaj ODBC Data Source Administrator systemu Windows i kliknij na zakładkę User DSN
kliknij Add w celu wybrania właściwego sterownika ODBC dla MS Access i naciśnij Zakończ
w nowym oknie wpisz nazwę nowego źródła danych (Katalog)
po kliknięciu na zakładkę Wybierz wybierz katalog z plikiem katalog.mdb i kliknij OK
w celu dodania źródła danych Katalog związanego z plikiem katalog.mdb kliknij OK
otrzymano nowe źródło danych Katalog związane z plikiem katalog.mdb (baza danych)
3) napisanie programu
wykonanie łańcucha typu String data identyfikującego źródło danych i rodzaj połączenia do bazy danych: data="jdbc:odbc:Katalog";
Łańcuch data składa się z trzech członów:
<protokół>:<podprotokół>:<nazwa_źródła_danych>
np. jdbc:odbc:Katatog
jdbc:odbc://sprocket.ict.pwr.wroc.pl:5000/Katalog
załadowanie sterownika za pomocą wywołania
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); , gdzie metoda forName ładuje klasę o nazwie podanej jako parametr do interpretera ( java.lang)
połączenie ze źródłem danych za pomocą klasy Driver Manager (java.sql) polaczenie = DriverManager.getConnection(data, "", "");
gdzie połączenie jest referencją do obiektu typu Connection. Metoda getConnection ma trzy parametry: data , nazwę użytkownika (w przykładzie pusta), hasło
(w przykładzie puste)
przygotowanie polecenia SQL za pomocą obiektu typu Statement:
polecenie = polaczenie.createStatement();
przygotowanie zapytania SQL sql="SELECT * FROM Tytul ORDER BY tytul;";
np. do wyboru wszystkich kolumn tabeli Tytul
wykonanie zapytania SQL: krotka = polecenie.executeQuery(sql); zostanie zwrócony wynik zapytania w postaci obiektu typu ResultSet, który ma następujące metody:
getDate(String s) zwraca wartość typu Date zawartą w określonej kolumnie wiersza
getDouble(String s) zwraca wartość typu double zawartą w określonej kolumnie wiersza
getFloat(String s) zwraca wartość typu float zawartą w określonej kolumnie wiersza
getInt(String s) zwraca wartość typu int zawartą w określonej kolumnie wiersza
getLong(String s) zwraca wartość typu long zawartą w określonej kolumnie wiersza
getString(String s) zwraca wartość typu String zawartą w określonej kolumnie wiersza
Do nawigacji po pozostałych rekordach uzyskanych po wykonaniu zapytania SQL:
next() przejście do następnego rekordu
afterLast() przejście do ostatniego rekordu
afterFirst() przejście do pierwszego rekordu
first() przejście do pierwszego rekordu
last() przejście do ostatniego rekordu
previous() przejście do poprzedniego rekordu
Po zakończeniu pracy ze źródłem danych zamknięcie połączenia polecenie.close();
Przykłady zastosowania sterowników
JDBC-ODBCPrzykład 1 – Operacje wyświetlania zawartości tabeli Tytul
import java.sql.*;
public class baza7_1 {
String data, sql;
Connection polaczenie;
Statement polecenie;
ResultSet krotka;
void polaczenie_z_baza() throws Exception { data="jdbc:odbc:Katalog";
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
polaczenie=DriverManager.getConnection(data,"","");
}
void wyswietl_tytuly() throws Exception { polecenie = polaczenie.createStatement();
sql="SELECT * FROM Tytul ORDER BY tytul;";
krotka = polecenie.executeQuery(sql);
while(krotka.next())
{ System.out.println(krotka.getString("tytul")+"\t"
+krotka.getString("autor")+"\t"
+krotka.getString("ISBN"));
}
polecenie.close();
}
static public void main(String arg[]) { baza7_1 baza = new baza7_1();
try
{ baza.polaczenie_z_baza();
baza.wyswietl_tytuly();
} catch(Exception e)
{ System.out.println("Blad bazy "+e);
} } }
Przykład 2 –
Operacje wyświetlania zawartości tabeli Tytul oraz powiązanej „jeden do wiele” tabeli Ksiazka
import java.sql.*;
public class baza7_2 {
String data, sql;
Connection polaczenie;
Statement polecenie;
ResultSet krotka;
void polaczenie_z_baza() throws Exception { data="jdbc:odbc:Katalog";
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
polaczenie=DriverManager.getConnection(data,"","");
}
void wyswietl_tytuly() throws Exception { polecenie = polaczenie.createStatement();
sql="SELECT * FROM Tytul ORDER BY tytul;";
krotka = polecenie.executeQuery(sql);
while(krotka.next())
{ System.out.println(krotka.getString("tytul")+"\t"
+krotka.getString("autor")+"\t"
+krotka.getString("ISBN"));
}
polecenie.close();
}
void wyswietl_ksiazki() throws Exception { polecenie = polaczenie.createStatement();
sql="SELECT * FROM Tytul, Ksiazka "
+" WHERE id_tytul=id_tytul_ "
+" ORDER BY tytul;";
krotka = polecenie.executeQuery(sql);
while(krotka.next())
{ System.out.println(krotka.getString("tytul")+"\t"
+krotka.getString("autor")+"\t"
+krotka.getString("ISBN")+"\t"
+krotka.getString("numer"));
}
polecenie.close();
}
static public void main(String arg[]) { baza7_2 baza = new baza7_2();
try
{ baza.polaczenie_z_baza();
System.out.println("Tytuly");
baza.wyswietl_tytuly();
System.out.println("Ksiazki");
baza.wyswietl_ksiazki();
}catch(Exception e)
{System.out.println("Blad bazy "+e);
} } }
Przykład 3 –Aplikacja konsolowa obsługująca wybór operacji na tabelach Tytul i Ksiazka typu zapytania i transakcje
import java.sql.*;
import java.io.*;
import java.util.*;
class WeWy
{ static String weString(String menu)
{ InputStreamReader wejscie = new InputStreamReader( System.in );
BufferedReader bufor = new BufferedReader( wejscie );
try
{ System.out.print(menu);
return bufor.readLine();
} catch (IOException e)
{ System.err.println("Blad IO String");
return ""; } }
static byte weInteger(String menu)
{ InputStreamReader wejscie = new InputStreamReader( System.in );
BufferedReader bufor = new BufferedReader( wejscie );
StringTokenizer zeton;
try
{ System.out.print(menu);
zeton = new StringTokenizer(bufor.readLine());
return Byte.parseByte(zeton.nextToken());
} catch (Exception e)
{ System.err.println("Blad Integer "+e);
return 0; } }
}
class Tytul // klasa zawierająca składowe typu dane odpowiadająca tabeli Tytul
{ public String tytul,autor;
public int ISBN;
void wstaw_tytul() throws Exception { tytul = WeWy.weString("Podaj tytul: ");
autor = WeWy.weString("Podaj autora: ");
ISBN = WeWy.weInteger("Podaj ISBN: "); } }
class Ksiazka // klasa zawierająca składowe typu dane odpowiadająca tabeli Ksiazka
{ public int numer;
void wstaw_ksiazke()
{ numer = WeWy.weInteger("Podaj numer ksiazki: "); } }
public class baza7_3 { String data, sql;
Connection polaczenie;
Statement polecenie;
ResultSet krotka;
void wstaw_tytul() throws Exception { Tytul t = new Tytul();
t.wstaw_tytul();
polaczenie.setAutoCommit(false); //wyłączenie trybu transakcji auto-commit
try
{ polecenie = polaczenie.createStatement();
sql="INSERT INTO Tytul (tytul, autor, ISBN)"+
" VALUES ('"+t.tytul+
"','"+ t.autor+"','"+ t.ISBN+"')";
polecenie.addBatch(sql); //wprowadzenie 1 operacji SQL (można podać więcej operacji // w kolejnych wywoŁanych metodach addBATCH)
polecenie.executeBatch(); //wywołanie wykonania operacji (lub wielu operacji)
polaczenie.commit(); //zamknięcie transakcji
} catch(BatchUpdateException e)
{ System.out.println("Wycofanie transakcji");
polaczenie.rollback();} //jeśli wystąpiły problemy, należy odwołać transakcję
}
void wstaw_ksiazke() throws Exception { Ksiazka k = new Ksiazka();
k.wstaw_ksiazke();
polaczenie.setAutoCommit(false);
try
{ polecenie = polaczenie.createStatement();
String tytul=WeWy.weString("Podaj tytul ksiazki: ");
sql="SELECT * FROM Tytul "+
"WHERE tytul= '"+tytul+"';";
krotka=polecenie.executeQuery(sql);
if (!krotka.next()) return;
sql="INSERT INTO Ksiazka (numer, id_tytul_)"+
" VALUES ('"+k.numer+
"','"+ krotka.getString("id_tytul")+"');";
polecenie.addBatch(sql);
polecenie.executeBatch();
polaczenie.commit();
void polaczenie_z_baza() throws Exception { data="jdbc:odbc:Katalog";
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
polaczenie=DriverManager.getConnection(data,"","");
}
void wyswietl_tytuly() throws Exception { polecenie = polaczenie.createStatement();
sql="SELECT * FROM Tytul ORDER BY tytul;";
krotka = polecenie.executeQuery(sql);
while(krotka.next())
{ System.out.println(krotka.getString("tytul")+"\t"
+krotka.getString("autor")+"\t"
+krotka.getString("ISBN")); } polecenie.close();
}
void wyswietl_ksiazki() throws Exception { polecenie = polaczenie.createStatement();
sql="SELECT * FROM Tytul, Ksiazka "
+" WHERE id_tytul=id_tytul_ "
+" ORDER BY tytul;";
krotka = polecenie.executeQuery(sql);
while(krotka.next())
{ System.out.println(krotka.getString("tytul")+"\t"
+krotka.getString("autor")+"\t"
+krotka.getString("ISBN")+"\t"
+krotka.getString("numer"));}
polecenie.close();
}
void wyszukaj() throws Exception
{ String co = WeWy.weString("Podaj autora: ");
polecenie = polaczenie.createStatement();
sql="SELECT * FROM Tytul, Ksiazka "+
" WHERE id_tytul=id_tytul_"+
" AND autor = '" + co +"' "+
" ORDER BY tytul;";
krotka = polecenie.executeQuery(sql);
while(krotka.next())
{ System.out.println(krotka.getString("tytul")+"\t"
+krotka.getString("autor")+"\t"
+krotka.getString("ISBN")+"\t"
+krotka.getString("numer"));}
polecenie.close();
}
void operacje_na_bazie() throws Exception { int opcja;
do
{ System.out.println("1 - wyswietl tytuly");
System.out.println("2 - wyswietl ksiazki");
System.out.println("3 - wyszukaj ksiazki danego autora");
System.out.println("4 - wstaw tytul");
System.out.println("5 - wstaw ksiazke");
System.out.println("-1 - koniec programu");
opcja = WeWy.weInteger("Podaj opcje: ");
switch(opcja)
{ case 1 : System.out.println("Tytuly");
wyswietl_tytuly();break;
case 2 : System.out.println("Ksiazki");
wyswietl_ksiazki();break;
case 3 : wyszukaj();break;
case 4 : wstaw_tytul();break;
case 5 : wstaw_ksiazke(); break;
case -1: System.out.println("Koniec programu");break;
default : System.out.println("Zla opcja");
}
}while(opcja!=-1);
}
static public void main(String arg[]) { baza7_3 baza = new baza7_3();
try
{ baza.polaczenie_z_baza();
baza.operacje_na_bazie();
} catch(Exception e)
{System.out.println("Blad bazy "+e);}
} }
2. Procedura posługiwania się sterownikiem JDBC 1) Wykonać relacyjną bazę danych (punkt 1, 1))
2) połączyć bazę danych (np. plik katalog.mdb) ze sterownikiem JDBC np.
JDataConnect (http://www.jnetdirect.com/firmy - link firmy jnetDirect)
należy wykonać czynności z punktu 1, 2)
zainstalować ściągnięte oprogramowanie JDBCsetup.exe
uruchomić \Program Files\NetDirect\JDataConnect\JDataServer\RunServer.bat
skopiować zawartość katalogu JARs do katalogu programu (JDataLite.jar, JData2_0.jar, JData1_2.jar)
skompilować projekt
uruchomić „bajtkod”
Programy z przykładów 1-3 są identyczne – jedynie zmieniono metodę polaczenie void polaczenie_z_baza() throws Exception
{ data="jdbc:JDataConnect://localhost:1150/Katalog";
Class.forName("Jdata2_0.sql.$Driver");
polaczenie=DriverManager.getConnection(data,"","");
} lub
void polaczenie_z_baza() throws Exception
{ data="jdbc:JDataConnect://localhost:1150/Katalog";
Driver driver;
driver = (Driver) Class.forName("JData2_0.sql.$Driver").newInstance();
polaczenie = driver.connect(data, new Properties());
}
gdzie localhost reprezentuje adres internetowy (URL) komputera.
Przykład 4. – Wyświetlanie danych (tytułów) z tabeli Tytul w trybie graficznym import java.sql.*;
import javax.swing.*;
import java.util.*;
import java.io.*;
import java.lang.*;
import java.awt.event.*;
class Okno extends JFrame
{ JLabel elista= new JLabel ("Tytuly ksiazek");
JComboBox lista;
Okno(Vector vector) {
super("Ramka 15");
lista=new JComboBox(vector);
setSize(300,250);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel= new JPanel();
panel.add(elista);
panel.add(lista);
setContentPane(panel);
} }
public class baza9_0 { String data, sql;
Connection polaczenie;
Statement polecenie;
ResultSet krotka;
void polaczenie_z_baza() throws Exception { data="jdbc:odbc:katalog";
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
polaczenie=DriverManager.getConnection(data,"","");
}
public Vector pobierz_tytuly() throws Exception
{Statement polecenie= polaczenie.createStatement();
String sql="SELECT * FROM Tytul ORDER BY tytul;";
ResultSet krotka= polecenie.executeQuery(sql);
Vector vector= new Vector(10,5);
while(krotka.next())
{ String tytul = new String(krotka.getString("tytul")+' '+
krotka.getString("autor")+' '+
krotka.getInt("ISBN"));
vector.addElement(tytul);
}
vector.trimToSize();
polecenie.close();
return vector;
}
static public void main(String arg[]) { baza9_0 baza = new baza9_0();
try
{ baza.polaczenie_z_baza();
Okno okno = new Okno(baza.pobierz_tytuly());
okno.show();
}catch(Exception e)
{System.out.println("Blad bazy "+e);
} } }