Połączenie z bazą danych



Podobne dokumenty
Aplikacje Internetowe

Metody dostępu do danych

JDBC (Java Database Connectivity vit )

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

JAVA I BAZY DANYCH. MATERIAŁY:

Bazy danych wykład dwunasty

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

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

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

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

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

Java i jej wykorzystanie do tworzenia dynamicznych aplikacji Webowych

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

Aplikacje bazodanowe. dr inż. Arkadiusz Mirakowski

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

Wprowadzenie do JDBC z wykorzystaniem bazy H2

przygotował: Bazy danych Paweł Kasprowski Wersja 2006Z

Java Database Connectivity

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

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

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

Aplikacje Internetowe

Relacyjny model danych

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

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

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

Technologia JDBC w praktyce

Java Database Connectivity

Programowanie w języku Java WYKŁAD

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

Dostęp do baz danych przy wykorzystaniu interfejsu JDBC

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

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

Kurs programowania aplikacji bazodanowych

Plan wykładu. 1. Zaawansowane możliwości JDBC: rodzaje obiektów ResultSet, dodatkowe możliwości obiektów ResultSet, zapytania prekompilowane,

Programowanie Obiektowe Java

Programowanie Obiektowe Java

Java i bazy danych. 1. JDBC podstawy, transakcje. 2. Mapowanie relacyjno obiektowe. Hibernate, przykład.

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych

Bazy danych. Dr inż. Paweł Kasprowski

Bazy danych 7. SQL podstawy

Java rozszerzenie. dr. A. Dawid

Języki programowania wysokiego poziomu. PHP cz.4. Bazy danych

1) Przygotowanie środowiska pracy.

Wzorce logiki dziedziny

Instytut Sterowania i Systemów Informatycznych Uniwersytet Zielonogórski. Zaawansowane Systemy Decyzyjne. Laboratorium

Wprowadzenie do BD Operacje na bazie i tabelach Co poza zapytaniami? Algebra relacji. Bazy Danych i Systemy informacyjne Wykład 2.

Odnawialne Źródła Energii I rok. Tutorial PostgreSQL

Bartosz Jachnik - Kino

Ćwiczenie rozpoczniemy od wprowadzenia do laboratorium, na którym przedstawimy architekturę JDBC, oraz opiszemy jakie wymagania naleŝy spełnić, aby

Bazy danych 5. Samozłaczenie SQL podstawy

Programowanie w języku Java

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

Bazy Danych i Usługi Sieciowe

Wzorce dystrybucji i wspólbieżności autonomicznej

Bazy danych. Bazy danych. Podstawy języka SQL. Dr inż. Paweł Kasprowski.

Blaski i cienie wyzwalaczy w relacyjnych bazach danych. Mgr inż. Andrzej Ptasznik

Podejście obiektowe do relacyjnych baz danych Hibernate.

Połączenia między bazami danych i programem w języku Java część 2

Bazy danych i usługi sieciowe

DECLARE VARIABLE zmienna1 typ danych; BEGIN

Aplikacje WWW - laboratorium

Ref. 7 - Język SQL - polecenia DDL i DML

Java Programowanie Obiektowe Ćwiczenie 1- wprowadzenie

Dostęp do DBMS w Prologu za pomocą API ODBC

Język SQL, zajęcia nr 1

Paweł Cieśla. Dokumentacja projektu

Programowanie MSQL. show databases; - pokazanie jakie bazy danych są dostępne na koncie

E.14 Bazy Danych cz. 18 SQL Funkcje, procedury składowane i wyzwalacze

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

Projektowanie systemów baz danych

Bazy Danych i Systemy informacyjne Wykład 5. Piotr Syga

Tuning SQL Server dla serwerów WWW

METODY PROGRAMOWANIA

3 Przygotowali: mgr inż. Barbara Łukawska, mgr inż. Maciej Lasota

Aby uruchomić program klienta i połączyć się z serwerem, należy komendę:

Wykład 8. SQL praca z tabelami 5

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

Języki skryptowe - PHP. PHP i bazy danych. Paweł Kasprowski. pawel@kasprowski.pl. vl07

strukturalny język zapytań używany do tworzenia i modyfikowania baz danych oraz do umieszczania i pobierania danych z baz danych

Oracle PL/SQL. Paweł Rajba.

prepared by: Programowanie WWW Model-View-Controller

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

Oracle PL/SQL. Paweł Rajba.

Ćwiczenia laboratoryjne nr 11 Bazy danych i SQL.

Wyzwalacz - procedura wyzwalana, składowana fizycznie w bazie, uruchamiana automatycznie po nastąpieniu określonego w definicji zdarzenia

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

Pakiety podprogramów Dynamiczny SQL

Projektowanie bazy danych. Jarosław Kuchta Projektowanie Aplikacji Internetowych

Bazy danych dla producenta mebli tapicerowanych. Bartosz Janiak Marcin Sikora Wrocław r.

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

Bazy danych 4. SQL podstawy. P. F. Góra

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

Bazy danych. Dr inż. Paweł Kasprowski

Wprowadzenie. Rozdział 23 PDO. Podstawowe kroki aplikacji. Źródło danych

Wykład 4: Klasy i Metody

Jerzy Nawrocki, Wprowadzenie do informatyki

Programowanie w SQL procedury i funkcje. UWAGA: Proszę nie zapominać o prefiksowaniu nazw obiektów ciągiem [OLIMP\{nr indeksu}] Funkcje użytkownika

15. Funkcje i procedury składowane PL/SQL

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

Transkrypt:

Połączenie z bazą danych ODBC i JDBC - przykłady w języku Java

Standard ODBC Stworzony przez Microsoft Dostępny w Windows (są także bibliotek Linux'owe) Pozwala na dostęp do źródeł danych Programowanie z użyciem ODBC API Konieczność posiadania sterownika ODBC dla używanego źródła danych

ODBC - schemat przygotował: pawel@kasprowski.pl

Zalety ODBC Otwarty dostęp do źródeł danych Takie samo API niezależnie od źródła Łatwość programowania Przykładowa aplikacja: Query Tool (QTODBC)

Język Java - JDBC JDBC API pozwala na: Ustalenie połączenia z bazą Wysyłanie poleceń SQL Przetwarzanie rezultatów

Sterowniki JDBC 1) JDBC-ODBC Bridge 2) Native-API partly-java driver 3) Net-protocol all-java driver 4) Native-protocol all-java driver

Sterowniki JDBC (1,2) JDBC-ODBC Bridge (Typ 1) Partly Java Native-API (Typ 2)

Sterowniki JDBC (3,4) Native protocol (Typ 4) Net protocol (Typ 3)

Główne klasy i interfejsy JDBC Driver DriverManager Connection Statement, PreparedStatement, CallableStatement ResultSet DatabaseMetaData ResultSetMetaData Types SQLException SQLWarning

Sposób działania JDBC Załaduj sterownik Class.forName( DriverClassName); Połącz się ze źródłem danych Connection con = DriverManager.getConnection( URL, Username, Password ); Stwórz polecenie Statement stmt = con.createstatement(); Zapytaj bazę danych ResultSet result = stmt.executequery("select * FROM table1");

Ładowanie sterownika Statyczne: import drivername; Dynamiczne: Class.forName( drivername ); Na przykład: sun.jdbc.odbc.jdbcodbcdriver lub com.microsoft.jdbc.sqlserver.sqlserverdriver

Połączenie ze źródłem danych Connection con = DriverManager.getConnection ( URL, Username, Password ); URL = jdbc:<subprotocol>:<subname> <subname> = //host:port/dbname;params Na przykład: jdbc:odbc:uran lub jdbc:microsoft:sqlserver://db.psl.pl:1433;user=lab;password=lab

Właściwości połączenia Tworzenie Statement, PreparedStatement i CallableStatement (dla procedur storowanych). Odczytywanie obiektów DatabaseMetadata Kontrola nad transakcjami za pomocą metod commit() i rollback(). Ustawianie poziomów izolacji dla transakcji.

Tworzenie polecenia (Statement) Statement stmt = con.createstatement(); executequery() uruchamia polecenia SQL zwracające listę wierszy jako ResultSet. executeupdate() uruchamia polecenia SQL modyfikujące dane lub strukturę bazy execute() uruchamia polecenie SQL dowolnego typu

ResultSet ResultSet rs=stmt.executequery( select * from table ); dostęp do jednego wiersza danych jednocześnie next() przejście do następnego wiersza getxxx(i) wartość i-tej kolumny Najczęściej: getint(), getstring(), getdate(), getdouble()... Informacje o strukturze danych (nazwy i typy kolumn) - MetaData

Metody do odczytywania danych różnych typów SQL Type BIGINT BINARY BIT CHAR DATE DECIMAL DOUBLE FLOAT INTEGER Java Method getlong() getbytes() getboolean() getstring() getdate() getbigdecimal() getdouble() getdouble() getint() LONGVARBINARY getbytes() LONGVARCHAR NUMERIC OTHER REAL SMALLINT TIME TIMESTAMP TINYINT VARBINARY VARCHAR getstring() getbigdecimal() getobject() getfloat() getshort() gettime() gettimestamp() getbyte() getbytes() getstring()

Pierwszy przykład JDBC import java.sql.*; class DBExample1{ public static void main(string[] args){ try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection con = DriverManager.getConnection("jdbc:odbc:uran","lab","lab"); Statement stmt = con.createstatement(); ResultSet rs = stmt.executequery("select * from pracownicy"); while(rs.next()) System.out.print(rs.getString(1)+" "+rs.getstring(4)+"\n"); con.close(); } catch(sqlexception ec) { System.err.println(ec.getMessage()); } catch(classnotfoundexception ex) {System.err.println("Cannot find driver.");} } } DBExample1.java

Uzycie ResultSet MetaData Wyświetlenie nagłówków kolumn ResultSet rs = stmt.executequery("select * from pracownicy"); int noofcols = rs.getmetadata().getcolumncount(); for (int i=1;i<=noofcols;i++) System.out.print(rs.getMetaData().getColumnName(i)+ );

Użycie ResultSet MetaData Wyświetlenie nagłówków kolumn ResultSet rs = stmt.executequery("select * from pracownicy"); int noofcols = rs.getmetadata().getcolumncount(); String colnames=""; for (int i=1;i<=noofcols;i++) colnames = colnames+' '+rs.getmetadata().getcolumnname(i); System.out.println(colNames);

Parametryzacja kolumn Wyświetlenie wszystkich zwróconych kolumn while(rs.next()) { for (int i=1;i<=noofcols;i++) System.out.print(rs.getString(i)+ ); System.out.print( \n ); }

Parametryzacja kolumn Wyświetlenie wszystkich zwróconych kolumn while(rs.next()) { String row=""; for (int i=1;i<=noofcols;i++) row = row + ' ' + rs.getstring(i); System.out.println(row); } DBExample2.java

executeupdate int rows=stmt.executeupdate( update table set field=3 where id=5 ); Dla poleceń DML i DDL Zwraca ilość przetworzonych wierszy Zwraca zero dla poleceń DDL (CREATE TABLE itp.)

PreparedStatement PreparedStatement pstmt = con.preparestatement( select * from table1 where id=? and field like? ) Pre-kompilacja zapytań po stronie serwera Przyspiesza działanie podobnych zapytań Czytelniejszy kod Pozwala na użycie parametrów( marker? ) setxxx() ustawienie wartości parametru

PreparedStatement // definicja polecenia PreparedStatement pstmt = con.preparestatement( select * from table1 where id<? and field like? ); // ustawienie parametrów pstmt.setint(1,20); pstmt.setstring(2, value ); // uruchomienie Rs = pstmt.executequery();

SQLException import java.sql.*; class DBExample1{ public static void main(string[] args){ try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection con = DriverManager.getConnection("jdbc:odbc:uran","lab","lab"); Statement stmt = con.createstatement(); ResultSet rs = stmt.executequery("select * from pracownicy"); while(rs.next()) System.out.print(rs.getString(1)+" "+rs.getstring(4)+"\n"); con.close(); } catch(sqlexception ec) { System.err.println(ec.getMessage()); } catch(classnotfoundexception ex) {System.err.println("Cannot find driver.");} } }

SQLException import java.sql.*; class DBExample1{ public static void main(string[] args){ try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); }catch(classnotfoundexception ex) {System.err.println("Cannot find driver.");} try{ Connection con = DriverManager.getConnection("jdbc:odbc:uran","lab","lab"); Statement stmt = con.createstatement(); ResultSet rs = stmt.executequery("select * from pracownicy"); while(rs.next()) System.out.print(rs.getString(1)+" "+rs.getstring(4)+"\n"); con.close(); }catch(sqlexception ec) { System.err.println(ec.getMessage()); } } }

SQLWarning - ostrzeżenia SQL Warning sqlw = con.getwarnings(); while( sqlw!= null) {sqlw = sqlw.getnextwarning();} con.clearwarnings(); Warning coś poszło źle ale nie jest to krytyczne Tworzy się kolejka ostrzeżeń Czasami mogą być ważne Zwykle w ogóle nie istotne! Warnings.java

DatabaseMetaData DatabaseMetaData dbmd = con.getmetadata(); 150 metod! getcatalogs() bazy danych getschemas() użytkownicy gettabletypes() np. TABLE,VIEW gettables(catalog,schemap,tablep,types)

Pierwsza funkcja void showrs(resultset rs) throws SQLException { int noofcols = rs.getmetadata().getcolumncount(); String colnames=""; for (int i=1;i<=noofcols;i++) colnames = colnames + ' ' + rs.getmetadata().getcolumnname(i); System.out.println(colNames); while(rs.next()) { String row=""; for (int i=1;i<=noofcols;i++) row = row + ' ' + rs.getstring(i); System.out.println(row); } }

Wywołanie funkcji class MetaData { public static void main(string[] args) {...setting connection... ResultSet rs = stmt.executequery("select * from tb"); showrs(rs);... closing connection... }... } BŁĄD! nie można wywoływać metod obiektu z funkcji statycznej!

Static members Class Foo{ int x;... }... Foo f1=new Foo(); Foo f2=new Foo(); f1.x=1; f2.x=2; println(f1.x+, +f2.x); Class Foo{ static int x;... }... Foo f1=new Foo(); Foo f2=new Foo(); f1.x=1; f2.x=2; println(f1.x+, +f2.x); 1,2 2,2

Właściwe wywołanie funkcji class MetaData { public static void main(string[] args) { MetaData md = new MetaData(); } MetaData() {... ResultSet rs = stmt.executequery("select * from tb"); showrs(rs);... }... }

Przykład MetaData DatabaseMetaData dbmd = con.getmetadata(); ResultSet rs; rs=dbmd.getcatalogs(); //databases System.out.println("\n------------Bazy danych--------------"); showrs(rs); rs=dbmd.getschemas(); //users System.out.println("\n------------Użytkownicy--------------"); showrs(rs); rs=dbmd.gettabletypes(); System.out.println("\n-------------Typy tabel--------------"); showrs(rs); String[] ttp={"table","view"}; rs=dbmd.gettables("labbd","%","%",ttp); System.out.println("\n---------------Tabele----------------"); showrs(rs); MetaData.java

Znajdowanie sterownika SQLServer: java -classpath ".;msbase.jar;mssqlserver.jar;msutil.jar" %1 MySQL: java -classpath ".;mysql-connector-java.jar" %1 run.bat

Transakcje Niepodzielny blok poleceń Utrzymanie spójności danych Domyślnie AutoCommit każde polecenie to osobna transakcja con.setautocommit(false) con.commit() con.rollback()

Przykład transakcji (przelew bankowy)... con.setautocommit(false); try{ int n1 = stmt.executeupdate("update accounts set amount=amount-100 where custid=75"); int n2 = stmt.executeupdate("update accounts set amount=amount+100 where custid=43"); if(n1==1 && n2==1) con.commit(); else con.rollback(); }catch(sqlexception ec) {con.rollback(); System.err.println(ec.getMessage());}...

Poziomy izolacji transakcji con.settransactionisolation(level) TRANSACTION_NONE TRANSACTION_READ_UNCOMMITTED TRANSACTION_READ_COMMITTED TRANSACTION_REPEATABLE_READ TRANSACTION_SERIALIZABLE

Wartości NULL w ResultSet Problem: getint() zwraca 0 or 1 dla wartości NULL wasnull() sprawdza ostatnią przeczytaną wartość int age = rs.getint( Age ); if(!rs.wasnull()) {System.out.println( Age: +age);} else {System.out.println( Age is unknown );}

Batch Updates - Wiele poleceń jednocześnie - Zwiększa szybkość - Mogą zostać użyte tylko polecenia zwracające int (typu executeupdate) if(databasemetadata.supportsbatchupdates()) { stmt.clearbatch(); stmt.addbatch( update tab set... ); stmt.addbatch( insert into tab... ); int[] counts = stmt.executebatch(); }

Przewijalne ResultSet y stmt = createstatement( int resultsettype, int resultsetconcurrency ) resultsettype: ResultSet.TYPE_FORWARD_ONLY ResultSet.TYPE_SCROLL_INSENSITIVE ResultSet.TYPE_SCROLL_SENSITIVE

Metody przewijania (scrolling) previous() absolute(row) relative(no_of_rows) first() last() beforefirst() afterlast() isafterlast() isbeforefirst() isfirst() islast() getrow()

Aktualizowalne ResultSet y stmt = createstatement( int resultsettype, int resultsetconcurrency ) resultsetconcurrency: ResultSet.CONCUR_READ_ONLY ResultSet.CONCUR_UPDATABLE

Aktualizacja wiersza updatexxx(column,newvalue) updaterow() cancelrowupdates()... rs.first(); rs.updatestring( name, Smith ); rs.updateint( age,44); rs.updaterow(); rs.next();...

Wstawianie nowego wiersza movetoinsertrow() insertrow() movetocurrentrow()... rs.movetoinsertrow(); rs.updatestring( name, Smith ); rs.updateint( age,44); rs.insertrow(); rs.movetocurrentrow();...

Usuwanie wiersza deleterow()... rs.first(); rs.deleterow(); rs.next();...

Problemy ze współdzieleniem danych Aktualność danych refreshrow() Spójność danych select... for update

Dodatkowy pakiet (javax.sql) DataSource interface Connection pooling Distributed Transactions Rowsets