Techniki Zaawansowane
8 godz. 35 min · Java · Full-stack i Programowanie
Rafał SolarskiW poczatkowych lekcjach przyjrzymy sie pokladowi, na jakim bedziemy uruchamiali nasze programy. Wykorzystamy VisualVM do podgladania parametrów JVM. Zobaczymy równiez jakie zasoby sa tam dostepne oraz dowiesz sie jak monitorowac to, czy dobrze z nich korzystamy. Opowiemy Ci tez miedzy innymi o tym, jak zrobic heap i thread dump, oraz jak wlaczyc logi GC.
Kolejne lekcje kursu zostaly poswiecone wyrazeniom regularnym. Wyrazenia regularne mozemy wykorzystac nie tylko do walidacji danych wprowadzania przez uzytkownika, ale równiez do dzielenia tekstu oraz wyluskiwania wystapien wzorców w duzym tekscie. W tym rozdziale dowiemy sie miedzy innymi tego, jak mozemy wykorzystac ten potencjal z poziomu Javy.
Dzieki typom generycznym jestesmy w stanie osiagnac bezpieczenstwo typów w trakcie kompilacji przy zachowaniu elastycznosci pisanego kodu. W nastepnym rozdziale kursu przyjrzymy sie temu, jak mozemy je wykorzystac, oraz w jaki sposób czasami nalezy z tego bezpieczenstwa zrezygnowac.
Interfejsy funkcyjne to sposób na przeniesienie odrobiny swiata programowania funkcyjnego do Javy. Gdy polaczymy je z wyrazeniami lambda oraz API strumieni pozwola nam pisac te sama logike w duzo bardziej przejrzysty sposób.
Kolekcje, czyli listy, mapy, zbiory i kolejki to jedne z najczesciej wykorzystywanych klas w codziennej pracy. To jak dobrze poznamy ich mozliwosci ma ogromny wplyw na to, w jaki sposób bedziemy podchodzili do rozwiazywania wyzwan na naszej drodze.
System plików to zasób bez którego ciezko sobie poradzic. Pozwalaja nam na dostarczanie konfiguracji, danych wejsciowych i wyjsciowych, a przez to równiez integrowanie ze soba calych systemów.W tym rozdziale nauczymy sie korzystac z tych dobrodziejstw w bezpieczny sposób wykorzystujac m.in. IO Streams.
Trzymanie daty w String to niekoniecznie najwygodniejszy sposób. Juz od pewnego czasu Java dysponuje bardzo wygodnym Date&Time API - zobaczymy, co mozemy w nim znalezc.
Wielowatkowosc nie jest prosta... i dlugo tak jeszcze pozostanie. Nawet jesli korzystamy z frameworków, które próbuja ja przed nami ukryc, to ciagle musimy byc swiadomi problemów jakie sie z nia wiaza. W tym rozdziale poznamy glówne problemy na jakie mozna natrafic programujac wielowatkowo w Javie. Poznamy równiez klasy, które zdecydowanie pomoga nam zapanowac nad ta zlozonoscia.
JDBC to najbardziej podstawowy sposób laczenia sie z baza SQL z poziomu Javy. W wielu systemach/aplikacjach stosuje sie rozwiazania ORM takie jak JPA/Hibernate. Mimo wszystko warto wiedziec jak to pod spodem dziala oraz umiec poradzic sobie w aplikacjach, gdzie wybrano bardziej "lekkie" podejscie niz Hibernate.
Na koniec kursu wykorzystamy zdobyta wiedze, aby stworzyc prosta aplikacje pozwalajaca na przechowywanie danych o wydatkach. Po stworzeniu coreu aplikacji, mozesz spróbowac uzupelnic go za pomoca GUI.
Ten kurs stworzony zostal przede wszystkim z mysla o osobach, które juz poznaly podstawy jezyka, takie jak zmienne, mechanizmy kontroli wykonania, klasy, typy generyczne.Jezeli chcesz poczuc sie swobodnie nie tylko jesli chodzi o mechanizmy jezyka, ale równiez pod wzgledem znajomosci standardowej biblioteki Javy - to kurs w sam raz dla Ciebie. Materialy beda przydatne dla studentów, którzy znaja juz podstawowa skladnie Javy; programistów Javy chcacych poszerzyc lub uporzadkowac swoja wiedze; programistów innych jezyków, którzy chca poznac inny stack technologiczny.
Teraz kiedy mamy już masz driver na class path możemy zacząć
pracę z bazą danych jeżeli nie wykorzystujemy żadnej biblioteki do połączeń
z bazą danych i do pracy na niej tylko pracujemy z takim czystym
jdbc to punktem wyjściowym dla nas będzie connection
aby dostać to connection musimy wywołać metodę getconnection
na driver manager get connection jako parametry otrzymuje
url lub może też otrzymać w postaci takiej plain tekstu
usera oraz hasło lub mapę propertiesów nam wystarczy na razie ta
wersja z samym url w naszym przypadku czyli kiedy używamy
sqlite ten url będzie wyglądał w ten sposób w innych bazach i innych driverach
home będzie wyglądał trochę inaczej w przypadku postgresa będzie inaczej wyglądał między
innymi tutaj mamy podany path do plików w którym ma być utworzona
ta baza danych tak z tego względu że sqlite jest bazą plikową w przypadku
na przykład postgresa czy innych baz danych będziemy mieli tutaj na przykład hosta
port pod który mamy się podłączyć do bazy danych tak okej metoda
get connection rzuca wyjątkiem który na razie sobie przerzucimy gdzieś na zewnątrz
żeby się nim nie przejmować okej teraz kilka słów o
connection to je utworzyliśmy ono connection też może
być zamknięte to jak najbardziej powinniśmy robić w momencie kiedy kończymy
aplikację ale niekoniecznie kiedy kończymy
pracę z bazą danych to znaczy powiedzmy jeżeli mamy jakąś taki scenariusz że
na przykład używamy bazy później na chwilę przestajemy tak
aplikacja cały czas działa i później znowu chcemy jej użyć to
może być bardziej sensowne reużywanie tego connection które
już było nawiązane kiedyś takich aplikacjach webowych na przykład napisanych
w springu z których korzysta wielu
użytkowników tak tam jest wiele requestów które powiedzmy mogą też wpadać
równolegle to tam wykorzystuje się coś co nazywa się
connections pool i jest to jest to powiedzmy upraszczając taka abstrakcja
którą możesz poprosić po prostu żeby dał ci jakieś connection które
nie jest obecnie używane jeżeli nie ma takiego connection to albo je stworzyć albo
zaczekać aż będzie jakieś wolne tak tutaj w tym kursie nie będziemy tego używali ponieważ
projekt który chcemy zbudować nie wymaga tego z tego względu że cykl
życia tej aplikacji jest ograniczony na przykład do jednego wywołania komendy
konsolowych tak więc to connection nie ma gdzie przetrwać i też ze względu że nie
ma wielu użytkowników na raz bo jeden tej aplikacji tak
jakby nie ma takiego dużego zysku z tego że jest wiele tych connections okej chodźmy
dalej z connection możemy utworzyć sobie statement tak i
ten statement to jest taka mała nie najmniejsza ale mała
jednostka pracy z bazą danych powiedzmy nie jest
to transakcja tak o tym czy są to transakcje to jeszcze powiem jest to coś większego statementy
możemy reużywać też i teraz zanim zaczniemy robić coś dalej to ze
względu że nie będziemy używać tego connection i tego statementu to statement może
reużyjemy tak ale tutaj w tym bloku chcemy coś
zrobić później wyjść z aplikacji to opakujmy to w try-with-resources oba
te interfejsy implementują autocloseable więc jak najbardziej możemy to zrobić i
przypominam że jeżeli chcemy zrobić try with resources z dwoma jakimiś obiektami do zamknięcia
to dajemy po prostu średnik tutaj i teraz w środku możemy pracować dobrze
weźmy tego statement i na nim możemy zrobić coś jak execute
update jest dużo metod ale między innymi ta jedna i
tutaj możemy podawać sql już w stringu tak to co
teraz byśmy chcieli zrobić to jest stworzenie tabeli tutaj napisałem takiego sqla
który tworzy nam tabelę employees i ta tabela ma powiedzmy
dwie kolumny tak jedno jest automatycznie inkrementowane i jest primary
key a drugi jest po prostu jakimś stringiem tak pierwszy to jest interger
tabela się tak nazywa to jest taki klasyczny przykład do uczenia
się to nam jak to odpalimy to nam się uruchomi okej nic
się powiedzmy nic nam się nie wyprintowało bo nie było co ale zauważymy
że pojawiła nam się teraz ta baza którą wskazaliśmy w tym url tak
pod tym pathem i teraz jeżeli uruchomimy ten program jeszcze raz dostaniemy
exeption z tego względu że próbujemy jeszcze raz utworzyć te tabele poza
tym że w execute update możemy wywoływać jakiegoś ddl który utworzy
nam tabelkę to możemy jeszcze wywołać ddl'a który jeżeli ona istnieje
to nam ją po prostu zdropuje czyli usunie o w ten sposób możemy
też powiedzmy zmienić tego ddl'a w ten sposób aby nie tworzył nowej
tabeli jeżeli stara istnieje ale zależy nam na tym żeby za każdym razem
przy każdym uruchomieniu mieć nowy stan w tej bazie dobra zacznijmy coś dodawać
do tej bazy zróbmy jakiś ty tak dodajmy jakiś wierszyk
do kolumny do do tabeli employees na przykład dodajmy sobie pracownika
john tak tak samo używamy execute update no i teraz warto
by było go w ogóle jakoś wyświetlić w celu wyciągnięcia tych danych które są w tej
tabeli możemy sobie wykorzystać select tak i tutaj już
się używa execute query tak execute update zwraca inta
który był liczbą zmienianych wierszy czy tam usuniętych do danych i tak
dalej a execute query zwraca coś to się nazywa result set
i teraz żeby coś sobie wyciągnąć tak w tym
result secie jest pewnego rodzaju taki powiedzmy iterator do
danych które zostały wyciągnięte może kursor okej
i tutaj możemy na nim sobie zrobić next robimy to z tego względu na
początek jest tak jakby na indeksie minus 1 w stosunku
do tego co jest wczytywane więc najpierw sobie powinniśmy zrobić
to next a później możemy sobie wyciągnąć poszczególne elementy z tego z
tego query tak możemy coś zrobić get
i tutaj long tak czyli naszego powiedzmy nasze
id i podaję tutaj nazwę i on nam teraz napisze tak jedynka
możemy też sobie wypisać tego name tak tutaj tylko
będzie getstring okej tak jest 1 id
i john name i teraz jak dodamy sobie więcej tych wpisów to
teraz jeżeli chcemy wypisać wszystko co tutaj jest
to za każdym razem żeby się przesunąć musi wywołać to next tak i powiedzmy pod
rs tych get long get string będą się pojawiały dane z kolejnego wiersza no
i oczywiście możemy to opakować w while i to będzie ciekawie wyglądało
tak tutaj wypisaliśmy to next
też zwraca to czy coś jest jeszcze tak więc
możemy go spokojnie użyć w while'u jeszcze możemy sobie tutaj jakoś ładniej
sformatować na przykład w ten sposób tak dobra co
możemy robić jeszcze z tym powiedzmy okej umiemy już dropa
robić tak najważniejsze możemy stworzyć tabelę zainsertować
i wyciągnąć jakieś wartości i teraz możemy chcieć jeszcze coś zapdejtować
lub usunąć na przykład i okej zanim jeszcze zaczniemy usuwać i apdejtować
to sobie wyekstraktujmy to gdzieś na zewnątrz zróbmy niech to będzie metoda
print employees okej ona może przyjmować ten statement on
po prostu do niego reużywał tak i tutaj dodałem jeszcze nazwę i null
i na końcu żeby było widać gdzie się zaczyna i kończy tabela teraz już jeżeli chcemy usunąć
coś z tej tabeli to po prostu wołamy execute update
i tutaj dajemy delete from tak i nazwa tabeli no i załóżmy że chcemy
usunąć powiedzmy johna z listy jeszcze sobie wyprintujemy jak
wyglądała tabela przed i po no i widzimy że został usunięty z
listy tak w execute update możemy też wywołać co ciekawe update
acha no i tutaj możemy powiedzmy dodać zmienić
name tak na przykład jack na jack junior
tak teraz jak to odpalimy to oczywiście najpierw usuniemy johna a później
zmienimy właśnie jackowi imię okej teraz powiedzmy że jeszcze chcielibyśmy
zobaczyć na przykład ile osób usunięto w wyniku tej operacji a
ile z apdejtowano w wyniku tej drugiej tak akurat execute update
zwraca po prostu integer który jest liczbą
zmienionych wierszy tak w przypadku usunięć to będzie liczba usunięć bo w
przypadku update będzie aktualizacji tak i możemy to spokojnie tutaj wyprintować
to jak zobaczymy jak odpalimy zostało 1
usunięty 1 zaktualizowany jeszcze możemy usunąć na przykład
ten warunek stąd żeby po prostu zmienić imię wszystkim i
zobaczymy czy update się zmieni na 2 zmienił się okej wykorzystując
te kilka prostych metod jesteś w stanie zrobić bardzo dużo na bazie danych zauważ
jedną rzecz że jeżeli tutaj piszemy jakiegoś sql'a to
możemy tutaj wykorzystywać rzeczy które są powiedzmy specific
dla danej bazy danych na przykład to auto increment to
jest powiedzmy rzecz funkcjonalność która jest tak jakby
specyficzna dla sqlite i tak ona oczywiście istnieje w innych bazach
danych ale tutaj pisząc ją w tym sqlu ja
się trochę się fiksuje na to że to musi być sqlite i tak są rozwiązania
do pracy z bazami danych na przykład jak jpa czy
jego implementacja między innymi hibernate która jest w stanie to
trochę naginać i powiedzmy być niezależny od bazy danych
która jest pod spodem okej na te lekcje to wszystko dzięki wielkie i do
zobaczenia