Wspóªpraca z zewn trznym oprogramowaniem: JDBC, JNI (Java Native Interface)

Podobne dokumenty
JAVA NATIVE INTERFACE

Metody dostępu do danych

Bazy danych wykład dwunasty

JDBC (Java Database Connectivity vit )

Informatyka I. Standard JDBC Programowanie aplikacji bazodanowych w języku Java

Połączenie z bazą danych

Informatyka I. Programowanie aplikacji bazodanowych w języku Java. Standard JDBC.

JAVA bazy danych. na bazie: Język Java - Podstawy Programowania - Jacek Rumiński

JAVA I BAZY DANYCH. MATERIAŁY:

Programowanie komputerów. Wykład 10: Dostęp do baz danych z poziomu aplikacji Java. (JDBC Database Access)

JDBC - Obsługa baz danych w języku Java

Łączenie z bazą danych przykładowa klasa infpolaczenie import java.sql.drivermanager; import java.sql.connection; import java.sql.

Connection con = DriverManager.getConnection(dbUrl, username, passwd);

Rozdział 9 Obsługa baz danych w języku Java

Aplikacje bazodanowe. dr inż. Arkadiusz Mirakowski

1 Klasy. 1.1 Denicja klasy. 1.2 Skªadniki klasy.

Interfejsy, klasy wewn trzne jako szczególny rodzaj obiektów

Java i jej wykorzystanie do tworzenia dynamicznych aplikacji Webowych

Programowanie w języku Java. Bazy danych SQLite w Javie

Podstawy otwartych języków programowania Java Database Connectivity (JDBC)

Wzorce projektowe strukturalne cz. 1

Plan wykładu. Dostęp do bazy danych. Architektura JDBC. Dostęp do baz danych z aplikacji Java EE

Typy sterowników. Rozdział 21 JDBC. Podstawowe kroki aplikacji. Historia. Program napisany w języku Java JDBC API. Menadżer sterowników JDBC

Aplikacje bazodanowe. Laboratorium 1. Dawid Poªap Aplikacje bazodanowe - laboratorium 1 Luty, 22, / 37

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych

Java Database Connectivity

Wprowadzenie do JDBC z wykorzystaniem bazy H2

Java Zadanie 1. Aby poprawnie uruchomić aplikację desktopową, należy zaimplementować główną metodę zapewniającą punkt wejścia do programu.

Dostęp do baz danych z serwisu www - PHP. Wydział Fizyki i Informatyki Stosowanej Joanna Paszkowska, 4 rok FK

JDBC w LoXiMie. Interfejs Java Database Connectivity dla systemu LoXiM. Adam Michalik 2008

JDBC. Plan ćwiczenia. Wywoływanie poleceń SQL z języków programowania. Plan ćwiczenia cd. Wprowadzenie do laboratorium

Wieloplatformowe aplikacje sieciowe. dr inż. Juliusz Mikoda mgr inż. Anna Wawszczak

Java a dost p do Internetu.

Dlaczego JDBC jest lepszy ni ODBC? Zgodno ze standardami SQL. Sterowniki.

DB+frontend Inne języki H2. Bazy Danych i Systemy informacyjne Wykład 9. Piotr Syga

Aplikacje Internetowe

1. Wprowadzenie do C/C++

Programowanie i struktury danych

Bazy danych, 4. wiczenia

Kurs programowania aplikacji bazodanowych

Programowanie w języku Java

1. Wprowadzenie do C/C++

Bazy danych II. Andrzej Grzybowski. Instytut Fizyki, Uniwersytet Śląski

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

Java Database Connectivity

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Wzorce projektowe kreacyjne

Podejście obiektowe do relacyjnych baz danych Hibernate.

PL/SQL. Zaawansowane tematy PL/SQL

1 Strumienie. 2 Pliki. 2.1 Zapis do pliku tekstowego. Programowanie w j zyku C - Adam Krechowicz, Daniel Kaczmarski

Ćwiczenie 10 JDBC. Wywoływanie poleceń SQL z języków programowania. Ćwiczenie 10 JDBC. Wymagania: Bazy Danych

PHP może zostać rozszerzony o mechanizmy dostępu do różnych baz danych:

Platformy Programistyczne Podstawy języka Java

Protokół JDBC współpraca z relacyjnymi bazami danych lab3

Programowanie obiektowe

Kurs programowania. Wykład 3. Wojciech Macyna. 22 marca 2019

PARADYGMATY PROGRAMOWANIA Wykład 4

Obiektowe programowanie rozproszone Java RMI. Krzysztof Banaś Systemy rozproszone 1

Podziaª pracy. Cz ± II. 1 Tablica sortuj ca. Rozwi zanie

Wywoływanie metod zdalnych

InsERT GT Własne COM 1.0

Wzorce logiki dziedziny

przygotował: Bazy danych Paweł Kasprowski Wersja 2006Z

Programowanie obiektowe

Podstawy programowania III WYKŁAD 2

Systemy Rozproszone - Ćwiczenie 6

Metody Metody, parametry, zwracanie wartości

INFORMATOR TECHNICZNY WONDERWARE. Konfiguracja komputera klienckiego do łączenia się z serwerem IndustrialSQL

Kurs programowania aplikacji bazodanowych

WYMAGANIA EDUKACYJNE I KRYTERIA OCENIANIA Z PRZEDMIOTU PROGRAMOWANIE APLIKACJI INTERNETOWYCH

Sieciowa komunikacja procesów - XDR i RPC

Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków

Kurs programowania. Wykład 9. Wojciech Macyna

Programowanie obiektowe zastosowanie języka Java SE

Chemoinformatyczne bazy danych - Wprowadzenie do technologii baz danych. Andrzej Bąk

Android. Podstawy tworzenia aplikacji. Piotr Fulma«ski. March 4, 2015

Język JAVA podstawy. wykład 1, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Podstawowe części projektu w Javie

Protokół JDBC współpraca z relacyjnymi bazami danych lab4. Dr inż. Zofia Kruczkiewicz Programowanie aplikacji internetowych

Wprowadzenie do technologii JavaServer Faces 2.1 na podstawie

PL/SQL. Zaawansowane tematy PL/SQL

System Informatyczny CELAB. Przygotowanie programu do pracy - Ewidencja Czasu Pracy

Programowanie Komputerów

Ćwiczenia laboratoryjne nr 11 Bazy danych i SQL.

Programowanie w języku Java WYKŁAD

Kolekcje obiektów. Wyj tki.

Oprogramowanie systemów równoległych i rozproszonych Wykład 7

Materiały oryginalne: ZAWWW-2st1.2-l11.tresc-1.0kolor.pdf. Materiały poprawione

Obliczenia arytmetyczne. Konkatenacja pól. Aliasy kolumn. Aliasy tabel. Co dalej? Rozdział 4. Korzystanie z funkcji. Zastosowanie funkcji

Wprowadzenie db4o - podstawy db4o - technikalia Przydatne wiadomości. Wprowadzenie. db4o. Norbert Potocki. 1 czerwca Norbert Potocki db4o

Aplikacje RMI Lab4

1. Czynności przygotowujące aplikację działającą na platformie Java SE Biblioteka5 (należy ją pobrać z załącznika z p.1)

Zaawansowane aplikacje internetowe - laboratorium Architektura Spring.

Remote Method Invocation 17 listopada Dariusz Wawrzyniak (IIPP) 1

Wywoływanie metod zdalnych

Programowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

Podejście obiektowe do budowy systemów rozproszonych

Listy i operacje pytania

Technologia Programowania 2016/2017 Wykªad 12

Transkrypt:

Wspóªpraca z zewn trznym oprogramowaniem: JDBC, JNI (Java Native Interface) Robert A. Kªopotek r.klopotek@uksw.edu.pl Wydziaª Matematyczno-Przyrodniczy. Szkoªa Nauk cisªych, UKSW 1.06.2017

Java JDBC Java JDBC (Java DataBase Connectivity) jest interfejsem Java API sªu» cym do ª czenia i wykonywania kwerend z baz danych. JDBC API u»ywa sterowników jdbc (JDBC driver) do ª czenia si z baz danych. Przed JDBC ODBC API byª baz danych API do ª czenia i wykonywania kwerendy z baz danych. ODBC API u»ywa sterownika ODBC, który jest napisany w j zyku C (tzn. zale»ny od platformy i niezabezpieczony). Dlatego w Javie zdeniowano wªasny interfejs API (JDBC API), który u»ywa sterowników JDBC (napisanych w j zyku Java). Pakiety obsªuguj ce JDBC to java.sql i javax.sql 2 / 51

Komponenty JDBC (1/2) DriverManager: klasa zarz dzaj ca list sterowników bazy danych. Odpowiada» daniom poª czenia z aplikacji Java z odpowiednim sterownikiem bazy danych przy u»yciu podprotokoªu sieci. Pierwszy sterownik rozpoznaj cy pewien podprotokóª w ramach JDBC b dzie u»ywany do nawi zania poª czenia z baz danych. Driver: interfejs obsªuguj cy komunikacj z serwerem bazy danych. U»ywa si go bardzo rzadko. Zamiast tego u»ywamy obiektów DriverManager, które zarz dzaj obiektami tego typu. Connection: interfejs ze wszystkimi metodami kontaktowania si z baz danych. Obiekt poª czenia reprezentuje kontekst komunikacyjny, tzn. caªa komunikacja z baz danych odbywa si wyª cznie za po±rednictwem obiektu poª czenia. 3 / 51

Komponenty JDBC (2/2) Statement: U»ywa si obiektów utworzonych z tego interfejsu, aby przesªa kwerendy SQL do bazy danych. Niektóre interfejsy pochodne akceptuj parametry, aby móc wykonywa procedury skªadowane. ResultSet: Obiekty te przechowuj dane pobrane z bazy danych po wykonaniu zapytania SQL przy u»yciu obiektów Statement. Dziaªaj jako iterator, dzi ki czemu mo»na porusza si w danych. SQLException: klasa wyj tków obsªuguj ca wszelkie bª dy wyst puj ce w aplikacji u»ywaj cej baz danych. 4 / 51

Architektura JDBC Interfejs JDBC obsªuguje zarówno modele dwuwarstwowych, jak i trójwarstwowych do przetwarzania baz danych, ale generalnie architektura JDBC skªada si z dwóch warstw - JDBC API: zapewnia poª czenie z aplikacj do Managera JDBC. JDBC Driver API: obsªuguje poª czenie JDBC Manager-to-Driver. Interfejs JDBC API u»ywa mened»era sterowników i sterowników specycznych dla bazy danych w celu zapewnienia przejrzystej ª czno±ci z heterogenicznymi bazami danych. Mened»er sterowników JDBC zapewnia,»e do uzyskania dost pu do ka»dego ¹ródªa danych u»ywany jest prawidªowy sterownik. Driver manager jest w stanie obsªugiwa wiele równoczesnych sterowników podª czonych do wielu heterogenicznych baz danych. 5 / 51

Architektura JDBC 6 / 51

JDBC Driver Sterownik JDBC to skªadnik oprogramowania, który umo»liwia aplikacji Java do wspóªpracowa z baz danych. S cztery typy sterowników JDBC: Sterownik mostu JDBC-ODBC Sterownik Native-API (cz ±ciowo w Javie) Sterownik protokoªu sieciowego (w peªni w Javie) Cienki sterownik (w peªni w Javie) 7 / 51

JDBC-ODBC bridge driver Zalety ªatwy w u»yciu mo»na ªatwo poª czy z dowoln baz danych. Wady Wydajno± jest zmniejszona, poniewa» wywoªanie metody JDBC jest konwertowane na wywoªania funkcji ODBC. Sterownik ODBC musi by zainstalowany na komputerze klienckim. 8 / 51

Native-API driver Zalety Wydajno± wi ksza ni» za pomoc sterownika mostu JDBC-ODBC Wady Sterownik natywny musi by zainstalowany na ka»dym komputerze klienckim. Biblioteka dostawcy musi by zainstalowana na komputerze klienckim. 9 / 51

Network Protocol driver Zalety adna biblioteka strony klienta nie jest wymagana ze wzgl du na serwer aplikacji, który mo»e wykonywa wiele zada«, takich jak kontrola, równowa»enie obci»enia, logowanie itp. Wady Obsªuga sieci jest wymagana na komputerze klienckim. Wymaga oprogramowania specycznego dla konkretnej bazy danych, który ma by wykonany w warstwie ±rodkowym. Z tego powodu utrzymanie sterownika 10 / 51protokoªu sieciowego staje si kosztowne.

Thin driver Zalety Lepsza wydajno± ni» wszystkie inne sterowniki. adne oprogramowanie nie jest wymagane po stronie klienta lub po stronie serwera. Wady Sterowniki zale» od bazy danych. 11 / 51

Poª czenie z baz danych Aby u»ywa standardowego pakietu JDBC, który umo»liwia operacje SQL SELECT, INSERT, UPDATE i DELETE, nale»y doda nast puj cy import do kodu ¹ródªowego import java. sql.* ; // Dla standartowych programów JDBC import java. math.* ; // dla wsparcia typów BigDecimal i BigIntege Aby poª czy si z baza danych wystarczy 5 kroków Zarejestrowanie klasy sterownika Stworzenie poª czenia Stworzenie zapytana SQL Wykonanie kwerendy (opcjonalnie pobranie wyniku) Zamkni cie poª czenia 12 / 51

Zarejestrowanie klasy sterownika Trzeba zarejestrowa sterownik w programie przed jego u»yciem. Rejestracja sterownika jest procesem, w którym plik klasy sterownika (np. Oracle, MySQL) jest zaªadowany do pami ci, dzi ki czemu mo»e by wykorzystany jako implementacji interfejsów JDBC. Wystarczy zrobi rejestracj tylko raz w programie. Sterownik mo»na zarejestrowa na jeden z dwóch sposobów. Poprzez metod Class.forName() Poprzez metod DriverManager.registerDriver() 13 / 51

Rejestrowanie - Class.forName() Najcz stszym podej±ciem do zarejestrowania sterownika jest u»ycie metody Class.forName() do dynamicznego ªadowania pliku klasy sterownika do pami ci, co automatycznie rejestruje j. Metoda ta jest preferowana, poniewa» umo»liwia kongurowanie i przenoszenie sterowników. Przykªad: try { Class. forname (" oracle. jdbc. driver. OracleDriver " ); catch ( ClassNotFoundException ex ) { System. out. println (" Error : unable to load driver class!" ); System. exit (1); 14 / 51

Rejestrowanie - DriverManager.registerDriver() Drugim podej±ciem, którego mo»na u»y do zarejestrowania sterownika, jest u»ycie statycznej metody DriverManager.registerDriver (). Je±li u»ywamy JVM niezgodnego z JDK, nale»y u»y metody registerdriver(), takiej jak ta dostarczona przez rm Microsoft. Przykªad: try { Driver mydriver = new oracle. jdbc. driver. OracleDriver (); DriverManager. registerdriver ( mydriver ); catch ( ClassNotFoundException ex ) { System. out. println (" Error : unable to load driver class!" ); System. exit (1); 15 / 51

Tworzenia poª czenia z baz danych Po zaªadowaniu sterownika mo»na nawi za poª czenie przy u»yciu metody DriverManager.getConnection() Trzy przeci»one metody: getconnection(string url) getconnection(string url, Properties prop) getconnection(string url, String user, String password) Przykªad: Connection con = DriverManager. getconnection ( " jdbc : oracle : thin : @localhost :1521: xe "," system "," password " ); 16 / 51

Popularne Connection String Typ Bazy danych DriverClassName Connection String MySQL com.mysql.jdbc.driver "jdbc:mysql://<hostname>:<portnumber>/<databasename>" PostgreSql org.postgresql.driver "jdbc:postgresql://<hostname>:<portnumber>/<databasename>" SQLServer com.microsoft.sqlserver.jdbc.sqlserverdriver "jdbc:sqlserver://<hostname>:<portnumber>;<databasename>" Oracle oracle.jdbc.driver.oracledriver "jdbc:oracle:thin:@<hostname>:<portnumber>:<databasename>" DB2 COM.ibm.db2os390.sqlj.jdbc.DB2SQLJDriver "jdbc:db2://<hostname>:<portnumber>/<databasename>" "DB2(on As/400)" com.ibm.as400.access.as400jdbcdriver "jdbc:as400://<hostname>:<portnumber>/<databasename>;" 17 / 51

Tworzenia i wykonywanie zapyta«do tworzenia zapyta«sql sªu»y metoda createstatement() interfejsu Connection. Obiekt klasy Statement jest odpowiedzialny za wykonywanie kwerend z baz danych. public Statement createstatement () throws SQLException Do wykonywania kwerend w bazie danych sªu»y metoda executequery () interfejsu Statement. Metoda zwraca obiekt ResultSet, który mo»e by u»yty do pobrania wszystkich rekordów tabeli. public ResultSet executequery ( String sql ) throws SQLException Przykªad: Statement stmt = con. createstatement (); ResultSet rs= stmt. executequery (" SELECT id_osoby, imie FROM osoby " ); while ( rs. next ()){ System. out. println ( rs. getint (1)+ " "+ rs. getstring (2)); 18 / 51

Przykªad - ile miast import java. sql.*; public class PokazWoj { public static void main ( String [] args ){ try { Class. forname (" com. mysql. jdbc. Driver " ); Connection con = DriverManager. getconnection ( " jdbc : mysql :// localhost / bazy_danych?" + " user = user & password = pass " ); Statement stmt = con. createstatement (); ResultSet rs= stmt. executequery ( " SELECT w. kod_woj, count ( id_miasta ) AS ile_miast " + " FROM woj w " + " LEFT JOIN miasta m ON m. kod_woj =w. kod_woj " + " GROUP BY w. kod_woj ;" ); while ( rs. next ()) System. out. println ( rs. getstring (1)+ " "+ rs. getint (2)); con. close (); catch ( Exception e ){ System. out. println (e ); 19 / 51

Interakcja z baz danych Po uzyskaniu poª czenia mo»emy wspóªdziaªa z baz danych. Interfejs JDBC Statement, CallableStatement i PreparedStatement deniuje metody i wªa±ciwo±ci umo»liwiaj ce wysyªanie polece«t-sql lub PL/SQL i odbieranie danych z bazy danych. Statement - U»ywane do ogólnego dost pu do bazy danych. Przydatne podczas korzystania ze statycznych instrukcji SQL w czasie wykonywania. Interfejs Statement nie mo»e akceptowa parametrów. PreparedStatement - do wielokrotnie wykorzystywanych instrukcji SQL. Interfejs PreparedStatement akceptuje parametry wej±ciowe w czasie wykonywania. CallableStatement - u»ywany, aby uzyska dost p do procedur przechowywanych w bazie danych. Interfejs CallableStatement mo»e równie» akceptowa parametry wej±ciowe w czasie wykonywania. 20 / 51

Obiekt klasy Statement Zanim b dzie mo»na u»y obiektu Statement do wykonania instrukcji SQL, nale»y go utworzy, korzystaj c z metody createstatement() obiektu Connection Metody boolean execute (String SQL) - SQL DDL int executeupdate (String SQL) - INSERT, UPDATE lub DELETE ResultSet executequery (String SQL) - SELECT 21 / 51

Obiekt klasy PreparedStatement Interfejs PreparedStatement rozszerza interfejs Statement, co zapewnia dodatkow funkcjonalno± z kilkoma zaletami w porównaniu ze zwykªym obiektem Statement. Wszystkie parametry w JDBC s reprezentowane przez symbol "?", znany jako marker parametrów. Trzeba poda warto±ci dla ka»dego parametru przed wykonaniem kwerendy SQL Metody setxxx () ª cz warto±ci z parametrami, gdzie XXX reprezentuje typ danych typu Java warto±ci, która ma zosta powi zana z parametrem wej±ciowym. Je±li zapomnisz dostarczy warto±ci, otrzymasz SQLException. Ka»dy znacznik parametrów jest okre±lany przez jego pozycj porz dkow. Pierwszy znacznik przedstawia pozycj 1, nast pn pozycj 2, i tak dalej. Ta metoda ró»ni si od indeksów tablic Java, która zaczynaj si od 0 Przykªad: PreparedStatement ps = con. preparestatement ( " SELECT * FROM osoby WHERE id_osoby =? " ); ps. setint (1, id_osoby ); 22 / 51

Obiekt klasy CallableStatement Istniej trzy typy parametrów: IN, OUT i INOUT. Obiekt PreparedStatement u»ywa tylko parametru IN. Obiekt CallableStatement mo»e u»ywa wszystkich trzech. Przed wykonaniem instrukcji nale»y powi za warto±ci z wszystkimi parametrami, je±li nie to otrzymamy SQLException. Je±li masz parametry IN, post puj zgodnie z tymi samymi zasadami i technikami, które dotycz obiektu PreparedStatement: u»yj metody setxxx (), która odpowiada typowi danych j zyka Java. Podczas korzystania z parametrów OUT i INOUT nale»y u»y dodatkowej metody interfejsu CallableStatement, registeroutparameter (). Metoda RegisterOutParameter () wi»e typ danych JDBC, z typem danych, od którego oczekiwana jest warto± zwracana procedury skªadowanej. Aby powi za typ OUT nalezy uzyc funckji setxxx() 23 / 51

Klasa ResultSet Obiekt ResultSet utrzymuje kursor wskazuj cy bie» cy wiersz w zestawie wynikowym. Termin "zestaw wyników" odnosi si do danych wierszy i kolumn zawartych w obiekcie ResultSet. S trzy typy metod interfejsu ResultSet metody do nawigowania metody Get - sªu» do odczytu danych metody Update - aktualizacja rekordów w bazie danych! JDBC udost pnia nast puj ce metody poª cze«do tworzenia kwerend z odpowiednim ResultSet createstatement(int RSType, int RSConcurrency) preparestatement(string SQL, int RSType, int RSConcurrency) preparecall(string sql, int RSType, int RSConcurrency) 24 / 51

Typy ResultSet Mo»liwe warto±ci RSType ResultSet.TYPE_FORWARD_ONLY - (domy±lna) Kursor mo»e porusza si tylko do przodu. ResultSet.TYPE_SCROLL_INSENSITIVE - Kursor mo»e przewija do przodu i do tyªu, a zestaw wyników nie jest wra»liwy na zmiany wprowadzone przez inne osoby do bazy danych, które wyst piªy po utworzeniu zestawu wyników. ResultSet.TYPE_SCROLL_SENSITIVE - Kursor mo»e przewija do przodu i do tyªu, a zestaw wyników jest wra»liwy na zmiany wprowadzone przez inne do bazy danych, które wyst piªy po utworzeniu zestawu wyników. Mo»liwe warto±ci RSConcurrency ResultSet.CONCUR_READ_ONLY - (domy±lna) zbiór wynikowy jest tylko do odczytu ResultSet.CONCUR_UPDATABLE - zbiór wynikowy mo»na zmienia i aktualizacje nanosi do bazy danych! 25 / 51

Metody aktualizacji ResultSet public void updatexxx(int columnindex, XXX s) - Ustawia warto± kolumny dla danego wiersza, na który wskazuje kursor public void updatexxx(string columnname, XXX s) - Ustawia warto± kolumny dla danego wiersza, na który wskazuje kursor public void updaterow() - Aktualizuje bie» cy wiersz, aktualizuj c odpowiedni wiersz w bazie danych. public void deleterow() - Usuwa bie» cy wiersz z bazy danych public void refreshrow() - Od±wie»a dane w zestawie wyników w celu odzwierciedlenia ostatnich zmian w bazie danych. public void cancelrowupdates() - Anuluje wszystkie aktualizacje wprowadzone w bie» cym wierszu. public void insertrow() - Wstawia wiersz do bazy danych. Ta metoda mo»e by wywoªana tylko wtedy, gdy kursor wskazuje na wiersz do wstawiania. 26 / 51

Przykªad - ResultSet wstawianie (1/2) import java. sql.*; public class Rsmd { public static void main ( String args []){ try { Class. forname (" com. mysql. jdbc. Driver " ); Connection con = DriverManager. getconnection ( " jdbc : mysql :// localhost / bazy_danych?" + " user = user & password = pass " ); Statement stmt = con. createstatement ( ResultSet. TYPE_SCROLL_INSENSITIVE, ResultSet. CONCUR_UPDATABLE ); String sql_query =" SELECT * FROM osoby "; ResultSet rs= stmt. executequery ( sql_query ); printrs ( rs ); rs. movetoinsertrow (); // przestawienie kursora rs. updateint (" id_osoby ",10); rs. updateint (" id_miasta ",4); rs. updatestring (" imie "," Jan " ); rs. updatestring (" nazwisko "," Kowalski " ); rs. insertrow (); // wstawienie wiersza do bazy danych printrs ( rs ); 27 / 51 con. close ();

Przykªad - ResultSet wstawianie (2/2) public class Rsmd {... private static void printrs ( ResultSet rs ) throws SQLException { rs. beforefirst (); while ( rs. next ()){ int id_osoby = rs. getint (" id_osoby " ); int id_miasta = rs. getint (" id_miasta " ); String imie = rs. getstring (" imie " ); String nazwisko = rs. getstring (" nazwisko " ); System. out. print ( id_osoby + "\t" + id_miasta +"\t" + imie + "\t"+ nazwisko ); System. out. println (); System. out. println (); 28 / 51

Przykªad - ResultSet wstawianie (wydruk) 1 1 Maciej Stodolski 2 2 Jacek Korytkowski 3 3 Mis Nieznany 4 4 Krol Neptun 5 2 Juz Niepracujacy 1 1 Maciej Stodolski 2 2 Jacek Korytkowski 3 3 Mis Nieznany 4 4 Krol Neptun 5 2 Juz Niepracujacy 10 4 Jan Kowalski 29 / 51

Metadane JDBC Interfejs ResultSetMetaData public int getcolumncount() public String getcolumnname(int index) public String getcolumntypename(int index) public String gettablename(int index) Interfejs DatabaseMetaData public String getdrivername() public String getdriverversion() public String getusername() public String getdatabaseproductname() public ResultSet gettables(string catalog, String schemapattern, String tablenamepattern, String[] types) 30 / 51

Przykªad - ResultSetMetaData import java. sql.*; public class Rsmd { public static void main ( String args []){ try { Class. forname (" com. mysql. jdbc. Driver " ); Connection con = DriverManager. getconnection ( " jdbc : mysql :// localhost / bazy_danych?" + " user = user & password = pass " ); PreparedStatement ps= con. preparestatement ( " SELECT imie, nazwisko FROM osoby " ); ResultSet rs=ps. executequery (); ResultSetMetaData rsmd =rs. getmetadata (); System. out. println (" Ilosc kolumn : "+ rsmd. getcolumncount ()); System. out. println (" Nazwa pierwszej kolumny : " + rsmd. getcolumnname (1)); System. out. println (" Typ pierwszej kolumny : " + rsmd. getcolumntypename (1)); System. out. println (" Mapowanie typu pierwszej kolumny : " + rsmd. getcolumnclassname (1)); con. close (); catch ( Exception e ){ System. out. println (e ); 31 / 51

Przykªad - ResultSetMetaData (wydruk) Ilosc kolumn : 2 Nazwa pierwszej kolumny : imie Typ pierwszej kolumny : VARCHAR Mapowanie typu pierwszej kolumny : java. lang. String 32 / 51

Przykªad - DatabaseMetaData import java. sql.*; public class Dbmd { public static void main ( String args []){ try { Class. forname (" com. mysql. jdbc. Driver " ); Connection con = DriverManager. getconnection ( " jdbc : mysql :// localhost / bazy_danych?" + " user = user & password = pass " ); DatabaseMetaData dbmd = con. getmetadata (); System. out. println (" Driver Name : "+ dbmd. getdrivername ()); System. out. println (" Driver Version : "+ dbmd. getdriverversion ()); System. out. println (" UserName : "+ dbmd. getusername ()); System. out. println (" Database Product Name : " + dbmd. getdatabaseproductname ()); System. out. println (" Database Product Version : " + dbmd. getdatabaseproductversion ()); con. close (); catch ( Exception e ){ System. out. println (e ); 33 / 51

Przykªad - DatabaseMetaData (wydruk) Driver Name : MySQL - AB JDBC Driver Driver Version : mysql - connector - java -5.0.5 ( $Date : 2007-03 -01 00:01:06 +0100 ( Thu, 01 Mar 2007) $, $Revision : 6329 $ ) UserName : user@localhost Database Product Name : MySQL Database Product Version : 5.7.17 - log 34 / 51

Java Native Interface JNI jest mechanizmem, który pozwala programowi Java na wywoªanie funkcji w programie C lub C ++. programowi C lub C ++ na wywoªania metody w programie Java Powody u»ywania metod natywnych Uzyskanie dost pu do funkcji systemu, które mo»na ªatwiej obsªugiwa w j zyku C lub C ++. Potrzebny dost p do starszego kodu, który zostaª dobrze przetestowany. Potrzebujesz wydajno±ci oferowanej przez C a której Java (jeszcze) nie ma NAJWA NIEJSZE: kod natywny nie jest przeno±ny! 35 / 51

Jak napisa aplikacj JNI? Kod Java Zadeklaruj metod u»ywaj c modykatora native, która nie ma ciaªa private native void sayhello() Upewnij si,»e biblioteka wspóªdzielona, która ma zosta utworzona pó¹niej, jest ªadowana przed wywoªaniem metody natywnej System.loadLibrary("hello"); Zwykle biblioteka jest ªadowana w bloku statycznym w klasie, która wywoªuje metod natywn. Skompiluj klas javac HelloJNI.java Stwórz nagªówek C zawieraj cy prototypy funkcji dla natywnych metod javah HelloJNI Napisz implementacj C natywnych metod wykorzystuj cych znieksztaªcone nazwy i dodatkowe parametry. Skompiluj kod C i utwórz bibliotek wspóªdzielon gcc -Wl,--add-stdcall-alias -I"%JAVA_HOME%\include" -I"%JAVA_HOME%\include\win32" -shared -o hello.dll HelloJNI.c 36 / 51

Przykªad - HelloJNI.java public class HelloJNI { static { System. loadlibrary (" hello " ); private native void sayhello (); public static void main ( String [] args ) { new HelloJNI (). sayhello (); 37 / 51

Przykªad - HelloJNI.h wygenerowany /* DO NOT EDIT THIS FILE - it is machine generated */ # include <jni.h> /* Header for class HelloJNI */ # ifndef _Included_HelloJNI # define _Included_HelloJNI # ifdef cplusplus extern "C" { # endif /* * Class : HelloJNI * Method : sayhello * Signature : () V */ JNIEXPORT void JNICALL Java_HelloJNI_sayHello ( JNIEnv *, jobject ); # ifdef cplusplus # endif # endif 38 / 51

Przykªad - HelloJNI.c implementacja # include <jni.h> # include <stdio.h> # include " HelloJNI.h" JNIEXPORT void JNICALL Java_HelloJNI_sayHello ( JNIEnv * env, jobject thisobj ) { printf (" Hello World!\ n" ); return ; 39 / 51

Typy w JNI JNI deniuje wiele typów JNI w systemie natywnym, które odpowiadaj typom Java Prymitywy jint, jbyte, jshort, jlong, joat, jdouble, jchar, jboolean odpowiadaj typom int, byte, short, long, oat, double, char i boolean Typy referencji jobject dla java.lang.object jclass dla java.lang.class. jstring dla java.lang.string. jthrowable dla java.lang.throwable. jarray dla tablic Java. Jest 8 tablic z typami prymitywnymi i 1 dla obiektów: intarray, jbytearray, jshortarray, jlongarray, joatarray, jdoublearray, jchararray, jbooleanarray i jobjectarray Funkcje natywne odbieraj argumenty w powy»szych typach JNI i zwracaj warto± typu JNI 40 / 51

Programy natywne Programy natywne musza dokonywa konwersji z typów JNI na swój wªasny i podobnie zwracaj c wynik Typowe dziaªanie funkcji natywnej Odbierz argumenty w typie JNI (przekazany przez program Java). Aby uzyska odniesienie do typu JNI, przekonwertuj lub skopiuj argumenty do lokalnych typów macierzystych, np. Jstring do ªa«cucha znaków C, jintarray do int[], itd. Prymitywne typy JNI takie jak jint i jdouble nie wymagaj konwersji i mog by obsªugiwane bezpo±rednio. Wykonaj operacje u»ywaj c lokalnych typów. Utwórz zwracany obiekt w typie JNI i skopiuj wynik do zwracanego obiektu. Powrót z funkcji. Najbardziej myl ce i wymagaj ce zadanie w programowaniu JNI polega na konwersji (lub przeksztaªceniu) pomi dzy typami odniesienia JNI (np. jstring, jobject, jintarray, jobjectarray) i typami natywnymi (C-string, int []). Interfejs JNI zapewnia jednak wiele funkcji do konwersji. 41 / 51

Przykªad - TestJNIPrimitive.java public class TestJNIPrimitive { static { System. loadlibrary (" TestJNI " ); private native double average ( int n1, int n2 ); public static void main ( String args []) { System. out. println ("W Javie, ±rednia = " + new TestJNIPrimitive (). average (3, 2)); 42 / 51

Przykªad - TestJNIPrimitive.h wygenerowany /* DO NOT EDIT THIS FILE - it is machine generated */ # include <jni.h> /* Header for class TestJNIPrimitive */ # ifndef _Included_TestJNIPrimitive # define _Included_TestJNIPrimitive # ifdef cplusplus extern "C" { # endif /* * Class : TestJNIPrimitive * Method : average * Signature : ( II ) D */ JNIEXPORT jdouble JNICALL Java_TestJNIPrimitive_average ( JNIEnv *, jobject, jint, jint ); # ifdef cplusplus # endif # endif 43 / 51

Przykªad - TestJNIPrimitive.c implementacja # include <jni.h> # include <stdio.h> # include " TestJNIPrimitive. h" JNIEXPORT jdouble JNICALL Java_TestJNIPrimitive_average ( JNIEnv * env, jobject thisobj, jint n1, jint n2 ) { jdouble result ; printf ("W C, liczby to %d i %d\n", n1, n2 ); result = (( jdouble ) n1 + n2 ) / 2.0; return result ; gcc -Wl,-- add - stdcall - alias -I"% JAVA_HOME %\ include " -I"% JAVA_HOME %\ include \ win32 " - shared -o TestJNI. dll TestJNIPrimiti 44 / 51

Przekazywanie typów zªo»onych (1/2) JNI zdeniowaª typ jstring do reprezentowania obiektu Java String. Ostatni argument (typu JNI typu jstring) to ci g znaków Java przekazany do programu C. Typ zwrotny jest równie» jstring. Przekazywanie obiektu String jest trudniejsze, bo ci g znaków w C jest reprezentowany przez tablic char* rodowisko JNI (dost pne za po±rednictwem argumentu JNIEnv *) udost pnia funkcje konwersji: const char* GetStringUTFChars(JNIEnv*, jstring, jboolean*) jstring NewStringUTF(JNIEnv*, char*) 45 / 51

Przekazywanie typów zªo»onych (2/2) Podobne funkcje istniej dla konwertowania tablic jint* GetIntArrayElements(JNIEnv *env, jintarray a, jboolean *iscopy) jsize GetArrayLength(JNIEnv *env, jintarray a) jintarray NewIntArray(JNIEnv *env, jsize len) SetIntArrayRegion(JNIEnv *env, jintarray a, jsize start, jsize len, const jint *buf) 46 / 51

Przykªad - TestJNIPrimitiveArray.java public class TestJNIPrimitiveArray { static { System. loadlibrary (" TestJNIa " ); private native double [] sumandaverage ( int [] numbers ); public static void main ( String args []) { int [] numbers = {22, 33, 33; double [] results = new TestJNIPrimitiveArray (). sumandaverage ( numb System. out. println ("W Java, suma = " + results [0]); System. out. println ("W Java, srednia = " + results [1]); 47 / 51

Przykªad - TestJNIPrimitiveArray.h wygenerowany /* DO NOT EDIT THIS FILE - it is machine generated */ # include <jni.h> /* Header for class TestJNIPrimitiveArray */ # ifndef _Included_TestJNIPrimitiveArray # define _Included_TestJNIPrimitiveArray # ifdef cplusplus extern "C" { # endif /* * Class : TestJNIPrimitiveArray * Method : sumandaverage * Signature : ([ I )[ D */ JNIEXPORT jdoublearray JNICALL Java_TestJNIPrimitiveArray_sumAndAverage ( JNIEnv *, jobject, jintarray ); # ifdef cplusplus # endif 48 / 51 # endif

Przykªad - TestJNIPrimitiveArray.c implementacja (1/2) # include <jni.h> # include <stdio.h> # include " TestJNIPrimitiveArray. h" JNIEXPORT jdoublearray JNICALL Java_TestJNIPrimitiveArray_sumAndAverage ( JNIEnv * env, jobject thisobj, jintarray injniarray ) { jint * incarray = (* env )-> GetIntArrayElements ( env, injniarray, NULL ); if ( NULL == incarray ) return NULL ; jsize length = (* env )- > GetArrayLength ( env, injniarray ); jint sum = 0; int i; for ( i = 0; i < length ; i ++) { sum += incarray [ i ]; jdouble average = ( jdouble ) sum / length ; (* env )- > ReleaseIntArrayElements ( env, injniarray, incarray, 0); 49 / 51...

Przykªad - TestJNIPrimitiveArray.c implementacja (1/2) JNIEXPORT jdoublearray JNICALL Java_TestJNIPrimitiveArray_sumAndAverage ( JNIEnv * env, jobject thisobj, jintarray injniarray ) {... jdouble outcarray [] = { sum, average ; jdoublearray outjniarray = (* env )- > NewDoubleArray ( env, 2); if ( NULL == outjniarray ) return NULL ; (* env )- > SetDoubleArrayRegion ( env, outjniarray, 0, 2, outcarray ); return outjniarray ; 50 / 51

51 / 51 Pytania?